Skip to content

Latest commit

 

History

History
229 lines (163 loc) · 7.63 KB

README.md

File metadata and controls

229 lines (163 loc) · 7.63 KB

devops-workshop

Lær hvordan du deployer koden din til prod!

Del 1: ▶️ GitHub Actions og 🏗️ Terraform

▶️ 1. GitHub Actions

Disse oppgavene gjøres i filen deploy.yml.

📖 Før du begynner

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.

🔨 Oppgave 1.1

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

🔨 Oppgave 1.2

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'

  ...

🏗️ 2. Terraform

📖 Før du begynner

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.

🔨 Oppgave 2.1

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).

🔨 Oppgave 2.2

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
}

🔨 Oppgave 2.3

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

🔨 Oppgave 2.4

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.

🏁 Ferdig!

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!

Del 2: Coming soon ...

🤓 Setup for spesielt interesserte (ikke en del av workshop'en)

  1. 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 kommandoen az provider register --namespace Microsoft.App for å registrere den.

  2. 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 group tfstate.

  3. 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 den Contributor-tilgang til subscription'en din.

  4. 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 under ARM_SUBSCRIPTION_ID og ARM_TENANT_ID.