09. Multiple Triggers and Github Expression
จาก Workshop ที่ได้ทำไปก่อนหน้า workflow ของเราจะทำงานก็ตอนที่เรา push code เท่านั้น
เราสามารถกำหนดได้มากกว่าแค่ push
พอกำหนดได้มากกว่า 1 event เราก็จะเขียน on: แบบนี้
deploy.yaml
name: Deploy Projecton: push: workflow_dispatch: pull_request:jobs: lint: runs-on: ubuntu-latest steps: - name: Get Code uses: actions/checkout@v4 - name: Install Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.2.18 - name: Install Dependencies run: bun i - name: Run ESLint run: bun run lint deploy: needs: - lint runs-on: ubuntu-latest steps: - name: Get Code uses: actions/checkout@v4 - name: Install Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.2.18 - name: Install Dependencies run: bun i - name: Build Project run: bun run build - name: List files run: ls -l dist - name: Deploy run: echo "Deploying..."ลอง push code ดู แล้วเปิด github action ดูที่หน้าเวป
จะเห็น worflow deploy กับ lint ทำงาน
ดูที่เฉพาะ deploy workflow จะเห็นว่ามีปุ่มให้เรากด Run แบบ manual อยู่ด้วย
เพราะว่าเราใส่ event workflow_dispatch: เข้าไปนั่นเอง
แต่พอมาดู lint workflow จะไม่มีปุ่มให้เรากด Run แบบ manual
Github Context
GitHub Context คืออะไร
GitHub Context คือข้อมูลที่ GitHub Actions จัดเตรียมให้เกี่ยวกับ workflow run, environment, jobs, และ steps ที่กำลังทำงานอยู่ในขณะนั้น
ใช้ทำอะไร • เข้าถึงข้อมูล workflow เช่น ชื่อ branch, commit SHA, ชื่อ repository • ตัดสินใจเงื่อนไข ในการรัน jobs หรือ steps • ส่งผ่านข้อมูล ระหว่าง steps หรือ jobs • จัดการ secrets และ environment variables
ตัวอย่าง GitHub Context ที่ใช้บ่อย
-
github.event_nameชื่อของ event ที่ trigger workflow (push, pull_request, schedule, etc.) -
github.refชื่อเต็มของ branch หรือ tag ที่ trigger workflow -
github.ref_nameชื่อสั้นของ branch หรือ tag (ไม่รวม refs/heads/ หรือ refs/tags/) -
github.shaSHA ของ commit ที่ trigger workflow -
github.repositoryชื่อเต็มของ repository ในรูปแบบ owner/repository-name -
github.actorชื่อผู้ใช้ที่ trigger workflow -
github.run_idID เฉพาะของ workflow run -
github.run_numberหมายเลขลำดับของ workflow run -
github.workspacepath ของ directory ที่ runner ใช้งาน -
github.tokentoken สำหรับ authentication กับ GitHub API -
github.event.pull_request.numberหมายเลข pull request (ใช้ได้เมื่อ event เป็น pull_request) -
github.head_refชื่อ branch ของ pull request (source branch) -
github.base_refชื่อ branch ปลายทางของ pull request (target branch) -
github.repository_ownerชื่อเจ้าของ repository -
github.jobชื่อของ job ปัจจุบัน
มีอีกเยอะมาก ไปดูได้ที่ GitHub Context
แคปมาให้ดูบางส่วนแบบนี้
Github expression
GitHub Expressions คืออะไร? GitHub Expressions คือ syntax พิเศษที่ใช้ใน GitHub Actions เพื่อเข้าถึงข้อมูล context, variables, และ functions ต่างๆ ในระหว่างการทำงานของ workflow
รูปแบบการใช้งาน
${{ expression }}ตัวอย่าง GitHub Expressions ที่ใช้บ่อย
- github context
# เข้าถึงข้อมูล repository และ event
${{ github.repository }} # ชื่อ repo (owner/repo-name)${{ github.ref }} # branch/tag reference${{ github.sha }} # commit SHA${{ github.actor }} # ผู้ที่ trigger workflow${{ github.event_name }} # ประเภท event (push, pull_request)ตัวอย่างการใช้:
- name: Show repo info run: echo "Repository: ${{ github.repository }}"- env context
# เข้าถึง environment variables
${{ env.NODE_VERSION }}${{ env.DATABASE_URL }}ตัวอย่างการใช้:
env:NODE_VERSION: "18"steps:
- name: Setup Node uses: actions/setup-node@v3 with: node-version: ${{ env.NODE_VERSION }}- secrets context
# เข้าถึง secrets ที่เก็บไว้ใน repository
${{ secrets.API_KEY }}${{ secrets.DATABASE_PASSWORD }}ตัวอย่างการใช้:
- name: Deploy run: deploy.sh env: API_KEY: ${{ secrets.API_KEY }}- matrix context
# ใช้กับ strategy matrix
${{ matrix.os }}${{ matrix.node-version }}ตัวอย่างการใช้:
strategy:matrix:os: [ubuntu-latest, windows-latest]node-version: [16, 18]steps:
- name: Test on ${{ matrix.os }} run: npm test- steps context
# เข้าถึงผลลัพธ์จาก step ก่อนหน้า
${{ steps.step-id.outputs.result }}${{ steps.step-id.conclusion }}ตัวอย่างการใช้:
- id: get-version run: echo "version=1.0.0" >> $GITHUB_OUTPUT- name: Use version run: echo "Version is ${{ steps.get-version.outputs.version }}"- Functions ที่ใช้บ่อย
contains()
# ตรวจสอบว่ามีข้อความที่ต้องการหรือไม่
${{ contains(github.ref, 'main') }}startsWith() / endsWith()
${{ startsWith(github.ref, 'refs/tags/') }} # ตรวจสอบ tag${{ endsWith(github.ref, '/main') }} # ตรวจสอบ main branchformat()
${{ format('Hello {0}!', github.actor) }} # จัดรูปแบบข้อความใน Workflow ของเรามี Metadata อะไรอยู่บ้าง
ในโปรเจคเดิม เราจะเพิ่ม workflow แล้วให้มันพ่น context ที่ Github เตรียมไว้แบบนี้
.github/workflows/github-context.yml
name: See Github Contexton: workflow_dispatch:jobs: context: runs-on: ubuntu-latest steps: - name: Get Github Context run: echo "${{ toJSON(github) }}"push code ได้เลย แล้วไปกดให้ workflow ทำงานด้วยมือ
ลองเปิดดูจะเห็นว่ามี data เยอะมากๆ ที่ Github เตรียมไว้ให้เราใช้