PHP Academy · Lektion

CI/CD med GitHub Actions

Test og deploy PHP automatisk ved hvert push.

Lektion 4 af 413 trin

CI/CD med GitHub Actions er en gratis PHP Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i PHP Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. PHP Academy-kurset indeholder 4 lektioner i alt.

CI/CD til PHP

Ved hvert push bør der køres tests, linting og statisk analyse, og når alt er grønt på hovedgrenen, bør der bygges et image og foretages en udrulning. GitHub Actions kører denne arbejdsgang på administrerede kørselsmiljøer, som udløses af hændelser i repositoriet.

Vi bygger en arbejdsgang, der kører PHPUnit mod en rigtig MySQL-tjeneste, cacher Composer, kører PHPStan, bygger et Docker-image og foretager en udrulning.

Arbejdsgangens opbygning

En arbejdsgang ligger i .github/workflows/*.yml. Den har udløsere i on:, et eller flere jobs:, og hvert job har steps:. Jobs kører parallelt på isolerede kørselsmiljøer, medmindre de forbindes via needs:.

name: CI
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

setup-php-handlingen

shivammathur/setup-php er standardmåden at installere en bestemt PHP-version med valgte udvidelser og værktøjer (Composer, PHPStan osv.) i kørselsmiljøet — langt hurtigere end at bygge et image kun for at teste.

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: pdo_mysql, intl, redis, zip
          coverage: pcov
          tools: composer:v2, phpstan

Caching af Composer

Genhentning af afhængigheder ved hver kørsel spilder minutter. Cachér Composers mappe med en nøgle baseret på hashen for composer.lock, så cachen kun ugyldiggøres, når afhængighederne ændrer sig.

      - name: Get Composer cache dir
        id: composer-cache
        run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: composer-

      - run: composer install --prefer-dist --no-progress

Tjenestecontainere

Jobs kan starte tjenestecontainere — en rigtig MySQL eller Redis, som kørselsmiljøet kan nå på 127.0.0.1. Tilføj et sundhedstjek via options, så trinnene ikke kører, før databasen er klar.

  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_DATABASE: app_test
          MYSQL_ROOT_PASSWORD: root
        ports: ['3306:3306']
        options: >-
          --health-cmd="mysqladmin ping -proot"
          --health-interval=5s --health-retries=10

Kørsel af tests og dækning

Når afhængighederne er installeret, og MySQL kører, skal du køre PHPUnit. Angiv din test-DSN til 127.0.0.1:3306. Generér testdækning, og lad eventuelt buildet fejle, hvis det ligger under en bestemt tærskel.

      - name: Run PHPUnit
        env:
          DATABASE_URL: "mysql://root:root@127.0.0.1:3306/app_test"
        run: vendor/bin/phpunit --coverage-clover=coverage.xml

      - name: Static analysis
        run: phpstan analyse src --level=8 --no-progress

Matrix-builds

Biblioteker bør bestå på flere PHP-versioner. En strategy.matrix fordeler jobbet i parallelle kørsler, én pr. kombination, og indsætter ${{ matrix.php }} i trinnene.

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2', '8.3', '8.4']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}

Beregning af imagetag

Udrulninger kræver et entydigt og sporbart imagetag. Commit-SHA'en er det konventionelle valg. Dette udsnit viser logikken til at udlede tagget, som du ville udtrykke den i arbejdsgangen — fra en reference og en SHA til et tag i et registry.

<?php
// Mirrors what the workflow computes for the image tag
$ref = 'refs/heads/main';
$sha = '9f41efadc0de1234567890abcdef0000deadbeef';

$branch = str_replace('refs/heads/', '', $ref);
$shortSha = substr($sha, 0, 7);
$tag = sprintf('registry.example.com/app:%s-%s', $branch, $shortSha);

echo $tag . PHP_EOL;          // registry.example.com/app:main-9f41efa
echo 'is_main: ' . ($branch === 'main' ? 'yes' : 'no') . PHP_EOL;
?>

Bygning og push af imaget

På hovedgrenen skal du bygge Docker-imaget med docker/build-push-action ved hjælp af BuildKit og GitHub Actions-cachen. Log først ind i registryet med et hemmeligt adgangstoken; hårdkod aldrig legitimationsoplysninger.

  build:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          target: runtime
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Hemmeligheder og OIDC

Gem legitimationsoplysninger i hemmeligheder på repository- eller miljøniveau, og henvis til dem som ${{ secrets.NAME }} — de skjules i logfiler. Ved udrulninger til skyen bør du foretrække OIDC: kørselsmiljøet får et kortlivet token fra AWS/GCP via permissions: id-token: write, så ingen langtidsnøgler ligger i repositoriet.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      id-token: write     # enables OIDC
      contents: read
    steps:
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/deploy
          aws-region: eu-central-1

Udrulningstrin og miljøer

Beskyt produktionsudrulninger med et GitHub-environment, eventuelt med påkrævede godkendere. Udrulningstrinnet sætter derefter din opdatering i gang — ved at opdatere en Kubernetes-udrulning, en ECS-tjeneste eller oprette forbindelse via SSH for at hente det nye image.

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production       # can require manual approval
      url: https://app.example.com
    steps:
      - name: Roll out
        run: |
          kubectl set image deployment/app \
            app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          kubectl rollout status deployment/app --timeout=120s

Hurtigt tjek

Hvad er den største sikkerhedsfordel ved OIDC frem for gemte cloud-nøgler i Actions?

Opsummering

Du har bygget en PHP CI/CD-arbejdsgang i GitHub Actions: udløsere ved push/PR, setup-php med udvidelser, en Composer-cache baseret på låsefilens hash, en MySQL-tjenestecontainer med sundhedstjek, PHPUnit + PHPStan, en versionsmatrix og derefter en bygning og push kun på hovedgrenen med GHA-cache samt en OIDC-godkendt, miljøstyret udrulning.

Principper: Cachér ud fra låsefilens hashes, brug sundhedstjek til at sikre, at tjenesterne er klar, tag images med SHA, og foretræk OIDC frem for gemte nøgler.

Gratis at komme i gang

Lær PHP med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
49
Lektioner
195

Ofte stillede spørgsmål

Er lektionen “CI/CD med GitHub Actions” gratis?

Ja — hele teksten til “CI/CD med GitHub Actions” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af PHP Academy-kurset, skal du opgradere til CoddyKit PRO. PHP Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “CI/CD med GitHub Actions”?

Test og deploy PHP automatisk ved hvert push. Du øver dig i PHP Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på PHP Academy?

Der kræves ingen tidligere erfaring. PHP Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “CI/CD med GitHub Actions”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne PHP Academy-lektion?

Ja. Alle PHP Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Containerisering af en PHP-applikation
  2. Builds i flere trin og optimering
  3. Docker Compose til lokale stacks
  4. CI/CD med GitHub Actions
← Tilbage til PHP Academy