ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CI/CD 정리 2편 - Github Actions 를 통해 CI 실습해보기
    백엔드 공부 2024. 1. 29. 09:00

     

     

    이제 CI 를 직접 작성해볼 차례다!

     

    CI  툴을  Github Actions로 선택한 이유

     

    팀 프로젝트 시작 전
    젠킨스와 Github Actions 두개를 놓고 고민했었다.

    초기 세팅을 할 때 팀원 중 한 명만 CI/CD  경험이 있는 상태였다. 

    젠킨스가 UI도 따로 있고, CI 테스트 과정에서 성능도 좀 더 빠르고 참고 문서가 많았지만
    결정적으로 초기 세팅 난이도가 비교적 높았기 때문에, 우리가 1달동안 빠르게 개발해야하는 상황에서 
    젠킨스는 굳이? 라는 선택지였다. 

    Github Actions는 오래되지 않아서 참고 문서가 많지는 않았지만 툴 자체 진입장벽이 낮아서 쉽게 접근할 수 있을 것 같았다.

     

     


     

    CI 파일 작성하기

     

     

    프로젝트 레포지토리 -> Actions -> Java with Gradle 

     

    Java with Gradle은 깃헙에서 만들어주는 템플릿인데 처음부터 본인이 만들어도 된다.

     

    https://docs.github.com/ko/actions/using-workflows/workflow-syntax-for-github-actions

     

    GitHub Actions에 대한 워크플로 구문 - GitHub Docs

     

    docs.github.com

     

    github actions 의 script document다.

     

    문서 양이 상당히 많아서 나의 팀플젝에서 쓴 것들에 대해서만 좀 정리하려한다. 

     

    내가 참고했던 블로그를 봐도 대부분 CI에서는 build 랑 test 정도만 작성했다.

     

    name: Java CI with Gradle in smRt store
    
    on:  ##다음과 같은 작업들을 할때 CI가 실행된다.
      workflow_dispatch: 
      push:
        branches: [ "develop" ]
      pull_request:
        branches: [ "main","develop" ]
    
    permissions:  
      checks: write ## 레포지토리 상태를 작성하기 위해 필요한 권한
      pull-requests: write ## pr 실행후 테스트 결과를 작성하기 위해 필요한 권한
    
    jobs:
      build:
    	##실행 환경
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v3
          - name: Set up JDK 17
            uses: actions/setup-java@v3
            with:
              java-version: '17'
              distribution: 'temurin'
    
    	## Gradle 캐싱
          - name: Gradle Caching
            uses: actions/cache@v3
            with:
              path: |
                ~/.gradle/caches
                ~/.gradle/wrapper
              key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
              restore-keys: |
                ${{ runner.os }}-gradle-
    
          ## Gradle Wrapper 권한 부여
          - name: Grant execute permission for gradlew
            run: chmod +x gradlew
    
          ## 빌드에 필요한 yml 파일 생성
          - name: make application.yml
            run: |
              mkdir -p ./src/main/resources
              touch ./src/main/resources/application.yml
            shell: bash
          - name: deliver application.yml
          	## secret key를 사용
            run: echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
            shell: bash
            
          ##test를 제외한 프로젝트 빌드
          - name: Build With Gradle
          	run: ./gradlew build -x test
    
          ## 테스트에 필요한 yml 파일 생성
          - name: make test application.yml
            run: |
              mkdir -p ./src/test/resources
              touch ./src/test/resources/application.yml
            shell: bash
          - name: deliver test application.yml
            run: echo "${{ secrets.APPLICATION_TEST }}" > ./src/test/resources/application.yml
            shell: bash
    
          ## 테스트에 필요한 db 스키마 생성(테스트 컨테이너를 써서 필요한 상황이었다)
          - name: make test ddl.sql
            run: |
              touch ./src/test/resources/ddl.sql
            shell: bash
          - name: deliver test ddl.sql
            run: echo "${{ secrets.DDL }}" > ./src/test/resources/ddl.sql
            shell: bash
    
    
          ## Gradle Test를 실행한다
          - name: Test with Gradle
            run: ./gradlew --info test
    
          ## Test 후 Report 생성
          - name: Publish Test Results
            uses: EnricoMi/publish-unit-test-result-action@v2
            if: always()
            with:
              files: '**/build/test-results/test/TEST-*.xml'
    
          ## 오류가 나는 부분에 코멘트를 달아줌
          - name: add comments to a pull request
            uses: mikepenz/action-junit-report@v3
            if: always()
            with:
              report_paths: '**/build/test-results/test/TEST-*.xml'

     

     

    성공시

     

    실패시 상세하게 볼 수 있다.

     

    push , pull 할 때마다 테스트 결과를 report 해준다.

     

     

    환경변수(빌드시 필요한 파일들)를 어디까지 스크립트에 드러내고 어디까지 key로 관리할것인지는  선택사항이다.

     

    Settings -> Security -> Secrets and variables -> Actions 에서 키 관리가 가능하다.

     


     

    Reference

     

    https://devs0n.tistory.com/25

    https://velog.io/@jmjmjmz732002/%E5%AE%8C-Github-Action-Docker-EC2-Nginx-%ED%99%9C%EC%9A%A9%ED%95%9C-Springboot-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-7-Github-Actions-CICD-docker-compose

Designed by Tistory.