머지 큐를 사용하여 응급 풀 리퀘스트 처리하기

비즈니스 요구 사항에 따라 빠르게 변화하는 환경에서 빠른 피드백과 지속적인 배포가 필수적입니다. 이러한 상황에서 빠른 피드백과 지속적인 배포가 필수적입니다. 이러한 상황에서 빠른 피드백과 지속적인 배포가 필수적입니다.

이러한 시나리오에서는 일반적인 PR보다 ‘긴급’한 요청을 우선시하고 필요한 경우 CI 검사를 연기할 수 있는 시스템이 필요합니다.

우리가 기본 큐보다 앞서 나가고 CI 테스트가 통과하기 전에 긴급한 수정을 제공하는 데 도움이 되는 독립적인 병합 큐를 구현하는 것이 좋습니다.

이 기사에서는 PR 레이블에 의해 트리거되는 Mergify를 사용하여 두 개의 병합 큐를 생성합니다. 일반적인 PR에 대한 것과 긴급한 PR을 처리하는 것이 있습니다.

이제 손을 문지르고 시작합시다!

이 데모를 위해 간단한 React 애플리케이션을 초기화할 것입니다. 그리고 CI는 CircleCI를 사용할 것입니다.

두 개의 병합 큐를 생성할 것입니다.

  • 기본: 모든 PR은 일반적으로 이를 통과합니다. 처리하기 전에 CircleCI 검사를 요구합니다.
  • 긴급: 이 큐는 PR에 긴급 레이블이 있는 경우에만 적용됩니다. 이를 통해 PR을 기본 큐의 PR 앞으로 이동하여 CircleCI 검사를 실행하지 않고 이동할 수 있습니다.

이러한 구성으로 레이블 긴급이 지정된 끌어오기 요청은 CI가 실행되기 전에 큐에 들어갑니다.

기본 큐 앞에 있게 됩니다. Mergify는 필요한 경우 끌어오기 요청의 기본 분기를 업데이트하고 CI가 통과하기를 기다린 다음 끌어오기 요청을 병합합니다.

개발팀의 관점에서도 이는 비교적 간단한 과정입니다. 개발자는 PR을 생성할 때 urgent 레이블을 추가하여 과정을 가속화할 수 있습니다.

프로젝트 설정

프로젝트 설정부터 시작해 보겠습니다. create-react-app을 사용하여 새로운 리액트 애플리케이션을 생성할 것입니다.

Shell

 

mkdir emergency-pr-demo
cd emergency-pr-demo
git init
npx create-react-app .

참고로, CI와 Mergify 설정을 추가한 후 최종적으로 프로젝트 구조가 어떻게 될지 보여드리겠습니다.

YAML

 

emergency-pr-demo/
├── .circleci
│   └── config.yml
├── README.md
├── package-lock.json
├── package.json
├── .gitignore
├── .mergify.yml
├── .vscode
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
└── src
    ├── App.css
    ├── App.js
    ├── App.test.js
    ├── index.css
    ├── index.js
    ├── logo.svg
    ├── reportWebVitals.js
    └── setupTests.js

CI 설정 생성

테스트를 실행하기 위해 CircleCI를 사용할 것입니다. 설정하기 쉽고 시작하기 간편합니다.

여기서는 프로젝트 루트에 새로운 .circleci 디렉토리를 만들고 config.yml 파일을 생성할 것입니다.

간단한 작업 build_and_test를 생성하여 먼저 프로젝트가 예상대로 빌드되는지 확인하고, npm run test 명령어로 단위 테스트를 실행합니다.

YAML

 

version: 2.1
orbs:
  node: circleci/[email protected]

jobs:
  build_and_test:
    executor: node/default
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
      - run:
          command: npm run test
          name: Run tests
      - run:
          command: npm run build
          name: Build app
      - persist_to_workspace:
          root: ~/project
          paths:
            - .

workflows:
  test_my_app:
    jobs:
      - build_and_test

.circleci/config.yml

Mergify 설정 생성

이제 Mergify 구성 파일을 생성할 시간입니다.

Mergify는 사전 정의된 규칙과 조건을 기반으로 코드 저장소에서 풀 리퀘스트 병합 과정을 자동화하는 도구입니다.

구성 파일에 계획대로 urgentdefault 두 개의 큐를 정의해야 합니다.

둘 다 동일한 merge_conditions, check-success=ci/circleci: build_and_test를 가지며, 이는 코드가 CircleCI에서 build_and_test 검사를 성공적으로 통과한 후에만 병합할 수 있음을 의미합니다.

pull_request_rules 섹션은 풀 리퀘스트를 어떻게 처리해야 하는지 설명합니다. 우리는 풀 리퀘스트에 ‘긴급’ 레이블이 있으면 긴급 큐에 넣겠습니다. 그렇지 않으면 기본 큐에 들어갑니다.

.mergify.yml

YAML

 

queue_rules:
  - name: urgent
    merge_conditions:
      - "check-success=ci/circleci: build_and_test"

  - name: default
    merge_conditions:
      - "check-success=ci/circleci: build_and_test"

pull_request_rules:
  - name: move to urgent queue when label urgent
    conditions:
      - base=main
      - label=urgent
    actions:
      queue:
        name: urgent

  - name: merge using the default queue after running the CI checks
    conditions:
      - base=main
      - "check-success=ci/circleci: build_and_test"
      - label!=urgent
    actions:
      queue:
        name: default

저장소 설정

아니요, 우리는 계속해서 GitHub에 새 저장소를 생성할 것입니다.

이 후, 초기 커밋을 만들고 코드를 푸시하기 위해 다음 명령어를 사용해야 합니다:

Shell

 

git add .
git commit -m "Initial commit"
git remote add origin <REPO_URL>
git push -u origin master

다음으로, CircleCI를 설정해야 합니다. 이를 위해 CircleCI 대시보드를 방문하여 프로젝트 섹션으로 이동하여 프로젝트를 설정합니다.

또한 main 브랜치를 지정해야 합니다. CircleCI는 이 경우 자동으로 config 파일을 감지합니다.

GitHub 계정에 Mergify를 설치하려면 dashboard.mergify.com 또는 github.com/apps/mergify/installations/new에 방문하여 GitHub 계정으로 로그인할 수 있습니다.

그런 다음, Mergify에 접근 권한을 부여할 저장소를 선택할 수 있습니다.

설정이 완료되면 Mergify Dashboard에서 우리 두 곳의 대기열을 모두 확인할 수 있습니다. 

이제 첫 번째 PR(일반 PR)을 생성하는 것부터 시작하겠습니다. 먼저 regular-pr라는 새 브랜치를 생성할 것입니다.

Shell

 

git checkout -b regular-pr
git add .

데모를 위해 이제 App.css 파일에 클래스를 추가하겠습니다.

CSS

 

.Regular-change-class {
    background-color: white;
}

이후 커밋을 만들고 변경 사항을 GitHub에 푸시하겠습니다.

Shell

 

git commit -m 'regular CSS change'
git push --set-upstream origin regular-pr

다음으로 태그 없이 Pull Request를 생성하겠습니다.

이제 우리의 변경 사항을 위해 urgent-pr라는 새 브랜치를 생성하겠습니다.

Shell

 

git checkout main
git branch -b urgent-pr

먼저 commit을 만들어 Urgent.js라는 새 컴포넌트를 생성하겠습니다.

JavaScript

 

import React from "react";

export default function Urgent() {
  return <div>This is an Urgent Change</div>;
}

이제 이(urgent-pr) 브랜치를 우리의 GitHub 저장소에 푸시하겠습니다.

Shell

 

git add .
git commit -m 'Create a component for Urgent change'
git push --set-upstream origin urgent-pr

그런 다음 저장소로 이동하여 urgent-pr 브랜치에서 main 브랜치로 새 PR을 생성하고 새 레이블 urgent을 추가하겠습니다.

Mergify는 두 번째 PR을 urgent 대기열에 자동으로 넣은 후 CI 검사를 실행하고 main 브랜치와 병합합니다.

그런 다음 첫 번째 PR을 자동으로 병합합니다.

참조를 위해 여기 GitHub 저장소를 확인할 수 있습니다: github.com/hugoescafit/emergency-pr-demo

결론

이번 시간은 여기까지입니다!

이 튜토리얼에서는 Mergify의 도움을 받아 기본 및 긴급 두 가지 다른 병합 큐를 설정하는 과정을 살펴보았으며, CircleCI의 도움을 받아 CI 검사를 설정하는 방법도 살펴보았습니다. 또한 일반 PR보다 긴급 PR을 우선 처리하는 방법도 살펴보았습니다.

긴급 풀 리퀘스트 관리를 위한 다양한 다른 솔루션이 있습니다. 특별한 핫픽스 브랜치를 생성하거나, 전용 리뷰어를 배치하거나, 검사를 수동으로 우회하는 등이 그 예입니다. 그러나 병합 큐는 이 문제를 처리하기 위한 가장 좋고 쉽게 구현할 수 있는 전략 중 하나입니다.

애플리케이션에 병합 큐를 추가하기 시작하려면 Mergify를 방문하세요!

Source:
https://dzone.com/articles/handling-emergency-pull-requests-using-merge-queue