CI/CD med GitHub Actions
Test og deploy PHP automatisk ved hvert push.
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@v4setup-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, phpstanCaching 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-progressTjenestecontainere
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=10Kø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-progressMatrix-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=maxHemmeligheder 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-1Udrulningstrin 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=120sHurtigt 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.
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
- Containerisering af en PHP-applikation
- Builds i flere trin og optimering
- Docker Compose til lokale stacks
- CI/CD med GitHub Actions