github action 한 주간 만났던 문제들

junto·2024년 6월 30일
0

devops

목록 보기
9/9
post-thumbnail

1. Merge Commit과 Squah Commit에 대해 파이프라인이 중복해서 동작

on:
  pull_request:
    branches:
      - main
  • 작업 브랜치에서 main 브랜치로 pull request를 보낸다면 파이프라인으로 테스트하고, 성공적으로 완료되면 병합할 수 있게 설정하였다. 하지만, dev에 직접 commit하여 push했을 때, 빌드가 실패하지만 파이프라인을 통과하지 않기 때문에 알 수 없었다. 아래와 같이 파이프라인을 수정하였다.
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  • 이제는 직접 main에 push하더라도 빌드 실패 여부를 알 수 있었다. 하지만 pull_request를 보냈을 때 파이프라인이 1번 동작하고, 합치고 나서 병합 커밋 또는 스커시 커밋이 생성될 때 중복해서 파이프라인이 동작하는 문제가 발생했다. gitlab ci와는 다른 부분이었고, 해당 문제는 main브랜치에 직접 커밋할 수 없도록 설정하고, pull_request만 트리거 조건으로 하여 해결하였다. 브랜치 설정에서 직접 커밋을 아래와 같이 제한할 수 있다.

2. ci-pipeline과 cd-pipeline 커밋 동기화

  • ci-pipeline에서는 테스트를 진행하고, 테스트가 통과했을 때 cd-pipeline이 실행된다. cd-pipeline의 트리거 조건은 아래와 같다.
on:
  workflow_run:
    workflows: ["CI Pipeline"]
    types:
      - completed
  • ci-pipeline이 완료되었을 때 cd-pipeline이 트리거된다. ci-pipeline이 실패했을 때는 트리거하지 않도록 하기 위해 아래와 같은 옵션을 추가한다.
jobs:
  build:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
  	...
   
  deploy:
  	needs: build
    ...
  • build job은 이전 ci-pipeline이 성공했을 때 동작하도록 하며, deploy job은 build job이 성공했을 때 실행한다. 이렇게 설정하니 제대로 된다?!고 생각했고, 시간이 흐른 뒤에 서버 배포 환경에서 로컬 환경과의 차이점을 발견했다. 최신 커밋 상태로 반영이 안 된 것이다.
  • github-action은 기본적으로 default-branch를 기준으로 동작하거나 default-branch보다 앞선 커밋을 기준으로 동작한다. 로그를 분석한 결과,pull_request trigger가 있는 ci-pipeline에서는 main보다 앞선 커밋이 기본으로 적용되었고 cd-pipeline에서는 main을 기준으로 동작하고 있었다.
  • cd-pipeline 각 job에서 아래와 같이 최신 커밋으로 checkout 하게끔 수정하였다.
steps:
  - name: Checkout PR branch
	uses: actions/checkout@v4
	with:
	  ref: ${{ github.event.workflow_run.head_branch }}

3. github-action crontab 실행 시간

  • 이번에 새로 TIL 스터디에 참가하게 되었고, discord에서 인증하게 되었다. 일요일마다 주간 목표를 공유하는 데, 이때 알람 기능이 있었으면 좋겠다고 생각하여 github 호스팅 러너로 discord-webhook을 사용하기로 결정했다.

  • 테스트를 위해 1분마다 실행되게 했는데, github-action은 최소 실행 단위가 5분 단위라고 한다. 그래서 아래와 같이 스크립트를 작성해 주었다.

name: Send Discord Message

on:
  schedule:
    - cron: '*/5 * * * *' 
  workflow_dispatch:

jobs:
  sendMessage:
    runs-on: ubuntu-24.04

    steps:
      - name: Send Message to Discord Channel!
        run: |
          curl -X POST \
          -H "Content-Type: application/json" \
          -d "{\"content\": \"This is a scheduled message form Github Actions!\"}" \
          ${{ secrets.DISCORD_WEBHOOK_URL }}
  • 그런데, 5분 간격으로 호출이 되지 않았다. 스크립트를 잘못 작성한 줄 알고 수동으로 실행했는데 제대로 동작한다! 무엇이 문제일까? 불규칙적으로 동작화고, 어떨 때는 20분 이상 기다리기도 했다.
  • 공식 문서를 살펴보면, github 호스팅 러너는 공유 러너로 수요가 많은 시간에는 연기될 수 있다고 한다. 정확한 스케줄링이 필요한 작업에는 개인 러너 또는 개인 서버에서 Crontab을 적용해야 겠지만, 내게는 딱 적당했다.
    - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
  • 매주 일요일 오전 10시에 메시지를 보내려면 Asia/Seoul은 UTC+9 이므로 9시간 전에 메시지를 보내야 한다. 바쁜 시간이었는지 오전 11시에 알람이 왔다.
on:
  schedule:
    - cron: '0 1 * * 0'
profile
꾸준하게

0개의 댓글

관련 채용 정보