Thuta Learning
CI/CD with GitHub Actions
BasicDevOps & Toolsbeginner

Triggers: Workflow ဘယ်အချိန် Run မလဲ ဆုံးဖြတ်ခြင်း

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Triggers: Workflow ဘယ်အချိန် Run မလဲ ဆုံးဖြတ်ခြင်း concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • Diagram ကို ဖတ်ပြီး pipeline ထဲမှာ job တွေ ဘယ်လိုစီးဆင်းပြီး ဘာက gate လုပ်သလဲ ခြေရာခံနိုင်ရန်
  • Workflow file ကို ဖတ်ပြီး ဘယ် job တွေ ဘယ်အစဉ်လိုက် run မလဲ ကြိုတင်ပြောနိုင်ရန်

နားလည်ထားရမယ့် အချက်

on: key က workflow ကို ဘယ်အခိုက်အတန့်မှာ run မလဲ ဆုံးဖြတ်ပေးပါတယ်။ အသုံးအများဆုံး လေးမျိုးက - push (commit တွေ branch တစ်ခုပေါ် ရောက်လာတိုင်း)၊ pull_request (PR ဖွင့်တာ၊ commit အသစ်တင်တာ၊ ပြန်ဖွင့်တာ)၊ schedule (cron expression နဲ့ အချိန်ဇယားအလိုက်၊ UTC အချိန်ဖြစ်ပါတယ်)၊ နဲ့ workflow_dispatch (Actions tab ကနေ လူကိုယ်တိုင် နှိပ်ပြီး run တာ) တို့ပါ။ event တစ်ခုစီမှာ filter တွေ ထည့်နိုင်ပါတယ်။ branches က ဘယ် branch တွေအတွက်လဲ ကန့်သတ်ပေးပြီး၊ paths နဲ့ paths-ignore က commit ထဲမှာ ဘယ် file တွေ ပါလာမှ run မလဲ ကန့်သတ်ပေးပါတယ်။

Path filter တွေဟာ အလှဆင်မှု မဟုတ်ပါဘူး - monorepo မှာ တကယ့် ငွေကြေး ကိစ္စပါ။ apps/web, apps/mobile, packages/api ရှိတဲ့ repo တစ်ခုမှာ README တစ်ကြောင်း ပြင်ရုံနဲ့ e2e suite တစ်ခုလုံး run နေရင် ကုန်ကျစရိတ်နဲ့ engineer တွေရဲ့ စောင့်ချိန် နှစ်ခုလုံး ဆုံးရှုံးပါတယ်။ paths: ['apps/web/**'] လိုမျိုး ထည့်လိုက်ရုံနဲ့ မဆိုင်တဲ့ run တွေ ပျောက်သွားပါတယ်။ သတိထားရမှာက required status check တစ်ခုကို path filter နဲ့ ကန့်သတ်ထားရင် အဲဒီ check က မ run တဲ့အခါ PR က "expected" အဆင့်မှာ ထာဝရ ငေးနေတတ်ပါတယ်။

နောက်ဆုံးအချက်က အရေးအကြီးဆုံးပါ။ pull_request event က သင့် branch ရဲ့ နောက်ဆုံး commit ပေါ်မှာ တိုက်ရိုက် run တာ မဟုတ်ပါဘူး။ GitHub က သင့် branch ကို base branch (များသောအားဖြင့် main) နဲ့ ပေါင်းထားတဲ့ ယာယီ merge commit တစ်ခု ဆောက်ပြီး အဲဒါပေါ်မှာ run ပါတယ်။ ဒါက အလွန်ကောင်းတဲ့ အလုပ်ပါ - merge ပြီးရင် ဘယ်လိုဖြစ်မလဲဆိုတာကို ကြိုစစ်ပေးလို့ပါ။ ဒါပေမယ့် အံ့အားသင့်စရာ နှစ်ခု ပါလာပါတယ် - github.sha က သင့် commit မဟုတ်ဘဲ merge commit ရဲ့ sha ဖြစ်နေတယ် (သင့်ဟာက github.event.pull_request.head.sha ပါ)၊ ပြီးတော့ ကိုယ့် branch မှာ ဘာမှ မပြင်ဘဲနဲ့ main က ပြောင်းသွားလို့ CI ကျရှုံးသွားနိုင်ပါတယ်။ ဒါဟာ bug မဟုတ်ဘဲ ရည်ရွယ်ချက်ရှိရှိ ဒီဇိုင်းဆွဲထားတာပါ။

text
EVENTS THROUGH FILTER GATES INTO WORKFLOWS
------------------------------------------
  EVENT                  FILTER GATE               RESULT
  ------------------     -------------------       --------------
  push to main       --> [ branches: main ]    --> deploy.yml runs
  push to feat/login --> [ branches: main ]    --X no run
  PR touching web/   --> [ paths: web/** ]     --> ci.yml runs
  PR touching docs/  --> [ paths: web/** ]     --X no run
  cron 0 3 * * 1     --> [ no filter ]         --> nightly.yml runs
  manual button      --> [ workflow_dispatch ] --> release.yml runs


  WHAT pull_request ACTUALLY CHECKS OUT

     your branch head            base branch (main)
     +----------------+          +----------------+
     |  commit abc123 |          |  commit 9f8e7d |
     +----------------+          +----------------+
              |                          |
              +------------+-------------+
                           v
              +-----------------------------+
              | temporary MERGE COMMIT      |  <-- CI runs here
              | github.sha points to THIS   |
              +-----------------------------+

  your own commit is at: github.event.pull_request.head.sha

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

အောက်က workflow မှာ trigger လေးမျိုးလုံး ပါဝင်ပါတယ်။ push အပိုင်းမှာ branches နဲ့ paths နှစ်ခုလုံး ရှိပါတယ် - နှစ်ခုစလုံး ကိုက်မှသာ run ပါတယ်။ ဆိုလိုတာက main ပေါ်ကို push လုပ်ပေမယ့် apps/web/ အောက်မှာ ဘာမှ မပြောင်းရင် workflow က မ run ပါဘူး။ .github/workflows/** ကို paths ထဲ ထည့်ထားတာက အရေးကြီးပါတယ် - workflow ကိုယ်တိုင်ကို ပြင်တဲ့အခါ အဲဒီ ပြင်ဆင်မှုက အလုပ်လုပ်မလုပ် ချက်ချင်း သိရဖို့ပါ။

pull_request မှာတော့ paths-ignore နဲ့ '**.md' ကို ချန်ထားလိုက်ပါတယ် - documentation သက်သက် ပြင်တဲ့ PR တွေအတွက် CI ကို မ run တော့ပါဘူး။ schedule က cron '0 3 * * 1' ဖြစ်လို့ တနင်္လာနေ့တိုင်း UTC နံနက် ၃ နာရီမှာ run ပါတယ်။ ဒါက local time မဟုတ်ဘူးဆိုတာ သတိထားပါ - မြန်မာစံတော်ချိန်နဲ့ဆို မွန်းလွဲ ၉:၃၀ ဖြစ်ပါတယ်။

workflow_dispatch မှာ environment ဆိုတဲ့ choice input ထည့်ထားပါတယ်။ ဒါကြောင့် Actions tab မှာ Run workflow ကို နှိပ်တဲ့အခါ staging ဒါမှမဟုတ် production ကို ရွေးလို့ရတဲ့ dropdown ပေါ်လာပါတယ်၊ အဲဒီတန်ဖိုးကို ${{ inputs.environment }} နဲ့ ဖတ်နိုင်ပါတယ်။ dispatch မဟုတ်တဲ့ run တွေမှာ ဒီတန်ဖိုးက ဗလာ ဖြစ်နေမှာမို့ လက်တွေ့မှာ ${{ inputs.environment || 'staging' }} လိုမျိုး fallback ပေးလေ့ရှိပါတယ်။

အတူတူ စမ်းရေးကြည့်မယ်

yaml
name: Triggers

on:
  push:
    branches:
      - main
      - 'release/**'
    paths:
      - 'apps/web/**'
      - '.github/workflows/**'
  pull_request:
    branches: [main]
    paths-ignore:
      - '**.md'
      - 'docs/**'
  schedule:
    - cron: '0 3 * * 1'
  workflow_dispatch:
    inputs:
      environment:
        description: Which environment to target
        type: choice
        default: staging
        options:
          - staging
          - production

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

      - name: Show what triggered this run
        run: |
          echo "event:  ${{ github.event_name }}"
          echo "ref:    ${{ github.ref }}"
          echo "sha:    ${{ github.sha }}"
          echo "target: ${{ inputs.environment || 'staging' }}"
You should see
ဒီ workflow က အခြေအနေ လေးမျိုးမှာ run ပါတယ် - main သို့မဟုတ် release/* branch ပေါ်ကို push လုပ်ပြီး apps/web/ သို့မဟုတ် .github/workflows/ အောက်က file တစ်ခုခု ပါလာမှ၊ main ကို target ထားတဲ့ pull_request ဖွင့်/update လုပ်ပြီး .md နဲ့ docs/ ချည်းသက်သက် မဟုတ်မှ၊ တနင်္လာနေ့တိုင်း UTC ၀၃:၀၀ မှာ၊ ဒါမှမဟုတ် Actions tab က Run workflow ခလုတ်ကို လူကိုယ်တိုင် နှိပ်တဲ့အခါပါ။ ဘယ်အခြေအနေမှာမဆို report job တစ်ခုတည်းသာ run ပြီး trigger အချက်အလက်တွေကို log ထဲ echo လုပ်ပါတယ်။ push run မှာ github.sha က push လုပ်လိုက်တဲ့ commit ဖြစ်ပြီး၊ pull_request run မှာတော့ GitHub ဆောက်ပေးထားတဲ့ ယာယီ merge commit ရဲ့ sha ဖြစ်ပါတယ်။ manual run မှ မဟုတ်ရင် inputs.environment က ဗလာဖြစ်လို့ fallback တန်ဖိုး staging ကို ပြပါတယ်။

၅ မိနစ် စမ်းကြည့်

ဒီ workflow ကို repository တစ်ခုမှာ ထည့်ပါ။ ပထမ docs/notes.md တစ်ခုပဲ ပြင်ပြီး main ကို push လုပ်ပါ - run ဖြစ်လား မဖြစ်ဘူးလား ကြိုခန့်မှန်းပြီးမှ Actions tab မှာ စစ်ကြည့်ပါ။ ပြီးရင် apps/web/ အောက်က file တစ်ခု ပြင်ပြီး ထပ်ပြီး push လုပ်ပါ။ နောက်ဆုံးမှာ Run workflow ခလုတ်ကနေ production ကို ရွေးပြီး manual run လုပ်ကြည့်ပြီး log ထဲက target: တန်ဖိုး ဘယ်လို ပြောင်းသွားလဲ နှိုင်းယှဉ်ပါ။

သတိလေးတစ်ချက်

cron ကို ကိုယ့် local time လို့ ထင်တာ - GitHub က UTC ချည်းပဲ ဖတ်လို့ '0 9 * * *' က မြန်မာအချိန် ညနေ ၃:၃၀ ဖြစ်နေပါတယ်။

branch protection က required လို့ သတ်မှတ်ထားတဲ့ check တစ်ခုကို paths filter နဲ့ ကန့်သတ်လိုက်တာ - path မကိုက်တဲ့ PR တွေက report မလာလို့ "Expected" အဆင့်မှာ ထာဝရ ငြိနေပါတယ်။

GitHub Docs - Events that trigger workflowsCI/CD with GitHub Actions

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • cron ကို ကိုယ့် local time လို့ ထင်တာ - GitHub က UTC ချည်းပဲ ဖတ်လို့ '0 9 * * *' က မြန်မာအချိန် ညနေ ၃:၃၀ ဖြစ်နေပါတယ်။
  • branch protection က required လို့ သတ်မှတ်ထားတဲ့ check တစ်ခုကို paths filter နဲ့ ကန့်သတ်လိုက်တာ - path မကိုက်တဲ့ PR တွေက report မလာလို့ "Expected" အဆင့်မှာ ထာဝရ ငြိနေပါတယ်။
  • Workflow ကို production branch ပေါ် တိုက်ရိုက်မစမ်းဘဲ branch (သို့) test repository တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

ဒီ workflow ကို repository တစ်ခုမှာ ထည့်ပါ။ ပထမ docs/notes.md တစ်ခုပဲ ပြင်ပြီး main ကို push လုပ်ပါ - run ဖြစ်လား မဖြစ်ဘူးလား ကြိုခန့်မှန်းပြီးမှ Actions tab မှာ စစ်ကြည့်ပါ။ ပြီးရင် apps/web/ အောက်က file တစ်ခု ပြင်ပြီး ထပ်ပြီး push လုပ်ပါ။ နောက်ဆုံးမှာ Run workflow ခလုတ်ကနေ production ကို ရွေးပြီး manual run လုပ်ကြည့်ပြီး log ထဲက target: တန်ဖိုး ဘယ်လို ပြောင်းသွားလဲ နှိုင်းယှဉ်ပါ။

You'll know it worked when: ဒီ workflow က အခြေအနေ လေးမျိုးမှာ run ပါတယ် - main သို့မဟုတ် release/* branch ပေါ်ကို push လုပ်ပြီး apps/web/ သို့မဟုတ် .github/workflows/ အောက်က file တစ်ခုခု ပါလာမှ၊ main ကို target ထားတဲ့ pull_request ဖွင့်/update လုပ်ပြီး .md နဲ့ docs/ ချည်းသက်သက် မဟုတ်မှ၊ တနင်္လာနေ့တိုင်း UTC ၀၃:၀၀ မှာ၊ ဒါမှမဟုတ် Actions tab က Run workflow ခလုတ်ကို လူကိုယ်တိုင် နှိပ်တဲ့အခါပါ။ ဘယ်အခြေအနေမှာမဆို report job တစ်ခုတည်းသာ run ပြီး trigger အချက်အလက်တွေကို log ထဲ echo လုပ်ပါတယ်။ push run မှာ github.sha က push လုပ်လိုက်တဲ့ commit ဖြစ်ပြီး၊ pull_request run မှာတော့ GitHub ဆောက်ပေးထားတဲ့ ယာယီ merge commit ရဲ့ sha ဖြစ်ပါတယ်။ manual run မှ မဟုတ်ရင် inputs.environment က ဗလာဖြစ်လို့ fallback တန်ဖိုး staging ကို ပြပါတယ်။

Triggers: Workflow ဘယ်အချိန် Run မလဲ ဆုံးဖြတ်ခြင်း | Thuta Learning