Build and Push API #63
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
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 |