0Pricing
PHP Academy · บทเรียน

CI/CD ด้วย GitHub Actions

ทดสอบและนำ PHP ขึ้นใช้งานโดยอัตโนมัติทุกครั้งที่พุช

CI/CD ด้วย GitHub Actions เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

CI/CD สำหรับ PHP

ทุกการส่งโค้ดควรผ่านการทดสอบ การตรวจรูปแบบ และการวิเคราะห์แบบสถิต และเมื่อผ่านบนสาขาหลักแล้ว จึงสร้างเป็นอิมเมจและนำไปใช้งาน GitHub Actions จะเรียกใช้ pipeline นี้บนตัวรันที่มีการจัดการ โดยทริกเกอร์จากเหตุการณ์ของคลังโค้ด

เราจะสร้างเวิร์กโฟลว์ที่เรียกใช้ PHPUnit กับบริการ MySQL จริง แคช Composer เรียกใช้ PHPStan สร้างอิมเมจ Docker และนำไปใช้งาน

โครงสร้างเวิร์กโฟลว์

เวิร์กโฟลว์จะอยู่ใน .github/workflows/*.yml โดยมีทริกเกอร์ on: งานอย่างน้อยหนึ่งงานผ่าน jobs: และแต่ละงานมีขั้นตอนผ่าน steps: งานต่าง ๆ จะทำงานแบบขนานบนตัวรันที่แยกจากกัน เว้นแต่จะเชื่อมโยงกันด้วย needs:

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

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

แอ็กชัน setup-php

shivammathur/setup-php เป็นวิธีมาตรฐานสำหรับติดตั้ง PHP เวอร์ชันที่ระบุ พร้อมส่วนขยายและเครื่องมือที่เลือกไว้ เช่น Composer และ PHPStan บนตัวรัน ซึ่งเร็วกว่าการสร้างอิมเมจเพียงเพื่อใช้ทดสอบมาก

      - 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

แคช Composer

การดาวน์โหลดการอ้างอิงแพ็กเกจใหม่ทุกครั้งที่ทำงานทำให้เสียเวลาไปหลายนาที ให้แคชไดเรกทอรีของ Composer โดยใช้แฮชของ composer.lock เป็นคีย์ เพื่อให้แคชใช้ไม่ได้เฉพาะเมื่อการอ้างอิงแพ็กเกจมีการเปลี่ยนแปลง

      - 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

คอนเทนเนอร์บริการ

งานสามารถเรียกใช้ คอนเทนเนอร์บริการ ซึ่งเป็น MySQL หรือ Redis จริงที่ตัวรันเข้าถึงได้ผ่าน 127.0.0.1 ให้เพิ่มการตรวจสอบสุขภาพผ่าน options เพื่อไม่ให้ขั้นตอนต่าง ๆ ทำงานก่อนฐานข้อมูลจะพร้อม

  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

เรียกใช้การทดสอบและความครอบคลุม

เมื่อติดตั้งการอ้างอิงแพ็กเกจแล้วและ MySQL ทำงานอยู่ ให้เรียกใช้ PHPUnit โดยกำหนด DSN สำหรับการทดสอบเป็น 127.0.0.1:3306 สร้างข้อมูลความครอบคลุม และเลือกให้การสร้างล้มเหลวได้หากค่าต่ำกว่าเกณฑ์

      - 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

การสร้างแบบเมทริกซ์

ไลบรารีควรผ่านการทดสอบบน PHP หลายเวอร์ชัน strategy.matrix จะแยกงานออกเป็นการทำงานแบบขนาน งานละหนึ่งชุดค่าผสม โดยมีการแทนค่า ${{ matrix.php }} ลงในขั้นตอนต่าง ๆ

  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 }}

คำนวณแท็กอิมเมจ

การนำไปใช้งานต้องมีแท็กอิมเมจที่ไม่ซ้ำและติดตามย้อนกลับได้ โดยทั่วไปจะใช้ SHA ของคอมมิต ตัวอย่างนี้แสดงตรรกะการสร้างแท็กที่คุณจะเขียนในเวิร์กโฟลว์ เพื่อเปลี่ยน ref และ SHA ให้เป็นแท็กของรีจิสทรี

<?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;
?>

สร้างและส่งอิมเมจขึ้นรีจิสทรี

บนสาขาหลัก ให้สร้างอิมเมจ Docker ด้วย docker/build-push-action โดยใช้ BuildKit และแคชของ GitHub Actions ให้เข้าสู่ระบบรีจิสทรีด้วยโทเค็นลับก่อน และอย่าเขียนข้อมูลรับรองไว้ตายตัวในโค้ด

  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

ข้อมูลลับและ OIDC

เก็บข้อมูลรับรองไว้ในข้อมูลลับของคลังโค้ดหรือสภาพแวดล้อม และอ้างอิงผ่าน ${{ secrets.NAME }} ซึ่งจะถูกปิดบังในบันทึก สำหรับการนำไปใช้งานบนคลาวด์ ควรเลือกใช้ OIDC: ตัวรันจะได้รับโทเค็นอายุสั้นจาก AWS/GCP ผ่าน permissions: id-token: write จึงไม่ต้องเก็บคีย์อายุยาวไว้ในคลังโค้ด

  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

ขั้นตอนนำไปใช้งานและสภาพแวดล้อม

ควบคุมการนำไปใช้งานจริงด้วย GitHub environment ซึ่งอาจกำหนดให้มีผู้ตรวจสอบที่จำเป็นได้ จากนั้นขั้นตอนนำไปใช้งานจะเรียกใช้การทยอยอัปเดตของคุณ เช่น อัปเดตการนำไปใช้งานบน Kubernetes อัปเดตบริการ ECS หรือเชื่อมต่อผ่าน SSH เพื่อดึงอิมเมจใหม่

  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

ตรวจสอบอย่างรวดเร็ว

ข้อได้เปรียบด้านความปลอดภัยหลักของ OIDC เหนือคีย์คลาวด์ที่เก็บไว้ใน Actions คืออะไร

สรุปทบทวน

คุณสร้าง pipeline CI/CD สำหรับ PHP ใน GitHub Actions โดยมีทริกเกอร์จากการส่งโค้ดหรือ PR ใช้ setup-php พร้อมส่วนขยาย แคช Composer โดยใช้ไฟล์ล็อกเป็นคีย์ มีคอนเทนเนอร์บริการ MySQL พร้อมการตรวจสอบสุขภาพ ทดสอบด้วย PHPUnit และ PHPStan สร้างด้วยเมทริกซ์เวอร์ชัน จากนั้นสร้างและส่งอิมเมจเฉพาะบนสาขาหลักโดยใช้แคช GHA และนำไปใช้งานโดยยืนยันตัวตนผ่าน OIDC พร้อมควบคุมด้วยสภาพแวดล้อม

หลักการ: แคชตามแฮชของไฟล์ล็อก ควบคุมบริการที่พร้อมใช้งานด้วยการตรวจสอบสุขภาพ ติดแท็กอิมเมจด้วย SHA และเลือกใช้ OIDC แทนคีย์ที่เก็บไว้

คำถามที่พบบ่อย

บทเรียน “CI/CD ด้วย GitHub Actions” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “CI/CD ด้วย GitHub Actions” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “CI/CD ด้วย GitHub Actions”

ทดสอบและนำ PHP ขึ้นใช้งานโดยอัตโนมัติทุกครั้งที่พุช คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “CI/CD ด้วย GitHub Actions” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำแอปพลิเคชัน PHP ให้เป็นคอนเทนเนอร์
  2. การสร้างหลายขั้นตอนและการปรับประสิทธิภาพ
  3. Docker Compose สำหรับชุดบริการภายในเครื่อง
  4. CI/CD ด้วย GitHub Actions
← กลับไปที่ PHP Academy