Lær hvordan du deployer koden din til prod!
Disse oppgavene gjøres i filen deploy.yml.
Sjekk ut en git branch med navnet ditt, f.eks.:
git checkout -b andreas-bakseter
PASS PÅ AT INGEN ANDRE HAR EN BRANCH MED SAMME NAVN SOM DEG!
Hver gang du vil teste endringer, push de til branchen din:
git push -u origin andreas-bakseter # første gang
git push # senere
...og lag en pull request mot master
-branchen.
Da vil du se at GitHub Actions vil kjøre jobbene dine, og du kan se output. Hver gang du vil teste endringer, push branchen din til GitHub.
💡 TIPS: istedenfor å lage flere commits, kan du bruke git add .
og git commit --amend --no-edit
for å legge til nye endringer i forrige commit,
for å så pushe med git push --force
. Dette er en god praksis for å holde git-historikken ren når du til slutt merger til master
.
Vi vil gjerne kjøre testene våre for frontend'en i GitHub Actions, men vi mangler noen steg i jobben frontend-tests
.
Fyll ut stegene som mangler for å kjøre testenen til frontend'en.
Det er bare å pushe til branchen din og se om det fungerer underveis!
NB!
Deploy-jobbene deploy-infrastructure
og deploy-frontend
vil feile siden vi ikke har laget infrastrukturen vår enda.
Dette kan du ignorere, vi fikser det i senere oppgaver.
💡 HINT: Se hvordan de andre jobbene definerer steg (i listen under steps
).
✨ Se fasit
frontend-tests:
name: 'Run frontend tests'
runs-on: ubuntu-latest
defaults:
run:
working-directory: 'frontend'
steps:
- name: Checkout repository
uses: actions/checkout@v4
# legg til disse to stegene:
- name: Install dependencies
run: yarn install
- name: Run tests
run: yarn test
Se på Summary på din action i GitHub UI'en. Den finner du ved å enten trykke på Show all checks og så Details på en pull request, eller gå hit og finn din workflow run.
Her kan du se en grafisk oversikt over de forskjellige jobbene.
Vi ønsker at deploy-infrastructure
-jobben kun skal kjøre dersom frontend-tests
-jobben har kjørt uten feil.
Legg til litt ekstra konfigurasjon i deploy-infrastructure
-jobben for å få dette til.
💡 HINT: Se på dokumentasjonen til GitHub Actions.
✨ Se fasit
deploy-infrastructure:
name: Deploy infrastructure with Terraform
runs-on: ubuntu-latest
# legg til disse to linjene:
needs:
- frontend-tests
env:
TF_VAR_my_name: ${{ github.head_ref }}
ARM_CLIENT_ID: ${{ vars.ARM_CLIENT_ID }}
ARM_SUBSCRIPTION_ID: ${{ vars.ARM_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ vars.ARM_TENANT_ID }}
ARM_USE_OIDC: 'true'
...
I denne workshoppen har dere ikke mulighet til å kjøre Terraform lokalt, men du kan pushe til branch'en din og se på output fra GitHub Actions.
Se på output fra GitHub Actions i steget deploy
.
Her kan du se at Terraform feiler fordi det mangler noen attributter i en ressurs.
Vanligvis ville du sett hva Terraform har tenkt til å gjøre (en plan
).
Det mangler noen attributtene i azurerm_static_web_app
-ressursen i filen main.tf.
Legg til de feltene som mangler for å kunne deploye applikasjonen.
Push så til branchen din og se om det fungerer!
💡 HINT: Les dokumentasjonen til azurerm_static_web_app
.
✨ Se fasit
resource "azurerm_static_web_app" "devops" {
name = "${var.my_name}-webapp"
# legg til disse attributtene:
resource_group_name = azurerm_resource_group.devops.name
location = local.location
}
Vi har nå lyst til å lage infrastrukturen vår med Terraform.
Legg til et siste steg i deploy-infrastructure
-jobben som kjører en Terraform kommando for å lage infrastrukturen vår.
Push så til branchen din og se om det fungerer!
💡 HINT: Se på dokumentasjonen til Terraform,
eller kjør terraform -help
i terminalen dersom du har Terraform installert lokalt.
✨ Se fasit
deploy-infrastructure:
name: Deploy infrastructure with Terraform
runs-on: ubuntu-latest
env:
TF_VAR_my_name: ${{ github.head_ref }}
ARM_CLIENT_ID: ${{ vars.ARM_CLIENT_ID }}
ARM_SUBSCRIPTION_ID: ${{ vars.ARM_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ vars.ARM_TENANT_ID }}
ARM_USE_OIDC: 'true'
outputs:
resource-group-name: ${{ steps.terraform-output.outputs.resource_group_name }}
swa-name: ${{ steps.terraform-output.outputs.swa_name }}
permissions:
contents: read
id-token: write
environment: prod
defaults:
run:
working-directory: 'terraform'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Init Terraform
run: terraform init
- name: Set Terraform workspace
run: terraform workspace new "$TF_VAR_my_name" || terraform workspace select "$TF_VAR_my_name"
- name: Run Terraform plan
run: terraform plan
# legger til dette steget:
- name: Run Terraform apply
run: terraform apply -auto-approve
Dersom alt har gått bra, skal du få en URL til applikasjonen din publisert som en kommentar på pull request'en din. Gå inn på linken og se om du får opp frontend'en din!
Prøv deretter å endre på index.html og pushe til branchen din, for å se at ny endringer blir deployet riktig.
Når du er ferdig med oppgavene, lukk pull request'en din. Det vil da kjøre en siste jobb som sletter ressursene som ble laget i Azure.
Du kan sjekke logger i GitHub Actions for å se at det fungerer!
-
Få tak i en Azure subscription. Pass på at provider
Microsoft.App
er registrert i subscription'en din. Se her for mer informasjon, og evt. kjør kommandoenaz provider register --namespace Microsoft.App
for å registrere den. -
Lag en ny Storage Account i Azure for å lagre Terraform state. Bruk skriptet
bootstrap.sh
for å sette opp en ny Storage Account, som vil lages i resource grouptfstate
. -
Lag en App Registration i Entra ID manuelt, og pek den mot riktig GitHub repository/environment, se her for mer informasjon. Du kan bruke
prod
som environment, det er det som brukes i.github/workflows/deploy.yml
. Gi denContributor
-tilgang til subscription'en din. -
Hent ut client ID fra App Registration og legg den i GitHub repository variables under
ARM_CLIENT_ID
. Hent også ut subscription ID og tentant ID og legg de i GitHub repository variables underARM_SUBSCRIPTION_ID
ogARM_TENANT_ID
.