Skip to content

Build and Push API

Build and Push API #56

name: Build and Push API
on:
push:
branches:
- 'main'
paths:
- 'Bouvet.Developer.Survey.Backend/**'
workflow_dispatch: # Allow manual trigger
inputs:
branch:
description: 'Branch to deploy'
required: true
default: 'main'
env:
DOTNET_VERSION: "8.0"
IMAGE_TAG: ${{ github.sha }}
jobs:
build-project:
runs-on: ubuntu-latest
name: Build 🛠️
container:
image: mcr.microsoft.com/dotnet/sdk:8.0
steps:
- name: Checkout project
uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Dotnet restore
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet restore Bouvet.Developer.Survey.Backend.generated.sln
- name: Build with dotnet
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet build Bouvet.Developer.Survey.Backend.generated.sln --configuration Release --no-restore
- name: Publish
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet publish Bouvet.Developer.Survey.Backend.generated.sln --configuration Release --no-build
test:
runs-on: ubuntu-latest
needs: build-project
name: Test 🧪
container:
image: mcr.microsoft.com/dotnet/sdk:8.0
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Dotnet restore
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet restore Bouvet.Developer.Survey.Backend.generated.sln
- name: Build with dotnet
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet build Bouvet.Developer.Survey.Backend.generated.sln --configuration Release --no-restore
- name: Test with dotnet
working-directory: ./Bouvet.Developer.Survey.Backend
run: dotnet test
deploy-to-test:
runs-on: ubuntu-latest
name: Deploy to test
needs: test
defaults:
run:
working-directory: ./Bouvet.Developer.Survey.Backend
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v4
- name: 'Login via Azure CLI'
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Enable ACR Admin Account
run: |
az acr update -n bouvetSurveyContainerRegistry --admin-enabled true
- name: Get ACR name
id: getacrname
run: |
acrName=$(az acr list --resource-group ${{ secrets.AZURE_RG_TEST }} --query "[0].name" -o tsv)
echo "ACR_NAME=$acrName" >> $GITHUB_ENV
- name: Get ACR Credentials
id: getacrcreds
run: |
loginServer=$(az acr list --resource-group ${{ secrets.AZURE_RG_TEST }} --query "[0].loginServer" -o tsv)
loginName=$(az acr credential show -n ${{ env.ACR_NAME }} --resource-group ${{ secrets.AZURE_RG_TEST }} --query username -o tsv)
password=$(az acr credential show -n ${{ env.ACR_NAME }} --resource-group ${{ secrets.AZURE_RG_TEST }} --query "passwords[0].value" -o tsv)
echo "LOGIN_SERVER=$loginServer" >> $GITHUB_ENV
echo "LOGIN_NAME=$loginName" >> $GITHUB_ENV
echo "PASSWORD=$password" >> $GITHUB_ENV
- name: Build and Push API Image to ACR
uses: azure/docker-login@v1
with:
login-server: ${{ env.LOGIN_SERVER }}
username: ${{ env.LOGIN_NAME }}
password: ${{ env.PASSWORD }}
- run: |
docker build . -t ${{ env.LOGIN_SERVER }}/backend-image:${{ github.sha }}
docker push ${{ env.LOGIN_SERVER }}/backend-image:${{ github.sha }}
echo "IMAGE_TAG=${{ github.sha }}" >> $GITHUB_ENV
- name: Deploy Bicep template 🚀
uses: azure/arm-deploy@v2
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION }}
resourceGroupName: ${{ secrets.AZURE_RG_TEST }}
template: infra/container-api-test.bicep
parameters: acrServer=${{ env.LOGIN_SERVER }} acrUsername=${{ env.LOGIN_NAME }} acrPassword=${{ env.PASSWORD }} containerImage=${{ env.IMAGE_TAG }}
failOnStdErr: false
deploy-to-prod:
runs-on: ubuntu-latest
name: Deploy/Production
needs: [test, deploy-to-test]
environment: Production
if: startsWith(github.ref, 'refs/tags/')
defaults:
run:
working-directory: ./Bouvet.Developer.Survey.Backend
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v4
- name: 'Login via Azure CLI'
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Enable ACR Admin Account
run: |
az acr update -n bouvetSurveyContainerRegistryProd --admin-enabled true
- name: Get ACR name
id: getacrname
run: |
acrName=$(az acr list --resource-group ${{ secrets.AZURE_RG }} --query "[0].name" -o tsv)
echo "ACR_NAME=$acrName" >> $GITHUB_ENV
- name: Get ACR Credentials
id: getacrcreds
run: |
loginServer=$(az acr list --resource-group ${{ secrets.AZURE_RG }} --query "[0].loginServer" -o tsv)
loginName=$(az acr credential show -n ${{ env.ACR_NAME }} --resource-group ${{ secrets.AZURE_RG }} --query username -o tsv)
password=$(az acr credential show -n ${{ env.ACR_NAME }} --resource-group ${{ secrets.AZURE_RG }} --query "passwords[0].value" -o tsv)
echo "LOGIN_SERVER=$loginServer" >> $GITHUB_ENV
echo "LOGIN_NAME=$loginName" >> $GITHUB_ENV
echo "PASSWORD=$password" >> $GITHUB_ENV
- name: Build and Push API Image to ACR
uses: azure/docker-login@v1
with:
login-server: ${{ env.LOGIN_SERVER }}
username: ${{ env.LOGIN_NAME }}
password: ${{ env.PASSWORD }}
- run: |
docker build . -t ${{ env.LOGIN_SERVER }}/backend-image:${{ github.sha }}
docker push ${{ env.LOGIN_SERVER }}/backend-image:${{ github.sha }}
echo "IMAGE_TAG=${{ github.sha }}" >> $GITHUB_ENV
- name: Deploy Bicep template 🚀
uses: azure/arm-deploy@v2
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION }}
resourceGroupName: ${{ secrets.AZURE_RG }}
template: infra/container-api-prod.bicep
parameters: acrServer=${{ env.LOGIN_SERVER }} acrUsername=${{ env.LOGIN_NAME }} acrPassword=${{ env.PASSWORD }} containerImage=${{ env.IMAGE_TAG }}
failOnStdErr: false