[Github Actions] dev->main 정해진 날에 자동 Merge하기 + fork한 리포지토리 자동 업데이트

안녕하세요, 프로젝트를 하던 중 주기적으로 main에 배포를 해줘야하는 상황이 반복되어 제가 편하려고(!) 자동으로 배포하는 action을 만드려 합니다.
제가 참고한 글은 카카오웹툰은 GitHub Actions를 어떻게 사용하고 있을까? 입니다.

Github Action이란?

  • CI/CD 같은 workflow를 자동화할 수 있는 도구
  • Github에서 특정 이벤트 발생시 (push, pull, merge ...) 정해놓은 동작을 실행시키는 도구

Dev -> Main으로 자동 Merge하기


먼저 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으로 결과 알림 받기 Action 만들기

Slack을 이용해 알림을 받고싶기 때문에 여기 SLACK_INCOMING_URL에 입력할 url을 생성해줍니다.

action을 추가하려는 리포지토리의 setting에서 시크릿 키로 설정해줍니다.

여기서 Actions와 Codespaces, Dependabot 세 종류가 있는데

GitHub Actions는

  • 워크플로우 자동화 도구로, 코드를 빌드하고 테스트하며, 배포하는 등의 작업을 자동화할 수 있게 해주는 도구입니다.
  • 사용자가 지정한 이벤트에 따라 작업을 실행할 수 있으며, CI/CD (Continuous Integration/Continuous Deployment)를 구현하는 데 사용됩니다.
  • 사용자가 워크플로우를 직접 작성하고 설정하여 원하는 작업을 수행할 수 있습니다.

GitHub Codespaces는

  • 클라우드 기반의 통합 개발 환경을 제공합니다.
  • 사용자는 웹 브라우저나 Visual Studio Code에서 GitHub 저장소를 열고, 코드를 편집하고 실행할 수 있습니다.
  • Codespaces를 사용하면 별도의 개발 환경 설정이 필요 없이, 클라우드에서 개발을 진행할 수 있습니다. 특정 기기나 환경에 종속되지 않고 어디서나 코드 작업을 시작하고 이어나갈 수 있습니다.

Dependabot은

  • 프로젝트의 의존성 관리를 지원하는 서비스입니다.
  • 프로젝트의 종속성(라이브러리, 패키지 등)을 모니터링하고, 보안 취약점이나 새로운 버전이 나오면 해당 의존성을 업데이트합니다.
  • 주로 보안 패치를 신속하게 적용하거나 최신 기능을 채택하기 위해 사용됩니다.
  • 자동으로 Pull Request를 생성하여 의존성을 최신 상태로 유지하는 데 도움이 됩니다.

저는 의존성을 최신 상태로 유지하려는 목적이기 때문에 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 }}"

Slack으로 결과 알림 받기 추가!

기존의 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 }}

'개발 공부 > Github' 카테고리의 다른 글

깃허브 커밋을 위한 명령어  (0) 2024.08.05