티스토리 뷰

많은 CI 툴이 있지만 오늘은 Github Actions를 이용해서 CI 구축을 해보겠다. 

 

프로젝트를 관리할 레파지토리를 생성하자. (이름은 only-ci-test로 정했다) 그리고 Actions탭에 들어간다.

 

스프링부트로 테스트 할 것이기 때문에 Java with Gradle의 Configure을 눌러준다. 

 

그럼 밑에 있는 사진처럼 디폴트 값으로 짜여져 있는 yml파일이 있다. 

 

이제 yml파일을 건드려서 자신이 원하는 스크립트를 짜면 된다. 나는 JUnit Test Results라는 라이브러리를 사용해서 JUnit 테스트가 성공하든 실패하든 Github Actions 봇이 테스트 결과 정보를 코멘트로 알려주는 기능을 짰다. 옆에 Marketplace를 통해 다양한 기능들을 검색해서 알아볼 수 있고, 각각의 기능들을 문서화로 볼 수 있다. 

 

그럼 각각의 코드들이 어떤 역할을 하는지 알아보자. 

name: backend

on:
  push:
    branches: [ "develop" ]
  pull_request:
    branches: [ "develop" ]

 

on 부분을 Event라고 하는데, Envent라는 개념이 중요한 것이 아니라 어떤 용도인지가 더 중요하다. 위 코드는 어떤 브렌치로 이벤트를 발생시켰을 때 워크플로우가 돌아가는지 작성하는 부분이다. 위 코드를 예로 들면, develop 브렌치로 push나 pr을 했을 때 동작하겠다는 의미다. 

 

permissions: write-all

permissions의 뜻에서 알 수 있듯이 권한을 작성하는 부분이다.

여기서 주의할 점은, yml에서 디폴트 값으로 read라고 되어 있는 상태에서 돌아가면 권한이 없다는 오류가 뜬다. 

 

그래서 permissions 부분을 아예 적지 말던지(아예 적지 않으면 어떻게 되는지 모르겠다. 아마 디폴트 값으로 read가 되지 않을까 싶다.) write-all을 꼭 해줘야 한다. 

 

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: JDK 17 설치
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
      
    - name: Gradle 명령 실행을 위한 권한을 부여
      run: chmod +x gradlew

    - name: Gradle 빌드
      run: ./gradlew build

 

runs-on은 어떤 VM머신으로 동작시킬지 정하는 부분이다. 꼭 ubuntu가 아니어도 되지만(macos 등) 뭘 해도 상관없기 때문에 ubuntu로 했다. 이제 step으로 뭘 실행시킬건지 작성하기만 하면 된다. name으로 원하는 이름을 지정하고 uses로 지원하는 많은 액션 기능들 중 원하는 것을 골라서 사용하면 된다. JDK 17을 설치하기 위해 setup 기능을 적었다. 그리고 with으로 더 자세하게 원하는 요소를 작성할 수 있다.  그리고 VM머신에서 자동으로 빌드하기 위해 빌드 관련 명령어를 적어준다. 

 

마지막으로 테스트 결과를 PR에 코멘트로 등록하는 라이브러리를 가져다 쓸 것이다. 결과화면은 아래와 같다. 

 

코드는 아래와 같다. uses로 유닛 테스트 결과 라이브러리를 불러오고, 성공하든 실패하든 코멘트를 달 수 있도록 always() 문법을 사용한다. 마지막으로 files 경로에 코멘트 xml을 프로젝트에 적용시킨다. 

 - name: 테스트 결과를 PR에 코멘트로 등록
      uses: EnricoMi/publish-unit-test-result-action@v1
      if: always()
      with:
       files: '**/build/test-results/test/TEST-*.xml'

 

해당 경로로 xml파일이 온 것을 확인할 수 있다. 아직 왜 프로젝트 안에 코멘트 xml파일을 두는지는 의문이다. 찾아보진 않았지만 개인적인 생각으로 코멘트를 달기 위한 접근 때문인 것 같다. 

 

코드 결과물은 아래와 같다. 

name: backend

on:
  push:
    branches: [ "develop" ]
  pull_request:
    branches: [ "develop" ]

permissions: write-all

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: JDK 17 설치
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
      
    - name: Gradle 명령 실행을 위한 권한을 부여
      run: chmod +x gradlew

    - name: Gradle 빌드
      run: ./gradlew build
      
    - name: 테스트 결과를 PR에 코멘트로 등록
      uses: EnricoMi/publish-unit-test-result-action@v1
      if: always()
      with:
       files: '**/build/test-results/test/TEST-*.xml'

 

이제 커밋을 하고, 새롭게 실패하는 테스트를 짠 후 pr을 올리면 자동으로 동작한다. 그리고 테스트 결과 코멘트를 작성한다. 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday