Issue
생성 시 Feature branch
및 Pull Request
자동 생성Pull Request
에 commit
추가 시 Test
후 converage
측정혼자 개발을 계속 했을 때는 CI/CD 의 정확한 차이를 몰랐으며 CD의 작업만 하였던 것을 통틀어 CI/CD 라고 생각했었습니다.
CI 는 서로 다른 개발자들이 작성한 feat
브랜치의 코드들을 dev
로 지속적 통합 한다는 거이었고
CD 는 이렇게 모인 dev
브랜치의 코드를 개발서버 또는 실서버로 배포한다는 것을 의미하였습니다.
당근 제일 유명한 비교군으로 Jenkins
와 Github Actions
가 있었습니다.
우테코에서 제공해주는 AWS
자원을 비용이 한정적이었기 때문에 서버에서 많은 메모리를 잡아먹으며 동작하는 Jenkins
를 배제하였고, Github Actions
에서 제공하는 Pull Request
와의 연동으로 가시성 면에서도 꽤나 좋은 선택지였기에 이를 사용하기로 하였습니다.
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 Actions
에 단순히 Secret
을 설정할 수 있지만 같은 Secret
을 환경 별로 다르게 구성할 수도 있습니다.
Github > Settings > Environments
에서 환경을 만든 뒤 해당 환경 내에서 Secret 을 생성하면 됩니다.
be/dev
브랜치로 향하는 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 라이브러리의 설정 파일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
화면에 추가되는지 확인하면 됩니다.