프로젝트를 진행하면서 새로운 기능을 추가하고 PR을 올려도
해당 코드가 제대로 돌아가는지 알 수 없어서
일단 승인을 하고 개발 브랜치에 병합이 되면 pull 을 해서
테스트가 제대로 돌아가는지 확인해야하는 어려움이 있었다.
아니면 테스트의 실패나 컴파일 오류가 있는데 인지하지 못하고
급하게 PR 을 올려 잘못된 코드가 메인 개발 브랜치에 올라간 적도 있었다.
그래서 이것을 해결하기 위해 깃허브 액션을 사용해
CI, 테스트를 자동화하기로 하였다.
기본 작업 :
깃헙액션 워크플로우 yml 파일 작성 후 브랜치 보호 규칙에서 설정
secret 관리 :
깃허브 설정에서 secret 을 설정하고
application-secret.yml 과 똑같은 템플릿 파일을 만들어
워크플로우 작업 중
템플릿 파일에 secret 변수 값을 넣어 application-secret.yml 로 만듦
.github/workflows/test.yml 파일을 생성하고 해당 내용을 추가하면 된다.

→ 새로운 파일 생성

→ 워크플로우 파일 생성 (파일 이름은 중요하지 않음)

→ 추가한 내용 저장!
# 워크플로우 이름
name: Run Tests Before Merging
on:
pull_request: # pull_request 이벤트에 대해 실행
branches:
- main # main 브랜치에 대한 PR 만 해당됨
jobs:
test: # "test"라는 이름의 작업(job)을 정의
runs-on: ubuntu-latest # 우분투 최신 버전에서 아래 내용들 실행
steps: # 각 단계를 정의
# 1. 리포지토리 체크아웃, 해당 리포지토리에서 작업하기 위한 필수 작업
- name: Checkout repository
uses: actions/checkout@v4
# 2. JDK 설정
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin' # Temurin 배포판
java-version: '21' # JDK 21 버전
# 3. 빌드 및 테스트 실행
- name: Build and run tests
run: |
./gradlew build --no-daemon # 프로젝트 빌드
./gradlew test # 테스트 실행
(라고 챗GPT가…)

→ Setting > Rules > Rulesets > New ruleset > New branch ruleset

→ 규칙 이름과 활성화

→ 적용을 원하는 브랜치 이름 설정

→ 아래에 Require status checks to pass 설정하고 + Add checks 에 Job 이름 (워크플로 파일 안에서 설정) 으로 추가

→ Create 로 규칙 생성 > 적용됨

→ 이제 PR 을 올리면 아래 워크플로가 돌아가면서 체크

→ 작업 중인 내용을 클릭하거나 Checks 탭, 혹은 전체 리포지터리의 Actions 탭을 통해 진행상황을 확인할 수 있다.

→ 모든 테스트가 실행되면 결과가 나온다. 테스트를 실패했기 때문에 Merge 버튼이 활성화되지 않음.

→ 진행 내역을 확인해보면 실패한 테스트와 코드 라인 번호까지 알 수 있다.
PostControllerTest > Post 생성 테스트 코드 FAILED
java.lang.AssertionError at PostControllerTest.java:50
“PostControllerTest” 의 “Post 생성 테스트 코드” 라는 테스트가 실패했음을 알 수 있고
50번째 줄의 코드에서 실패했음까지 알 수 있다.

→ 실패한 부분을 수정하면 다시 빌드와 테스트가 진행되고 성공하면 병합 버튼이 활성화돤다.
.gitignore 파일에서 application-secret.yml 파일을 깃허브에 올라가지 않게 설정했기 때문에
깃허브 액션의 워크플로에서 빌드와 테스트를 진행할 때 문제가 생긴다.

→ 컨트롤러 안에 설정파일에서 값을 불러오는 변수를 설정

→ 해당 변수는 application-secret.yml 에서 값을 불러옴


→ application-secret.yml 가 있는 인텔리제이에서는 테스트가 성공하지만 깃헙액션 상으로는 실패함

→ 시크릿 설정파일과 똑같은 템플릿 파일 생성

→ Setting > Secrets and variables > Actions > New repository secret

→ 변수 이름과 값 설정 (Add secret 하면 이 값을 다시 확인할 수 없고 새로운 값으로 변경과 삭제만 가능하니 주의)


→ 워크플로에 application-template.yml 에 시크릿 값을 넣어 application-secret.yml 로 바꾸는 스탭 추가 (덮어쓰기됨)
환경 변수 값을 문자열에서 찾아 실제 값으로 치환(substitution)하는 명령어.
< : 입력 리다이렉션 - 파일 내용을 읽어서 명령어에 전달.
> : 출력 리다이렉션 - 치환된 내용을 해당 파일로 저장.

→ 시크릿 값을 잘 적용하여 빌드 및 테스트 작업 성공, 병합 버튼 활성화
- name: Grant execute permission to gradlew
run: chmod +x backend/gradlew
실행 권한이 없어서 추가하는 스탭을 빌드, 테스트 스탭 전에 추가함
- name: Build and run tests
run: |
cd backend
./gradlew build --no-daemon
./gradlew test
프로젝트 안에 backend, frontend 로 디렉토리가 있기 때문에
백엔드 디렉토리 안으로 들어가는 cd backend 추가