IT/CI CD

GitHub Actions concurrency, 이제 queue: max로 배포 잡 겹침 막자

gfrog 2026. 7. 15. 06:14

오늘 알게 된 건데, GitHub Actions에 queue: max 옵션이 생겼다. 5월 초에 조용히 릴리즈된 것 같다. 이거 모르는 분 꽤 많을 것 같아서 짧게 정리한다.

기존 방식의 아쉬움

우리 팀은 배포 파이프라인에 concurrency 그룹을 걸어 놨었다. 같은 환경에 두 개가 동시에 배포되면 곤란하니까.

concurrency:
  group: deploy-${{ github.ref }}
  cancel-in-progress: false

문제는 이 설정으로 큐잉되는 최대 개수가 딱 1개였다는 거다. 진행 중 1개 + 대기 중 1개, 총 2개까지만. 세 번째 잡이 들어오면 대기 중이던 잡이 그냥 취소됐다. 배포 트리거가 몰리는 날에는 중간 잡이 스킵돼 버려서, PR 머지 순서움 실제 배포 순서가 어긋나는 상황이 종종 생겼다. 팀 슬랙에서 "어? 내 PR은 왜 배포 안 됐지?" 같은 질문이 잊을 만하면 튀어나왔다.

queue: max

5월 릴리즈부터 그룹당 최대 100개까지 큐잉이 가능해졌다. 설정은 이렇게 한다.

concurrency:
  group: deploy-${{ github.ref }}
  cancel-in-progress: false
  queue: max

cancel-in-progressfalse이거나 미설정일 때만 동작한다. cancel-in-progress: true랑 같이 쓰면 의미가 없으니까(어차피 대기 중인 걸 취소하니까) 조합이 안 된다.

한 가지 주의할 점. 큐잉된 잡은 큐 자리를 차지하는 동안에도 워크플로 실행 시간 한도(usage limit)에 잡히지않지만, 큐가 100개를 넘으면 그때부터는 다시옻뒠처럼 취소가 발생한다. 대럵 배포가 몰리는 프로젝트는 워크하로 트리 거 자체를 좀 더 좁게 잡는 편이 낛다.

실무에서 ��는 퍁

배포 워크플로와 하나만 예로 들면 이렇게 쓴다.

name: Deploy Production
on:
  push:
    branches: [main]

concurrency:
  group: deploy-prod
  cancel-in-progress: false
  queue: max

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy
        run: ./scripts/deploy.sh

이제 main에 연속으로 머지되는 PR들이 순서대로 배포된다. 중간에 잡 하나가 사라지는 일이 없다.

브랜치별 미리보기 배포도 마찬가지다. group: preview-${{ github.head_ref }} 로 걸어 두면 같은 PR에서 여러 커밋이 들어와도 순서대로 처리된다. 예전엔 마지막 커밋만 반영되게 하려고 cancel-in-progress: true로 뒀는데, 상황에 따라 이제 큐잉을 선택할 수 있게 됐다.

마무리

작은 변경 같지만 배포 순서가 어긋나서 디버깅한 경험 있는 분들에겐 꽤 반가운 업데이트다. 옵션 한 줄이니까 오늘 바로 적용해 볼 만하다. 혹시 다른 활용 사례 있으면 댓글 남겨 주세요.


참고

태그: GitHubActions, CI/CD, DevOps, 배포자동화, concurrency