Skip to content
name: Deploy_To_PROD_Function_On_Published_Release
# Runs when a Release is published from GitHub UI
on:
release:
types: [published]
env:
NAME: iativalidator
STAGE: prod # suffix to indicate environment stage
TAG: ${{ github.sha }}
AZURE_CREDENTIALS: ${{ secrets.PROD_AZURE_CREDENTIALS }}
REDIS_HOSTNAME: ${{ secrets.PROD_REDIS_HOSTNAME }}
REDIS_PORT: ${{ secrets.REDIS_PORT }}
REDIS_KEY: ${{ secrets.PROD_REDIS_KEY }}
REDIS_CACHE_SEC: 86400
API_KEY: ${{ secrets.PROD_API_KEY }}
VALIDATOR_SERVICES_URL: ${{ secrets.PROD_VALIDATOR_SERVICES_URL }}
VALIDATOR_SERVICES_KEY_NAME: ${{ secrets.VALIDATOR_SERVICES_KEY_NAME }}
VALIDATOR_SERVICES_KEY_VALUE: ${{ secrets.PROD_VALIDATOR_SERVICES_KEY_VALUE }}
ACR_LOGIN_SERVER: ${{ secrets.ACR_LOGIN_SERVER }}
ACR_USERNAME: ${{ secrets.ACR_USERNAME }}
ACR_PASSWORD: ${{ secrets.ACR_PASSWORD }}
KV_URI: ${{ secrets.PROD_KV_URI }}
BASIC_GITHUB_TOKEN: ${{ secrets.BASIC_GITHUB_TOKEN }}
DATASTORE_SERVICES_URL: ${{ secrets.PROD_DATASTORE_SERVICES_URL }}
DATASTORE_SERVICES_AUTH_HTTP_HEADER_NAME: ${{ secrets.PROD_DATASTORE_SERVICES_AUTH_HTTP_HEADER_NAME }}
DATASTORE_SERVICES_AUTH_HTTP_HEADER_VALUE: ${{ secrets.PROD_DATASTORE_SERVICES_AUTH_HTTP_HEADER_VALUE }}
DATASTORE_SERVICES_IATI_IDENTIFIERS_EXIST_MAX_NUMBER_OF_IDS: ${{ secrets.PROD_DATASTORE_SERVICES_IATI_IDENTIFIERS_EXIST_MAX_NUMBER_OF_IDS }}
jobs:
build-test-deploy:
runs-on: ubuntu-latest
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v4
- name: 'Login via Azure CLI'
uses: azure/login@v1.4.7
with:
creds: ${{ env.AZURE_CREDENTIALS }} # Service Principal credentials saved in GitHub Secrets
- name: 'Docker Login'
uses: azure/docker-login@v1
with:
login-server: ${{ env.ACR_LOGIN_SERVER }}
username: ${{ env.ACR_USERNAME }}
password: ${{ env.ACR_PASSWORD }}
- name: 'Compose Customized Docker Image'
run: |
docker build . -t ${{ env.ACR_LOGIN_SERVER }}/func-$NAME-$STAGE:$TAG
docker push ${{ env.ACR_LOGIN_SERVER }}/func-$NAME-$STAGE:$TAG
- name: Set Env variables on app service
uses: Azure/appservice-settings@v1.1.1
with:
app-name: func-${{env.NAME}}-${{env.STAGE}}
app-settings-json: |
[
{
"name": "REDIS_HOSTNAME",
"value": "${{ env.REDIS_HOSTNAME }}",
"slotSetting": false
},
{
"name": "REDIS_KEY",
"value": "${{ env.REDIS_KEY }}",
"slotSetting": false
},
{
"name": "REDIS_PORT",
"value": "${{ env.REDIS_PORT }}",
"slotSetting": false
},
{
"name": "REDIS_CACHE_SEC",
"value": "${{ env.REDIS_CACHE_SEC }}",
"slotSetting": false
},
{
"name": "VALIDATOR_SERVICES_URL",
"value": "${{ env.VALIDATOR_SERVICES_URL }}",
"slotSetting": false
},
{
"name": "VALIDATOR_SERVICES_KEY_NAME",
"value": "${{ env.VALIDATOR_SERVICES_KEY_NAME }}",
"slotSetting": false
},
{
"name": "VALIDATOR_SERVICES_KEY_VALUE",
"value": "${{ env.VALIDATOR_SERVICES_KEY_VALUE }}",
"slotSetting": false
},
{
"name": "DOCKER_REGISTRY_SERVER_URL",
"value": "${{ env.ACR_LOGIN_SERVER }}",
"slotSetting": false
},
{
"name": "DOCKER_REGISTRY_SERVER_PASSWORD",
"value": "${{ env.ACR_PASSWORD }}",
"slotSetting": false
},
{
"name": "DOCKER_REGISTRY_SERVER_USERNAME",
"value": "${{ env.ACR_USERNAME }}",
"slotSetting": false
},
{
"name": "AzureWebJobsSecretStorageType",
"value": "keyvault",
"slotSetting": false
},
{
"name": "AzureWebJobsSecretStorageKeyVaultUri",
"value": "${{ env.KV_URI }}",
"slotSetting": false
},
{
"name": "BASIC_GITHUB_TOKEN",
"value": "${{ env.BASIC_GITHUB_TOKEN }}",
"slotSetting": false
},
{
"name": "languageWorkers__node__arguments",
"value": "--max-old-space-size=6656",
"slotSetting": false
},
{
"name": "DATASTORE_SERVICES_URL",
"value": "${{ env.DATASTORE_SERVICES_URL }}",
"slotSetting": false
},
{
"name": "DATASTORE_SERVICES_AUTH_HTTP_HEADER_NAME",
"value": "${{ env.DATASTORE_SERVICES_AUTH_HTTP_HEADER_NAME }}",
"slotSetting": false
},
{
"name": "DATASTORE_SERVICES_AUTH_HTTP_HEADER_VALUE",
"value": "${{ env.DATASTORE_SERVICES_AUTH_HTTP_HEADER_VALUE }}",
"slotSetting": false
},
{
"name": "DATASTORE_SERVICES_IATI_IDENTIFIERS_EXIST_MAX_NUMBER_OF_IDS",
"value": "${{ env.DATASTORE_SERVICES_IATI_IDENTIFIERS_EXIST_MAX_NUMBER_OF_IDS }}",
"slotSetting": false
}
]
- name: 'Run Azure Functions Container Action'
uses: Azure/functions-container-action@v1
with:
app-name: func-${{ env.NAME }}-${{ env.STAGE }}
image: ${{ env.ACR_LOGIN_SERVER }}/func-${{ env.NAME}}-${{ env.STAGE }}:${{ env.TAG }}
- name: 'Tag resource for Tech Climate Impact'
uses: 'azure/CLI@v1.0.8'
with:
azcliversion: 2.30.0
inlineScript: |
az resource tag \
--tags env=$STAGE avgCPU=true ACU=true ACUvalue=420 \
--resource-group "rg-${{ env.NAME }}-${{ env.STAGE }}" \
--name "func-${{ env.NAME }}-${{ env.STAGE }}" \
--resource-type "Microsoft.Web/sites"
integration-test:
needs: build-test-deploy
runs-on: ubuntu-latest
steps:
- name: 'Wait for 5 minutes'
run: sleep 300
- name: 'Checkout GitHub Action'
uses: actions/checkout@v4
- name: 'Install newman'
run: |
sudo npm i -g newman
- name: 'Run integration tests'
run: |
newman run integration-tests/js-validator-api-tests.postman_collection.json \
-e integration-tests/envs/func-iativalidator-PROD.postman_environment.json \
--working-dir integration-tests/test-files \
--env-var keyValue=$API_KEY \
--delay-request 50