Github Actions 과 CICD (랜덤 리뷰어 뽑기)

jisu·2023년 7월 23일
0

Github Actions

GitHub Actions는 GitHub에서 제공하는 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD) 서비스입니다. GitHub Actions를 사용하면 소프트웨어 개발자들은 GitHub 저장소 내에서 빌드, 테스트, 배포 등의 자동화된 워크플로우를 설정할 수 있습니다.

GitHub Actions는 소스 코드의 변경 사항에 따라 지정된 작업들을 자동으로 수행하는 데 사용됩니다. 이를 통해 팀이 개발 과정을 자동화하고, 더 높은 품질의 소프트웨어를 더욱 빠르게 제공할 수 있습니다.

주요 기능과 특징

  1. 유연한 워크플로우 설정: GitHub Actions를 사용하면 사용자들은 워크플로우를 YAML 파일을 통해 쉽게 설정할 수 있습니다. 빌드, 테스트, 배포 등 다양한 작업들을 지정하고 조건에 따라 분기할 수 있습니다.

  2. 빠른 설정: GitHub Actions는 빠르게 설정할 수 있는 템플릿과 예제를 제공하여 새로운 워크플로우를 빠르게 구성할 수 있습니다.

  3. 다양한 액션(Action) 사용: GitHub Actions는 커뮤니티에서 공유하는 다양한 액션들을 사용하여 빌드, 테스트, 배포 등의 작업을 수행할 수 있습니다. 필요한 경우 커스텀 액션도 작성할 수 있습니다.

  4. 이벤트 기반 실행: GitHub Actions는 특정 이벤트(예: 푸시, 풀 리퀘스트 생성 등)에 반응하여 워크플로우를 자동으로 실행합니다.

  5. 웹 기반 런너(Runner): GitHub Actions는 GitHub의 클라우드 인프라에서 실행되며, 별도의 인프라를 구성할 필요 없이 웹 브라우저에서 워크플로우 실행 상태를 모니터링할 수 있습니다.

GitHub Actions는 개발자들에게 CI/CD 서비스를 통합적으로 제공하면서, GitHub 저장소를 더욱 효율적으로 활용할 수 있는 기능을 제공합니다. 이를 통해 팀 협업과 소프트웨어 개발 프로세스를 자동화하고 효율성을 높일 수 있습니다.

Continuous Integration (지속적 통합)

CI는 여러 개발자들이 협업하는 프로젝트에서 코드 변경 사항을 빈번하게 공유하고 통합하는 개념을 말합니다. 개발자들은 소스 코드를 중앙 코드 저장소에 자주 푸시하며, 이러한 푸시가 발생할 때마다 자동으로 빌드와 테스트가 수행됩니다. 이를 통해 코드 변경 사항이 프로젝트에 빠르게 반영되고, 코드 간 충돌과 결함을 최소화합니다.

Continuous Delivery (지속적 배포)

CD는 CI의 결과물을 자동으로 프로덕션 환경에 배포할 수 있는 능력을 갖춘 상태를 말합니다. 개발자들은 프로젝트를 지속적으로 빌드하고 테스트하여, 배포 가능한 상태를 유지합니다. 이후 배포되어야 할 시점을 결정하고, 필요한 경우 수동으로 배포할 수 있습니다.

Continuous Deployment (지속적인 배포)

CD와 동일한 개념이지만, 배포 자동화에 더 강조를 둔 형태입니다. 지속적으로 빌드 및 테스트를 거친 코드가 자동으로 프로덕션 환경으로 배포됩니다. 사람의 개입 없이도 프로덕션 환경에 신속하게 변경 사항을 반영합니다.

Workflows

GitHub Actions에서 Workflows(워크플로우)는 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD)를 자동화하기 위해 정의하는 일련의 작업들의 집합입니다. 워크플로우는 YAML 파일을 사용하여 저장소에 정의되며, 소스 코드 변경 사항에 따라 자동으로 실행되도록 설정됩니다.

한 개의 GitHub 저장소에 여러 개의 워크플로우를 정의할 수 있으며, 각 워크플로우는 특정 이벤트에 의해 실행됩니다. 이벤트로는 푸시(push), 풀 리퀘스트 생성(pr pull_request), 이슈 등이 포함될 수 있으며, 원하는 이벤트에 맞춰 워크플로우를 설정할 수 있습니다.

워크플로우는 다양한 작업(Action)을 조합하여 개발자들이 필요한 CI/CD 파이프라인을 유연하게 구성할 수 있도록 합니다. 이를 통해 코드 변경 사항을 빠르게 통합하고, 자동으로 빌드, 테스트, 배포하는 등의 과정을 자동화할 수 있습니다.

GitHub Actions의 워크플로우를 사용하면 개발자들은 소스 코드 변경에 대응하여 지속적으로 통합과 배포를 수행할 수 있으며, 이를 통해 팀 협업과 개발 프로세스를 보다 효율적으로 관리할 수 있습니다.

구조

각 워크플로우는 여러 단계(Steps)로 구성되며, 각 단계는 원하는 작업(Action)을 수행합니다. 예를 들어, 빌드, 테스트, 배포 등의 단계를 정의할 수 있습니다. 또한 워크플로우는 여러 개의 에이전트(Agent)에서 병렬로 실행될 수 있습니다. 워크플로에는 순차적으로 또는 병렬로 실행할 수 있는 하나 이상의 작업이 포함됩니다. 각 작업은 자체 가상 머신 Runner 내부 또는 컨테이너 내에서 실행되며, 정의한 스크립트를 실행하거나 워크플로를 간소화할 수 있는 재사용 가능한 확장 기능인 작업을 실행하는 하나 이상의 단계가 있습니다.

파일 구조

// main.yml

name: "some action"

on:
    pull_request:
        branches:
            - master
            - main
        types:
          - opened
    label:
        types:
          - created
  
jobs:
  my_first_job:
    name: My first job
    runs-on: ubuntu-latest
    steps:
      - name: first-step
        id: first-step
        uses: actions/checkout@v2
      - name: second-step
        id: second-step
  my_second_job:
    name: My second job
 

상세 내용은 여기에 있습니다.

Workflow 자세히 보기

workflow 를 구성하는 요소들을 자세히 살펴보겠습니다.

workflow

한개 혹은 두개 이상의 Job 의 묶음입니다. 다음과 같은 속성을 가집니다. 워크플로우의 모든 내용들은 직접 커스텀 할 수도 있고, GitHub Market Place 에서 벤더(Vendor)가 공개해놓은 다양한 액션을 사용(uses) 할 수 있습니다.

Job

Job은 워크플로우의 실행 단위를 말합니다. 워크플로우는 하나 이상의 Job으로 구성됩니다. 각 Job은 별도의 환경에서 실행되며, 여러 개의 Step으로 구성됩니다. Job은 일련의 작업들을 수행하는 단위로, 특정 이벤트에 대한 반응으로 실행됩니다. 자세한 내용은 여기 에서 확인할 수 있습니다.

Step

Step은 Job 내에서 수행되는 개별 작업 단위를 말합니다. 각 Step은 하나의 명령 또는 작업(Action)을 수행하며, 여러 개의 Step을 사용하여 Job을 구성합니다.

Step은 소스 코드의 빌드, 테스트, 린트 등의 작업을 포함할 수 있으며, 필요에 따라 사용자 정의 Action을 사용하여 원하는 작업을 수행할 수도 있습니다.

Step은 보통 YAML 파일 내에서 정의되며, Job의 수행 순서에 따라 순차적으로 실행됩니다. 한 Step이 성공적으로 실행되면, 다음 Step이 실행되게 됩니다. 만약 한 Step이 실패하면 해당 Job은 중단되고, 후속 Step들은 실행되지 않습니다.

script

uses: actions/github-script@v3 등을 사용할 때 with 속성중 하나로 쓰이는 스크립트입니다. js 구문을 실행할 수 있게 합니다. core 는 script 에서 사용하는 특별한 Toolkit function 입니다.

예제

Pick Random Reviewer

js 로 랜덤 리뷰어를 한명 뽑고 PR 리뷰어에 등록, 댓글로 멘션하는 워크플로우 입니다. 아래 세가지 동작을 각각 step 으로 나누어 수행하도록 job 을 구성할 수 있습니다.

  1. javascript 를 실행해서 리스트에서 랜덤하게 원소 하나를 추출
  2. reviewer 등록
  3. 댓글 추가
name: "Pick Random Reviwer"

on:
  pull_request:
    types:
      - opened
    branches:
      - develop

jobs:
  pick-random-reviwer:
    runs-on: ubuntu-latest
    steps:
      // 1️⃣ 체크아웃
      - uses: actions/checkout@v2
      
      // 2️⃣ js 로 랜덤 1명 추출
      - name: pick_random_reviwer
        id: pick_random_reviwer // 다음 step 에 output 을 넘기기 위해 추가
        uses: actions/github-script@v3 // js 를 사용하기 위해 사용합니다
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const candidate = ['reviewer1', 'reviewer2', 'reviewer3'];
            const randomReviewer = candidate[Math.floor(Math.random() * candidate.length)];
            const comment = `🎉 @${randomReviewer} 님 랜덤 리뷰어로 당첨되셨습니다! 리뷰를 부탁드립니다. 🙏`
            core.setOutput('comment', comment) // output 을 세팅합니다
            core.setOutput('reviewer', randomReviewer) // core.setOutput(이름, 값)
      
      // 3️⃣ 댓글 추가
      - name: comment PR
        uses: mshick/add-pr-comment@v1
        with:
          message: |
            ${{ steps.pick_random_reviwer.outputs.comment }} // output 을 가져옵니다 ${{ steps.[step-id].outputs.[output-id] }}
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          repo-token-user-login: 'github-actions[bot]'
      
      // 4️⃣ 리뷰어 추가
      - name: Add Pull Request Reviewer
        uses: madrapps/add-reviewers@v1
        with:
          reviewers: ${{ steps.pick_random_reviwer.outputs.reviewer }}
          token: ${{ secrets.GITHUB_TOKEN }}

candidate 에 추가한 사람들 중에 한명을 뽑아 리뷰어로 등록할 수 있습니다. 만약 리뷰어 리스트를 별도의 파일로 관리하고자 한다면, 아래처럼 수정할 수도 있습니다.

// reviewers.json

{
  candidate: ['reviewer1', 'reviewer2', 'reviewer3']
}

fs 로 파일시스템을 사용해서, root 경로에 있는 reviewers 파일에서 후보자를 가져와서 사용할 수 있습니다.

jobs:
  pick-random-reviwer:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: pick_random_reviwer
        id: pick_random_reviwer // 다음 step 에 output 을 넘기기 위해 추가
        uses: actions/github-script@v3 // js 를 사용하기 위해 사용합니다
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const fs = require('fs');
            const candidate = JSON.parse(fs.readFileSync(`${{ github.workspace }}/reviewers.json`));
            ...

candidate 에 리뷰어 id 를 추가할 때 몇가지 주의 사항이 있습니다.

  • 개인 레포지토를 사용하는 경우 Settings > Collaborators 에 추가된 사용자 혹은 그룹만 리뷰어로 등록이 가능합니다.

  • Organisms 를 사용하는 경우에도 people 혹은 초대된(인가된) 사용자만 리뷰어로 등록할 수 있습니다.

참고문서

profile
(이제부터라도) 기록하려는 프론트엔드 디벨로퍼입니다 XD

2개의 댓글

comment-user-thumbnail
2023년 7월 23일

정보 감사합니다.

1개의 답글