[우테코 6기 레벨3] Github Actions CI - 이슈 기반 브랜치 및 PR 자동화

새양·2024년 7월 19일
0

우테코 6기 일기장

목록 보기
13/16
post-thumbnail

목표

  • Issue 생성 시 Feature branchPull Request 자동 생성
  • Pull Requestcommit 추가 시 Testconverage 측정

CI/CD

혼자 개발을 계속 했을 때는 CI/CD 의 정확한 차이를 몰랐으며 CD의 작업만 하였던 것을 통틀어 CI/CD 라고 생각했었습니다.

차이

CI 는 서로 다른 개발자들이 작성한 feat 브랜치의 코드들을 dev 로 지속적 통합 한다는 거이었고
CD 는 이렇게 모인 dev 브랜치의 코드를 개발서버 또는 실서버로 배포한다는 것을 의미하였습니다.

당근 제일 유명한 비교군으로 JenkinsGithub Actions 가 있었습니다.

우테코에서 제공해주는 AWS 자원을 비용이 한정적이었기 때문에 서버에서 많은 메모리를 잡아먹으며 동작하는 Jenkins 를 배제하였고, Github Actions 에서 제공하는 Pull Request 와의 연동으로 가시성 면에서도 꽤나 좋은 선택지였기에 이를 사용하기로 하였습니다.

PR 테스트 및 coverage 작성

Github Actions 은 프로젝트 폴더에서 .github/workflows 폴더에 접속하여 생성되어 있는 모든 yaml 파일을 읽어 워크플로우를 구성합니다.

파일 생성

.github/workflows/be-ci.yaml 파일을 생성하여 아래 코드를 입력합니다.

이 위치에 파일을 생성 후 feat 이나 dev 브랜치에 업로드 할 경우 워크플로우로 등록된 후 알아서 작동합니다.

job 에 대한 설명을 아래와 같습니다.

  • Checkout repository 코드를 Actions Runner 에 복사합니다.
  • Set up JDK 21 Spring Boot 프로젝트의 Gradle 을 실행하기 위한 자바 설치
  • Generate test report 프로젝트 테스트 코드 실행 및 이후 PR Comment를 위한 리포트 작성
  • Add comment to PR with test coverage PR 에 converage Comment 자동 작성
name: Backend CI

on:
  pull_request:
    branches:
      - be/dev # target branch가 be/dev 일 경우 스크립트 작동

concurrency:
  group: ${{ github.head_ref }}
  cancel-in-progress: true # 이전에 작업중인 워크플로우 중지 후 새로운 워크플로우 실행

jobs:
  test:
    runs-on: ubuntu-latest
    environment: test # Spring 의 JASPT 라이브러리 키를 위해 환경 지정 (필요없을 경우 제거)
    permissions:
      pull-requests: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          java-version: 21
          distribution: temurin

      - name: Generate test report
        working-directory: ./backend
        env:
          JASYPT_PASSWORD: ${{ secrets.JASYPT_PASSWORD }} # Spring 의 JASPT 라이브러리 키를 위해 환경 지정 (필요없을 경우 제거)
        run: |
          chmod +x ./gradlew
          ./gradlew jacocoTestReport

      - name: Add comment to PR with test coverage
        uses: madrapps/jacoco-report@v1.6.1
        with:
          paths: ${{ github.workspace }}/**/build/reports/jacoco/test/jacocoTestReport.xml
          token: ${{ secrets.GITHUB_TOKEN }}
          min-coverage-overall: 0
          min-coverage-changed-files: 0
          update-comment: true

Github Secret 설정

Github Actions 에 단순히 Secret 을 설정할 수 있지만 같은 Secret 을 환경 별로 다르게 구성할 수도 있습니다.

Github > Settings > Environments 에서 환경을 만든 뒤 해당 환경 내에서 Secret 을 생성하면 됩니다.

테스트

be/dev 브랜치로 향하는 PR을 임의로 생성하여 테스트가 성공하는지 확인하면 됩니다.


Issue 기반 브랜치 및 PR 생성

event 대상이 issue 일 경우 워크플로우를 등록하기 위해서는 default branch 에 등록되어야 합니다.

기본 브랜치 변경

팀 프로젝트의 경우 default branch 에 무한 커밋을 할 수 없으므로 잠시 feat 브랜치를 default branch 로 변경해두어 작업하면 테스트하기 훨씬 수월합니다.

성공적으로 동작할 경우 마지막엔 기존이 지정된 default bracnh 로 변경 한 후 해당 브랜치에 커밋을 하든 PR 을 만들어 리뷰를 받는 등 하면 됩니다.

파일 생성

파일 2개를 생성할 것입니다.

  • .github/workflows/issue-automation.yaml 이슈 생성 감지 후 해당 라이브러리 동작
name: Issue Automation

on:
  issues:
    types: [ opened ]
  pull_request:
    types: [ opened, closed ]

jobs:
  create-branch:
    runs-on: ubuntu-latest
    steps:
      - name: Create new Branch
        uses: robvanderleek/create-issue-branch@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  • .github/issue-branch.yaml robvanderleek/create-issue-branch 라이브러리의 설정 파일
    추가적인 설정이 필요한 경우 위 라이브러리 docs 에 들어가 확인할 수 있습니다.
mode: immediate
branchName: ${issue.number}
branches:
  - label: BE
    name: be/dev
    prefix: be/feat/
  - label: AN
    name: an/dev
    prefix: an/feat/
autoLinkIssue: true
autoCloseIssue: true
openPR: true
copyIssueDescriptionToPR: true
copyIssueLabelsToPR: true
copyIssueAssigneeToPR: true
copyIssueProjectsToPR: true
copyIssueMilestoneToPR: true

테스트

Issue 를 생성하고 몇 초 뒤 브랜치와 PR 이 생성되는 것이 Issue 화면에 추가되는지 확인하면 됩니다.

profile
안녕, 세상!

0개의 댓글