Skip to content

Release And Deploy Azure Function #17

Release And Deploy Azure Function

Release And Deploy Azure Function #17

Workflow file for this run

name: Release And Deploy Azure Function
# Controls when the workflow will run
on:
pull_request:
types: [ closed ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
environment:
required: true
type: choice
description: Select the Environment
options:
- dev
- uat
- prod
- all
beta:
required: false
type: boolean
description: deploy beta function version on Azure
default: false
skip_release:
required: false
type: boolean
description: skip the release. Only deploy
default: false
permissions:
packages: write
contents: write
issues: write
id-token: write
actions: read
env:
REGISTRY: 'ghcr.io'
NAMESPACE: 'pagopa'
IMAGE: 'pagopa-platform-authorizer'
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
setup:
name: Setup
runs-on: ubuntu-latest
outputs:
semver: ${{ steps.get_semver.outputs.semver }}
environment: ${{ steps.get_env.outputs.environment }}
steps:
- name: pull request rejected
if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged != true
run: |
echo "❌ PR was closed without a merge"
exit 1
# Set Semvar
- run: echo "SEMVER=patch" >> $GITHUB_ENV
- if: ${{ (github.event.pull_request.merged && contains(github.event.pull_request.labels.*.name, 'breaking-change ')) }}
run: echo "SEMVER=major" >> $GITHUB_ENV
- if: ${{ inputs.environment == 'uat' }}
run: echo "SEMVER=minor" >> $GITHUB_ENV
- if: ${{ inputs.environment == 'prod' }}
run: echo "SEMVER=skip" >> $GITHUB_ENV
- if: ${{ github.ref_name != 'main' }}
run: echo "SEMVER=buildNumber" >> $GITHUB_ENV
- if: ${{ inputs.skip_release }}
run: echo "SEMVER=skip" >> $GITHUB_ENV
- id: get_semver
name: Set Output
run: echo "semver=${{env.SEMVER}}" >> $GITHUB_OUTPUT
# Set Environment
- run: echo "ENVIRNOMENT=${{ inputs.environment}}" >> $GITHUB_ENV
- if: ${{ inputs.environment == null }}
run: echo "ENVIRNOMENT=dev" >> $GITHUB_ENV
- id: get_env
name: Set Output
run: echo "environment=${{env.ENVIRNOMENT}}" >> $GITHUB_OUTPUT
release:
name: Create a New Release
runs-on: ubuntu-latest
needs: [ setup ]
outputs:
version: ${{ steps.release.outputs.version }}
steps:
- name: Make Release
id: release
uses: pagopa/github-actions-template/[email protected]
with:
semver: ${{ needs.setup.outputs.semver }}
github_token: ${{ secrets.BOT_TOKEN_GITHUB }}
beta: ${{ inputs.beta }}
skip_ci: false
build-and-push:
needs: [ setup, release ]
name: Build and Push Docker Image
runs-on: ubuntu-latest
if: ${{ inputs.semver != 'skip' }}
environment: ${{ inputs.environment }}
steps:
- name: Build and Push
id: semver
uses: pagopa/github-actions-template/[email protected]
with:
branch: ${{ github.ref_name}}
github_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ needs.release.outputs.version }}
deploy_azure_fn:
name: Deploy Azure function
environment: ${{ inputs.environment }}
needs: [ setup, release, build-and-push ]
runs-on: ubuntu-latest
if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: 'Login via Azure CLI'
uses: azure/login@v1
with:
client-id: ${{ secrets.CLIENT_ID }}
tenant-id: ${{ secrets.TENANT_ID }}
subscription-id: ${{ secrets.SUBSCRIPTION_ID }}
- name: 'Azure CLI script: start staging slot'
uses: azure/CLI@v1
if: ${{ contains(github.event.inputs.environment, 'prod') }}
env:
ENV_SHORT: ${{ (contains(github.event.inputs.environment,'prod') && 'p') }}
with:
inlineScript: |
az functionapp start --name pagopa-${{ env.ENV_SHORT }}-weu-shared-authorizer-fn --resource-group pagopa-${{ env.ENV_SHORT }}-weu-shared-rg --slot staging
- name: 'Run Azure Functions Container Action DEV|UAT: deploy on production slot'
uses: Azure/[email protected]
if: ${{ contains(github.event.inputs.environment, 'dev') || contains(github.event.inputs.environment, 'uat') }}
env:
ENV_SHORT: ${{ (contains(github.event.inputs.environment,'dev') && 'd') || (contains(github.event.inputs.environment, 'uat') && 'u') }}
TAG: ${{needs.release.outputs.version}}
with:
app-name: "pagopa-${{ env.ENV_SHORT }}-weu-shared-authorizer-fn"
image: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.IMAGE }}:${{ env.TAG }}
slot-name: production
- name: 'Run Azure Functions Container Action PROD: deploy on staging slot'
uses: Azure/[email protected]
if: ${{ contains(github.event.inputs.environment, 'prod') }}
env:
ENV_SHORT: ${{ (contains(github.event.inputs.environment,'prod') && 'p') }}
TAG: ${{needs.release.outputs.version}}
with:
app-name: "pagopa-${{ env.ENV_SHORT }}-weu-shared-authorizer-fn"
image: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.IMAGE }}:${{ env.TAG }}
slot-name: staging
- name: 'PROD Deploy Approval'
uses: trstringer/manual-approval@v1
if: ${{ contains(github.event.inputs.environment, 'prod') }}
with:
secret: ${{ secrets.BOT_TOKEN_GITHUB }}
approvers: pagopa-team-core
minimum-approvals: 1
issue-title: "Deploying ${{ env.TAG }} to prod from staging"
issue-body: "Please approve or deny the deployment of version ${{ env.TAG }}."
exclude-workflow-initiator-as-approver: false
timeout-minutes: 360
- name: 'Run Azure Functions Container Action PROD: deploy on production slot'
uses: Azure/[email protected]
if: ${{ contains(github.event.inputs.environment, 'prod') }}
env:
ENV_SHORT: ${{ (contains(github.event.inputs.environment,'prod') && 'p') }}
TAG: ${{needs.release.outputs.version}}
with:
app-name: "pagopa-${{ env.ENV_SHORT }}-weu-shared-authorizer-fn"
image: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.IMAGE }}:${{ env.TAG }}
slot-name: production
- name: 'Azure CLI script: stop staging slot'
uses: azure/CLI@v1
if: ${{ contains(github.event.inputs.environment, 'prod') }}
env:
ENV_SHORT: ${{ (contains(github.event.inputs.environment,'prod') && 'p') }}
with:
inlineScript: |
az functionapp stop --name pagopa-${{ env.ENV_SHORT }}-weu-shared-authorizer-fn --resource-group pagopa-${{ env.ENV_SHORT }}-weu-shared-rg --slot staging
- name: Azure logout
run: |
az logout
#name: Release And Deploy Azure Function
#
## Controls when the workflow will run
#on:
# pull_request:
# types: [ closed ]
#
# # Allows you to run this workflow manually from the Actions tab
# workflow_dispatch:
# inputs:
# environment:
# required: true
# type: choice
# description: Select the Environment
# options:
# - dev
# - uat
# - prod
# - all
# beta:
# required: false
# type: boolean
# description: deploy beta function version on Azure
# default: false
# skip_release:
# required: false
# type: boolean
# description: skip the release. Only deploy
# default: false
#
#permissions:
# packages: write
# contents: write
# issues: write
# id-token: write
# actions: read
#
## env:
## ENV_SHORT: ${{ (contains(github.event.inputs.environment,'dev') && 'd') || (contains(github.event.inputs.environment, 'uat') && 'u') || (contains(github.event.inputs.environment,'prod') && 'p') }}
#
## A workflow run is made up of one or more jobs that can run sequentially or in parallel
#jobs:
# setup:
# name: Setup
# runs-on: ubuntu-latest
# outputs:
# semver: ${{ steps.get_semver.outputs.semver }}
# environment: ${{ steps.get_env.outputs.environment }}
# steps:
# - name: pull request rejected
# if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged != true
# run: |
# echo "❌ PR was closed without a merge"
# exit 1
#
# # Set Semvar
# - run: echo "SEMVER=patch" >> $GITHUB_ENV
#
# - if: ${{ (github.event.pull_request.merged && contains(github.event.pull_request.labels.*.name, 'breaking-change ')) }}
# run: echo "SEMVER=major" >> $GITHUB_ENV
#
# - if: ${{ inputs.environment == 'uat' }}
# run: echo "SEMVER=minor" >> $GITHUB_ENV
#
# - if: ${{ inputs.environment == 'prod' }}
# run: echo "SEMVER=skip" >> $GITHUB_ENV
#
# - if: ${{ github.ref_name != 'main' }}
# run: echo "SEMVER=buildNumber" >> $GITHUB_ENV
#
# - if: ${{ inputs.skip_release }}
# run: echo "SEMVER=skip" >> $GITHUB_ENV
#
# - id: get_semver
# name: Set Output
# run: echo "semver=${{env.SEMVER}}" >> $GITHUB_OUTPUT
#
# # Set Environment
# - run: echo "ENVIRNOMENT=${{ inputs.environment}}" >> $GITHUB_ENV
#
# - if: ${{ inputs.environment == null }}
# run: echo "ENVIRNOMENT=dev" >> $GITHUB_ENV
#
# - id: get_env
# name: Set Output
# run: echo "environment=${{env.ENVIRNOMENT}}" >> $GITHUB_OUTPUT
#
# release:
# name: Create a New Release
# runs-on: ubuntu-latest
# needs: [setup]
# outputs:
# version: ${{ steps.release.outputs.version }}
# steps:
# - name: Make Release
# id: release
# uses: pagopa/github-actions-template/maven-release@main
# with:
# semver: ${{ needs.setup.outputs.semver }}
# github_token: ${{ secrets.BOT_TOKEN_GITHUB }}
# beta: ${{ inputs.beta }}
# skip_ci: ${{ inputs.beta }}
#
# build-and-push:
# needs: [ setup, release ]
# name: Build and Push Docker Image
# runs-on: ubuntu-latest
# if: ${{ inputs.semver != 'skip' }}
# environment: ${{ inputs.environment }}
# steps:
# - name: Build and Push
# id: semver
# uses: pagopa/github-actions-template/[email protected]
# with:
# branch: ${{ github.ref_name}}
# github_token: ${{ secrets.GITHUB_TOKEN }}
# tag: ${{ needs.release.outputs.version }}
#
# deploy_azure_fn:
# name: Deploy Azure function
# needs: [ setup, release, build-and-push ]
# runs-on: ubuntu-latest
# if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
#
# steps:
# - name: 'Checkout GitHub Action'
# uses: actions/checkout@v3
#
# - name: 'Login via Azure CLI'
# uses: azure/login@v1
# with:
# client-id: ${{ secrets.CLIENT_ID }}
# tenant-id: ${{ secrets.TENANT_ID }}
# subscription-id: ${{ secrets.SUBSCRIPTION_ID }}
#
# - name: Set env variables
# run: |
# echo "RESOURCE_GROUP=pagopa-${{env.ENV_SHORT}}-weu-shared-rg" >> $GITHUB_ENV
# echo "APP_NAME=pagopa-${{env.ENV_SHORT}}-weu-shared-authorizer-fn" >> $GITHUB_ENV
# echo "REGISTRY_IMAGE=ghcr.io/pagopa/pagopa-platform-authorizer:${{needs.release.outputs.version}}" >> $GITHUB_ENV
#
#
# - name: 'Azure CLI script: start staging slot'
# uses: azure/CLI@v1
# if: ${{ contains(github.event.inputs.environment, 'prod') }}
# with:
# inlineScript: |
# az functionapp start --name ${{ env.APP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }} --slot staging
#
# - name: 'Run Azure Functions Container Action: staging slot'
# uses: Azure/[email protected]
# if: ${{ contains(github.event.inputs.environment, 'prod')}}
# with:
# app-name: ${{ env.APP_NAME }}
# image: ${{ env.REGISTRY_IMAGE }}
# slot-name: staging
#
# - name: 'Deploy Approval'
# uses: trstringer/manual-approval@v1
# if: ${{ contains(github.event.inputs.environment, 'prod')}}
# with:
# secret: ${{ secrets.BOT_TOKEN_GITHUB }}
# approvers: pagopa-team-core
# minimum-approvals: 1
# issue-title: "Deploying ${{ env.TAG }} to prod from staging"
# issue-body: "Please approve or deny the deployment of version ${{ env.TAG }}."
# exclude-workflow-initiator-as-approver: false
# timeout-minutes: 360
#
# - name: 'Run Azure Functions Container Action'
# uses: Azure/[email protected]
# with:
# app-name: ${{ env.APP_NAME }}
# image: ${{ env.REGISTRY_IMAGE }}
# slot-name: production
#
# - name: 'Azure CLI script: end staging slot'
# uses: azure/CLI@v1
# if: ${{ contains(github.event.inputs.environment, 'prod') }}
# with:
# inlineScript: |
# az functionapp stop --name ${{ env.APP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }} --slot staging
#
# - name: Azure logout
# run: |
# az logout
#
## notify:
## needs: [ deploy ]
## runs-on: ubuntu-latest
## name: Notify
## if: always()
## steps:
## - name: Report Status
## if: always()
## uses: ravsamhq/notify-slack-action@v2
## with:
## status: ${{ needs.deploy.result }}
## token: ${{ secrets.GITHUB_TOKEN }}
## notify_when: 'failure,skipped'
## notification_title: '{workflow} has {status_message}'
## message_format: '{emoji} <{workflow_url}|{workflow}> {status_message} in <{repo_url}|{repo}>'
## footer: 'Linked to Repo <{repo_url}|{repo}>'
## env:
## SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}