GitHub Actions บน Azure
ทำเวิร์กโฟลว์ CI/CD ซ้ำโดยใช้ GitHub Actions กับการดำเนินการ azure/webapps-deploy และทำความเข้าใจว่าเมื่อใดควรเลือก GitHub Actions แทน Azure Pipelines
GitHub Actions บน Azure เป็นบทเรียน Azure Fundamentals ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Azure Fundamentals และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Azure Fundamentals มีบทเรียนทั้งหมด 4 บทเรียน
GitHub Actions คืออะไร
GitHub Actions คือแพลตฟอร์ม CI/CD และระบบอัตโนมัติในตัวของ GitHub เวิร์กโฟลว์กำหนดไว้ในไฟล์ YAML ที่จัดเก็บในไดเรกทอรี .github/workflows/ ของที่เก็บโค้ด และถูกเรียกใช้โดยเหตุการณ์ของ GitHub เช่น การพุช, คำขอดึง, รุ่นที่เผยแพร่ และอื่น ๆ GitHub Actions ผสานรวมกับระบบนิเวศของ GitHub อย่างลึกซึ้ง (ปัญหา, PR, แพ็กเกจ และการสแกนความปลอดภัย) และมีคลัง แอ็กชันจากชุมชนจำนวนมากสำหรับงานต่าง ๆ เช่น การสร้าง การทดสอบ และการปรับใช้ไปยัง Azure
โครงสร้างเวิร์กโฟลว์ GitHub Actions
ไฟล์เวิร์กโฟลว์ GitHub Actions มีส่วนระดับบนสุดสามส่วน on กำหนดเหตุการณ์ทริกเกอร์ env กำหนดตัวแปรสภาพแวดล้อมส่วนกลาง jobs กำหนดงานอย่างน้อยหนึ่งงาน โดยแต่ละงานทำงานบน runner (ที่ GitHub โฮสต์หรือโฮสต์เอง) แต่ละงานมี ขั้นตอน ซึ่งเป็น run (สคริปต์เชลล์) หรือ uses (แอ็กชันที่สร้างไว้ล่วงหน้า) โดยค่าเริ่มต้น งานจะทำงานพร้อมกัน ให้ใช้ needs เพื่อสร้างการพึ่งพาตามลำดับ
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
NODE_VERSION: '18.x'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm ci
- run: npm testการตรวจสอบสิทธิ์ Azure จาก GitHub Actions
วิธีที่แนะนำในการตรวจสอบสิทธิ์ GitHub Actions กับ Azure คือ OpenID Connect (OIDC) ซึ่งออกโทเค็นอายุสั้นโดยไม่ต้องจัดเก็บข้อมูลลับอายุยาวใน GitHub กำหนดข้อมูลประจำตัวแบบรวมศูนย์บน Azure App Registration หรือ Managed Identity และให้สิทธิ์เชื่อถือที่เก็บโค้ดและสาขา GitHub ของคุณ ใช้แอ็กชัน azure/login@v2 เพื่อแลกโทเค็น OIDC ของ GitHub เป็นโทเค็นการเข้าถึง Azure โดยไม่จำเป็นต้องมีข้อมูลลับไคลเอ็นต์ใน GitHub Secrets
# Configure OIDC federated credential in Azure
az ad app federated-credential create \
--id <AppRegistrationObjectId> \
--parameters '{
"name": "github-oidc",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:myorg/myrepo:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'
# In the workflow: login via OIDC
# permissions:
# id-token: write
# contents: read
# - uses: azure/login@v2
# with:
# client-id: ${{ vars.AZURE_CLIENT_ID }}
# tenant-id: ${{ vars.AZURE_TENANT_ID }}
# subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}การปรับใช้ไปยัง Azure App Service
แอ็กชัน azure/webapps-deploy@v3 ปรับใช้โค้ดหรืออิมเมจคอนเทนเนอร์ไปยัง Azure App Service โดยรองรับการปรับใช้ไปยังช่องการใช้งาน การปรับใช้ด้วยแพ็กเกจ และการปรับใช้ด้วยอิมเมจ Docker ใช้คู่กับ azure/login@v2 สำหรับการตรวจสอบสิทธิ์ คุณสามารถกำหนดเป้าหมายเป็นช่องเตรียมใช้งาน เรียกใช้การทดสอบเบื้องต้น แล้วสลับช่องด้วยแอ็กชัน azure/CLI@v2 ที่เรียกใช้คำสั่งสลับช่อง ซึ่งจำลองรูปแบบการปรับใช้แบบ blue-green ของ Azure Pipelines ได้ทั้งหมดภายใน GitHub Actions
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- name: Build and zip app
run: npm ci && npm run build && zip -r app.zip dist/
- uses: azure/webapps-deploy@v3
with:
app-name: myUniqueWebApp
slot-name: staging
package: app.zipการปรับใช้ไปยัง Azure Kubernetes Service
ปรับใช้ไปยัง AKS จาก GitHub Actions โดยใช้แอ็กชัน azure/k8s-deploy@v5 แอ็กชันนี้ใช้ kubectl apply เพื่อปรับใช้แม니เฟสต์ ดำเนินการแทนที่อิมเมจ (แทนแท็กอิมเมจด้วยแท็กของบิลด์ปัจจุบัน) และตรวจสอบสถานะการทยอยปรับใช้ แอ็กชัน azure/aks-set-context@v4 กำหนดข้อมูลประจำตัวของ kubectl โดยดึง kubeconfig ของคลัสเตอร์ผ่านเซสชัน Azure ที่ผ่านการตรวจสอบสิทธิ์แล้ว
jobs:
deploy-aks:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- uses: azure/aks-set-context@v4
with:
resource-group: MyRG
cluster-name: myAKSCluster
- uses: azure/k8s-deploy@v5
with:
namespace: production
manifests: k8s/
images: 'mycontainerregistry.azurecr.io/myapp:${{ github.sha }}'ข้อมูลลับและตัวแปรของ GitHub
จัดเก็บค่าที่ละเอียดอ่อนใน GitHub Secrets ซึ่งเป็นค่าที่เข้ารหัสและเข้าถึงได้ในเวิร์กโฟลว์ผ่าน ${{ secrets.SECRET_NAME }} การกำหนดค่าที่ไม่ละเอียดอ่อนให้เก็บไว้ใน GitHub Variables ซึ่งเข้าถึงได้ผ่าน ${{ vars.VARIABLE_NAME }} ทั้งสองอย่างสามารถจำกัดขอบเขตไว้ที่ที่เก็บโค้ด สภาพแวดล้อม หรือองค์กรได้ ใช้ สภาพแวดล้อมใน GitHub Actions เพื่อเพิ่มกฎการป้องกัน (ผู้ตรวจสอบที่จำเป็นและสาขาการปรับใช้) ในลักษณะเดียวกับ Azure DevOps Environments
# Reference secrets and variables in a workflow
steps:
- name: Configure app settings
uses: azure/CLI@v2
with:
inlineScript: |
az webapp config appsettings set \
--name myUniqueWebApp \
--resource-group MyRG \
--settings \
DATABASE_URL='${{ secrets.DATABASE_URL }}' \
API_VERSION='${{ vars.API_VERSION }}'กฎการป้องกันสภาพแวดล้อม
Environments ของ GitHub Actions (กำหนดค่าใน Settings → Environments ของที่เก็บโค้ด) เพิ่มด่านการปรับใช้คล้ายกับสภาพแวดล้อมของ Azure DevOps คุณสามารถกำหนดให้มี ผู้ตรวจสอบที่จำเป็น ซึ่งต้องอนุมัติก่อนที่งานซึ่งกำหนดเป้าหมายไปยังสภาพแวดล้อมนั้นจะทำงาน จำกัดการปรับใช้ไว้ที่ สาขาที่ระบุ (เฉพาะ main เท่านั้นที่ปรับใช้ไปยัง Production ได้) และเพิ่ม ตัวจับเวลารอเพื่อหน่วงเวลาการปรับใช้ งานที่กำหนดเป้าหมายไปยังสภาพแวดล้อมที่มีการป้องกันจะหยุดรอจนกว่าจะปฏิบัติตามกฎการป้องกันทั้งหมด
# Workflow job targeting a protected GitHub environment
jobs:
deploy-production:
runs-on: ubuntu-latest
environment:
name: Production # Must have 2 approvers in GitHub settings
url: https://myapp.contoso.com
needs: deploy-staging
steps:
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- uses: azure/webapps-deploy@v3
with:
app-name: myUniqueWebApp
package: app.zipเวิร์กโฟลว์ที่นำกลับมาใช้ใหม่ได้และแอ็กชันแบบผสม
หลีกเลี่ยงการทำตรรกะ CI/CD ซ้ำกันในที่เก็บโค้ดต่าง ๆ ด้วยฟีเจอร์สองอย่างของ GitHub Actions เวิร์กโฟลว์ที่นำกลับมาใช้ใหม่ได้ช่วยให้คุณกำหนดเวิร์กโฟลว์ในที่เก็บโค้ดแห่งหนึ่งและเรียกใช้จากเวิร์กโฟลว์ในที่เก็บโค้ดอื่นผ่าน uses: myorg/shared-workflows/.github/workflows/deploy.yml@main ได้ แอ็กชันแบบผสมรวมหลายขั้นตอนเป็นแอ็กชันเดียวที่จัดเก็บไว้ในที่เก็บโค้ด และนำกลับมาใช้ใหม่ได้ด้วย uses: myorg/my-actions/deploy@v1 ทั้งสองแนวทางส่งเสริมหลักการ DRY ในไปป์ไลน์ CI/CD ทั่วทั้งองค์กร
# Call a reusable workflow from another workflow
jobs:
deploy:
uses: myorg/shared-workflows/.github/workflows/deploy-appservice.yml@main
with:
app-name: myUniqueWebApp
slot-name: staging
package-path: dist/
secrets:
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}GitHub Actions เทียบกับ Azure Pipelines: ควรเลือกเมื่อใด
เลือก GitHub Actions เมื่อ: โค้ดของคุณโฮสต์อยู่บน GitHub, ทีมของคุณต้องการใช้ส่วนติดต่อผู้ใช้ของ GitHub, คุณต้องการการผสานรวมอย่างใกล้ชิดกับการตรวจสอบ PR และการสแกนโค้ดของ GitHub หรือคุณกำลังสร้างโครงการโอเพนซอร์ส (มีจำนวนนาทีใช้งานฟรีมาก) เลือก Azure Pipelines เมื่อ: คุณต้องการการผสานรวมกับ Azure Boards, การทดสอบขั้นสูงด้วย Azure Test Plans, การจัดการฟีด Azure Artifacts, โค้ดอยู่ใน Azure Repos หรือคุณต้องการการจัดการรุ่นแบบหลายระยะที่ซับซ้อนพร้อมด่านตรวจในหลายสภาพแวดล้อม ทั้งสองรองรับการปรับใช้ไปยัง Azure ได้ดีเท่าเทียมกัน
GitHub Actions Marketplace
GitHub Actions Marketplace มีแอ็กชันจากชุมชนและแอ็กชันอย่างเป็นทางการหลายพันรายการสำหรับงานทั่วไป Microsoft เผยแพร่แอ็กชัน Azure อย่างเป็นทางการ ได้แก่ azure/login, azure/webapps-deploy, azure/aks-set-context, azure/k8s-deploy, azure/CLI, azure/arm-deploy และอีกมากมาย ให้ล็อกแอ็กชันไว้ที่แท็กรุ่นเฉพาะเสมอ (เช่น @v3) หรือ SHA ของคอมมิต เพื่อป้องกันการโจมตีห่วงโซ่อุปทานจากแอ็กชันที่ถูกบุกรุกและได้รับการอัปเดตด้วยโค้ดที่เป็นอันตราย
# Pin actions to specific version (recommended)
- uses: actions/checkout@v4 # Pinned to v4 tag
- uses: azure/login@v2 # Pinned to v2
- uses: azure/webapps-deploy@v3 # Pinned to v3
# Extra security: pin to commit SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# Avoid unpinned 'latest' or branch references
# - uses: some-action@main # UNSAFE - could change at any timeRunner ที่โฮสต์เองสำหรับเครือข่ายส่วนตัว
Runner ที่ GitHub โฮสต์มีเพียงการเข้าถึงอินเทอร์เน็ตสาธารณะเท่านั้น จึงไม่สามารถเข้าถึงทรัพยากร Azure ส่วนตัว (ฐานข้อมูล SQL และ API ภายใน) ได้ หากไม่เปิดเผยทรัพยากรเหล่านั้นต่อสาธารณะ ใช้ runner ที่โฮสต์เองบน VM ของ Azure ภายใน VNet เพื่อปรับใช้กับทรัพยากรส่วนตัว ลงทะเบียน runner โดยดาวน์โหลดเอเจนต์ runner ของ GitHub Actions กำหนดค่าด้วย URL ของที่เก็บโค้ดและโทเค็นการลงทะเบียน แล้วเรียกใช้เป็น Service ปรับขนาด runner ที่โฮสต์เองด้วย Azure Container Apps เพื่อสร้างกลุ่ม runner ที่ยืดหยุ่น
# Register a self-hosted runner on an Azure VM
# 1. Download runner (run on the VM)
curl -O -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
mkdir actions-runner && tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz -C actions-runner
cd actions-runner
# 2. Configure (use token from GitHub Settings > Actions > Runners)
./config.sh --url https://github.com/myorg/myrepo --token <REGISTRATION_TOKEN>
# 3. Run as a service
sudo ./svc.sh install && sudo ./svc.sh start
# Use in workflow
# runs-on: self-hostedตรวจสอบความเข้าใจ
ทดสอบความเข้าใจแนวคิด Microsoft Azure Fundamentals (AZ-900) จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: เวิร์กโฟลว์ GitHub Actions เป็นไฟล์ YAML ใน .github/workflows/ ที่ถูกเรียกใช้โดยเหตุการณ์ของ GitHub และทำงานบน runner, ข้อมูลประจำตัวแบบรวมศูนย์ของ OIDCช่วยให้ GitHub Actions ตรวจสอบสิทธิ์กับ Azure ได้โดยไม่ต้องใช้ข้อมูลลับ และ GitHub Environments ที่มีกฎการป้องกันเพิ่มด่านอนุมัติให้กับการปรับใช้ในสภาพแวดล้อมจริง บทเรียนนี้เป็นส่วนสุดท้ายของหลักสูตร Azure DevOps — บทถัดไปคือ Azure Monitor และ Log Analytics
คำถามที่พบบ่อย
บทเรียน “GitHub Actions บน Azure” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “GitHub Actions บน Azure” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Azure Fundamentals ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Azure Fundamentals มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “GitHub Actions บน Azure”
ทำเวิร์กโฟลว์ CI/CD ซ้ำโดยใช้ GitHub Actions กับการดำเนินการ azure/webapps-deploy และทำความเข้าใจว่าเมื่อใดควรเลือก GitHub Actions แทน Azure Pipelines คุณปฏิบัติ Azure Fundamentals ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Azure Fundamentals หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Azure Fundamentals บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “GitHub Actions บน Azure” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Azure Fundamentals นี้ได้ไหม
ได้ บทเรียน Azure Fundamentals ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมบริการ Azure DevOps
- การสร้าง CI Pipeline ด้วย Azure Pipelines
- การปรับใช้อย่างต่อเนื่องไปยัง Azure
- GitHub Actions บน Azure