안녕하세요, 프로젝트를 하던 중 주기적으로 main에 배포를 해줘야하는 상황이 반복되어 제가 편하려고(!) 자동으로 배포하는 action을 만드려 합니다.
제가 참고한 글은 카카오웹툰은 GitHub Actions를 어떻게 사용하고 있을까? 입니다.
먼저 workflows 폴더 안에 merge-to-main.yml 파일을 생성해준 뒤 아래의 코드를 입력합니다.
저는 매주 월요일, 수요일 UTC+9 기준으로 9시에 받도록 설정했습니다.
name: Merge to Main
on:
schedule:
- cron: '0 0 * * 1,3' # 매주 월요일(1)과 수요일(3) 9:00 시에 실행되도록 스케줄 설정 (Cron 표현식)
jobs:
merge-to-main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Merge to Main
run: |
git checkout main
git merge dev --no-ff --no-edit
git push origin main
Slack을 이용해 알림을 받고싶기 때문에 여기서 SLACK_INCOMING_URL
에 입력할 url을 생성해줍니다.
action을 추가하려는 리포지토리의 setting에서 시크릿 키로 설정해줍니다.
여기서 Actions와 Codespaces, Dependabot 세 종류가 있는데
GitHub Actions는
GitHub Codespaces는
Dependabot은
저는 의존성을 최신 상태로 유지하려는 목적이기 때문에 Dependabot에 SLACK_INCOMING_URL
를 설정합니다.
이후
.github/actions/slack-notify 안에 action.yml 파일을 만들어 아래의 코드를 입력합니다.
name: 'slack-notify'
inputs:
status:
required: false
default: 'failure'
slack_incoming_url:
required: true
runs:
using: 'composite'
steps:
- name: Send slack
shell: bash
run: |
if [ "${{ inputs.status }}" = "success" ]; then
EMOTICON="✅"
else
EMOTICON="⛔"
fi
MSG="{ \"username\": \"mergebot\",\"text\":\">${EMOTICON} workflow (<https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}|${GITHUB_WORKFLOW}>) in <https://github.com/${GITHUB_REPOSITORY}|${GITHUB_REPOSITORY}>\n><https://github.com/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks|${GITHUB_JOB}> job ${{ inputs.status }}, branch=\`${GITHUB_REF#refs/heads/}\`\", \"icon_emoji\": \":ghost:\"}"
curl -X POST -H 'Content-type: application/json' --data "${MSG}" "${{ inputs.slack_incoming_url }}"
기존의 merge-to-main.yml에 아래의 코드를 추가해줍시다.
- name: Send slack when failed
if: ${{ failure() }}
uses: ./.github/actions/slack-notify
with:
slack_incoming_url: ${{ secrets.SLACK_INCOMING_URL }}
- name: Send slack if completed
if: ${{ success() }}
uses: ./.github/actions/slack-notify
with:
status: success
slack_incoming_url: ${{ secrets.SLACK_INCOMING_URL }}
결과!
# merge-to-main.yml
name: Merge to Main
on:
schedule:
- cron: '0 0 * * 1,3' # 매주 월요일(1)과 수요일(3) 9:00 시에 실행되도록 스케줄 설정 (Cron 표현식)
jobs:
merge-to-main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Merge to Main
run: |
git checkout main
git merge dev --no-ff --no-edit
git push origin main
- name: Send slack when failed
if: ${{ failure() }}
uses: ./.github/actions/slack-notify
with:
slack_incoming_url: ${{ secrets.SLACK_INCOMING_URL }}
- name: Send slack if completed
if: ${{ success() }}
uses: ./.github/actions/slack-notify
with:
status: success
slack_incoming_url: ${{ secrets.SLACK_INCOMING_URL }}
작동은 하지만..
만약 Branch protection rules가 적용되어있다면 작동이 안되어서 저는 사용못했습니다.. 😭