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.sha
SHA ของ commit ที่ trigger workflow -
github.repository
ชื่อเต็มของ repository ในรูปแบบ owner/repository-name -
github.actor
ชื่อผู้ใช้ที่ trigger workflow -
github.run_id
ID เฉพาะของ workflow run -
github.run_number
หมายเลขลำดับของ workflow run -
github.workspace
path ของ directory ที่ runner ใช้งาน -
github.token
token สำหรับ 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 branch
format()
${{ 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 เตรียมไว้ให้เราใช้
