Pre-Condition
const eventType = github.event_name === 'push'
? `trigger-from-$main`
: `trigger-from-pr-merge`;
Main branch
name: Trigger-docker
on:
push:
branches:
- main
pull_request:
branches:
- main
types:
- closed
workflow_dispatch:
jobs:
trigger-docker:
runs-on: ubuntu-latest
steps:
# Step 1: Check if PR is Merged
- name: Check if PR is Merged
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.merged == true }}
run: echo "PR merged into main branch: ${{ github.event.pull_request.base.ref }}"
# Step 2: Trigger Repository Dispatch
- name: Trigger TA-Docker Workflow for Main
if: ${{ github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) }}
uses: actions/github-script@v6
with:
script: |
const isPush = github.event_name === 'push';
const isPrMerge = github.event_name === 'pull_request' && github.event.pull_request.merged === true;
const branch = 'main';
const eventType = isPush
? `trigger-from-push-main`
: `trigger-from-pr-merge`;
const payload = {
branch: branch,
action_type: github.event_name,
pr_number: isPrMerge ? github.event.pull_request.number : null,
merged_by: isPrMerge ? github.event.pull_request.merged_by.login : null
};
await github.rest.repos.createDispatchEvent({
owner: 'junbang-nsuslab',
repo: 'TA-Docker',
event_type: eventType,
client_payload: payload
});
Trigger 수신 → ta-docker
repository_dispatch:
types:
- trigger-from-push-main
- trigger-from-pr-merge
TA-Docker Job 실행
name: CI/CD workflow
on:
push:
branches:
- main
pull_request:
branches:
- main
types:
- closed
workflow_dispatch:
repository_dispatch:
types:
- trigger-from-push-main
- trigger-from-pr-merge
jobs:
trigger-condition:
runs-on: ubuntu-latest
steps:
- name: Skip if not Push, PR Merged, or repository_dispatch
if: ${{ !(github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) || github.event_name == 'repository_dispatch') }}
run: |
echo "This is not a supported event. Skipping..."
exit 0
- name: Log Trigger Event
run: |
if [[ ${{ github.event_name }} == "push" ]]; then
echo "Push detected on branch: ${{ github.ref }}"
elif [[ ${{ github.event_name }} == "pull_request" ]]; then
echo "PR Merged into branch: ${{ github.event.pull_request.base.ref }}"
elif [[ ${{ github.event_name }} == "repository_dispatch" ]]; then
echo "Triggered by repository_dispatch event."
echo "Event type: ${{ github.event.action }}"
fi
trigger-docker:
runs-on: ubuntu-latest
steps:
- name: Handle repository_dispatch Event
if: ${{ github.event_name == 'repository_dispatch' }}
run: |
echo "Handling repository_dispatch event..."
echo "Branch: ${{ github.event.client_payload.branch }}"
echo "Action Type: ${{ github.event.client_payload.action_type }}"
pr-label-and-push-check ta-docker
pr-label-and-push-check:
needs: trigger-condition
runs-on: ubuntu-latest
steps:
- name: Identify Changed Service (Push)
if: ${{ github.event_name == 'push' }}
run: |
CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }})
echo "Changed files: $CHANGED_FILES"
if echo "$CHANGED_FILES" | grep -q '^backend/'; then
echo "BUILD_BACKEND=true" >> $GITHUB_ENV
else
echo "BUILD_BACKEND=false" >> $GITHUB_ENV
fi
if echo "$CHANGED_FILES" | grep -q '^frontend/'; then
echo "BUILD_FRONTEND=true" >> $GITHUB_ENV
else
echo "BUILD_FRONTEND=false" >> $GITHUB_ENV
if: ${{ github.event_name == 'push' }}
run: |
echo "Backend build required: ${{ env.BUILD_BACKEND }}"
echo "Frontend build required: ${{ env.BUILD_FRONTEND }}"
CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }})
PR_LABELS=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/$%7B%7B github.repository }}/issues/${{ github.event.pull_request.number }}/labels | jq -r '.[].name')
if echo "$CHANGED_FILES" | grep -q '^backend/'
echo "BUILD_BACKEND=false" >> $GITHUB_ENV
- name: Check PR Labels
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.merged == true }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_LABELS=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels | jq -r '.[].name')
echo "PR Labels: $PR_LABELS"
if echo "$PR_LABELS" | grep -q "backend"; then
echo "BUILD_BACKEND=true" >> $GITHUB_ENV
else
echo "BUILD_BACKEND=false" >> $GITHUB_ENV
fi
if echo "$PR_LABELS" | grep -q "frontend"; then
echo "BUILD_FRONTEND=true" >> $GITHUB_ENV
else
echo "BUILD_FRONTEND=false" >> $GITHUB_ENV
- name: Log PR Label Match Results
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.merged == true }}
run: |
echo "Backend build required: ${{ env.BUILD_BACKEND }}"
echo "Frontend build required: ${{ env.BUILD_FRONTEND }}"