Lær hvordan du deployer koden din til prod!
Installer Docker herfra.
Bygg et Docker image for frontend'en slik:
cd frontend
docker build . -t devops-workshop:latest
Når den er ferdig å bygge, kan du prøve og kjøre applikasjonen med denne kommandoen:
docker run -it -p 3000:3000 devops-workshop:latest
Du ser at den feiler, og det virker som den mangler en fil (eller filer?) for å kunne kjøre.
Legg til det som mangler i COPY
-steget i filen Dockerfile.
✨ Se fasit
FROM alpine:latest
WORKDIR /app
RUN apk update && \
apk add yarn
# legger til `package.json`:
COPY yarn.lock index.html package.json ./
RUN yarn install --frozen-lockfile
ENTRYPOINT ["yarn", "serve"]
Nå skal du kunne gå i nettleseren og se noe på http://localhost:3000!
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
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 run-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!
💡 HINT: Se hvordan de andre jobbene definerer steg (i listen under steps
).
✨ Se fasit
run_tests:
name: 'Run frontend tests'
runs-on: ubuntu-latest
defaults:
run:
working-directory: './frontend'
steps:
- name: Checkout repository
uses: actions/checkout@v4
# legger til disse 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.
Du vil da se at det ikke er noen kobling mellom stegene som kjører testene og stegene som bygger Docker image. Vi vil at bygg-steget ikke skal starte før testene har kjørt og har passert. Endre det slik at bygg-steget avhenger av test-steget for å kunne kjøre.
Dobbeltsjekk til slutt at bygg-steget kjører etter test-steget ved å se på Summary i GitHub Actions UI'en.
✨ Se fasit
build:
name: 'Build Docker image and push to registry'
needs: [run-tests] # legger til denne linjen
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: 'ghcr.io'
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push image to registry
uses: docker/build-push-action@v5
with:
push: 'true'
tags: 'ghcr.io/${{ github.repository }}/${{ github.head_ref }}:latest'
context: 'frontend'
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 felter i azurerm_container_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_container_app
.
✨ Se fasit
resource "azurerm_container_app" "devops" {
name = "${var.my_name}-app"
container_app_environment_id = azurerm_container_app_environment.backend_env.id
resource_group_name = azurerm_resource_group.devops
revision_mode = "Single"
template {
container {
image = "ghcr.io/computas/devops-workshop/${var.my_name}:latest"
# legger til disse feltene:
name = "devops-workshop"
cpu = "0.25"
memory = "0.5Gi"
#
}
min_replicas = 1
max_replicas = 1
revision_suffix = substr(var.revision_suffix, 0, 10)
}
ingress {
target_port = "3000"
external_enabled = true
traffic_weight {
percentage = 100
latest_revision = true
}
}
}
Vi har lyst til å deploye med Terraform.
Legg til et siste steg i deploy
-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:
name: 'Deploy using Terraform'
runs-on: ubuntu-latest
needs: [build]
env:
TF_VAR_revision_suffix: ${{ github.sha }}
TF_VAR_my_name: ${{ github.head_ref }}
TF_VAR_repository: ${{ github.repository }}
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'
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
- name: Run Terraform apply
run: terraform apply -auto-approve # legger til denne linjen
Se på Outputs
under Run Terraform apply i loggen til GitHub Actions.
Her skal du finne en link til applikasjonen din.
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
.