Skip to content
CodeSook
CodeSook

09. Multiple Triggers and Github Expression


จาก Workshop ที่ได้ทำไปก่อนหน้า workflow ของเราจะทำงานก็ตอนที่เรา push code เท่านั้น

เราสามารถกำหนดได้มากกว่าแค่ push พอกำหนดได้มากกว่า 1 event เราก็จะเขียน on: แบบนี้

deploy.yaml
deploy.yaml
name: Deploy Project
on:
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 ที่ใช้บ่อย

  1. github.event_name ชื่อของ event ที่ trigger workflow (push, pull_request, schedule, etc.)

  2. github.ref ชื่อเต็มของ branch หรือ tag ที่ trigger workflow

  3. github.ref_name ชื่อสั้นของ branch หรือ tag (ไม่รวม refs/heads/ หรือ refs/tags/)

  4. github.sha SHA ของ commit ที่ trigger workflow

  5. github.repository ชื่อเต็มของ repository ในรูปแบบ owner/repository-name

  6. github.actor ชื่อผู้ใช้ที่ trigger workflow

  7. github.run_id ID เฉพาะของ workflow run

  8. github.run_number หมายเลขลำดับของ workflow run

  9. github.workspace path ของ directory ที่ runner ใช้งาน

  10. github.token token สำหรับ authentication กับ GitHub API

  11. github.event.pull_request.number หมายเลข pull request (ใช้ได้เมื่อ event เป็น pull_request)

  12. github.head_ref ชื่อ branch ของ pull request (source branch)

  13. github.base_ref ชื่อ branch ปลายทางของ pull request (target branch)

  14. github.repository_owner ชื่อเจ้าของ repository

  15. github.job ชื่อของ job ปัจจุบัน

มีอีกเยอะมาก ไปดูได้ที่ GitHub Context

แคปมาให้ดูบางส่วนแบบนี้

Github expression

GitHub Expressions คืออะไร? GitHub Expressions คือ syntax พิเศษที่ใช้ใน GitHub Actions เพื่อเข้าถึงข้อมูล context, variables, และ functions ต่างๆ ในระหว่างการทำงานของ workflow

รูปแบบการใช้งาน

Terminal window
${{ expression }}

ตัวอย่าง GitHub Expressions ที่ใช้บ่อย

  1. github context
Terminal window
# เข้าถึงข้อมูล 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)

ตัวอย่างการใช้:

Terminal window
- name: Show repo info
run: echo "Repository: ${{ github.repository }}"

  1. env context
Terminal window
# เข้าถึง environment variables
${{ env.NODE_VERSION }}
${{ env.DATABASE_URL }}

ตัวอย่างการใช้:

Terminal window
env:
NODE_VERSION: "18"
steps:
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}

  1. secrets context
Terminal window
# เข้าถึง secrets ที่เก็บไว้ใน repository
${{ secrets.API_KEY }}
${{ secrets.DATABASE_PASSWORD }}

ตัวอย่างการใช้:

Terminal window
- name: Deploy
run: deploy.sh
env:
API_KEY: ${{ secrets.API_KEY }}

  1. matrix context
Terminal window
# ใช้กับ strategy matrix
${{ matrix.os }}
${{ matrix.node-version }}

ตัวอย่างการใช้:

Terminal window
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16, 18]
steps:
- name: Test on ${{ matrix.os }}
run: npm test

  1. steps context
Terminal window
# เข้าถึงผลลัพธ์จาก step ก่อนหน้า
${{ steps.step-id.outputs.result }}
${{ steps.step-id.conclusion }}

ตัวอย่างการใช้:

Terminal window
- id: get-version
run: echo "version=1.0.0" >> $GITHUB_OUTPUT
- name: Use version
run: echo "Version is ${{ steps.get-version.outputs.version }}"

  1. Functions ที่ใช้บ่อย

contains()

Terminal window
# ตรวจสอบว่ามีข้อความที่ต้องการหรือไม่
${{ contains(github.ref, 'main') }}

startsWith() / endsWith()

Terminal window
${{ startsWith(github.ref, 'refs/tags/') }} # ตรวจสอบ tag
${{ endsWith(github.ref, '/main') }} # ตรวจสอบ main branch

format()

Terminal window
${{ format('Hello {0}!', github.actor) }} # จัดรูปแบบข้อความ

ใน Workflow ของเรามี Metadata อะไรอยู่บ้าง

ในโปรเจคเดิม เราจะเพิ่ม workflow แล้วให้มันพ่น context ที่ Github เตรียมไว้แบบนี้

.github/workflows/github-context.yml
github-context.yaml
name: See Github Context
on:
workflow_dispatch:
jobs:
context:
runs-on: ubuntu-latest
steps:
- name: Get Github Context
run: echo "${{ toJSON(github) }}"

push code ได้เลย แล้วไปกดให้ workflow ทำงานด้วยมือ

ลองเปิดดูจะเห็นว่ามี data เยอะมากๆ ที่ Github เตรียมไว้ให้เราใช้