[CI] Github Action 달기

3 분 소요

👩🏻‍💻 github action이 뭘까?

| 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행한다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완전히 사용자 정의된 워크플로에서 작업을 결합할 수 있다.


👩🏻‍💻 yml 파일

프로젝트에서 github actions를 추가하게 되면 자동으로 .github/workflows 디렉토리에 .yml 파일이 생성되며, 다음의 코드가 작성되어 있는 것을 확인할 수 있다.

# workflow 이름으로 원하는 형식으로 수정이 가능하다.
name: Android CI

# workflow 실행될  컨트롤 하는 부분
# 해당 workflow main branch push pull_request 이벤트가 일어날  trigger된다.
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

# 각각의 job들은 독립적으로 실행이 된다.
# 여기서 해당 job main puah, pull_request   빌드가 제대로 되는지를 확인해주는 역할이다.
jobs:
  build: # job 이름을 원하는 형식으로 지정해준다.

    runs-on: ubuntu-latest # job 실행되는 runner 타입 지정

    #  step 순서대로 실행이 된다.
    steps: 
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    # 필요한 jdk 세팅 작업
    - uses: actions/checkout@v3
    - name: set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: gradle

    # gradlew 파일의 실행 권한을 부여
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    # 권한이 부여된 gradlew 활용해 빌드 진행
    - name: Build with Gradle
      run: ./gradlew build

아마 이를 그대로 사용하면 build 실패가 발생할 수도 있을 것이다. 여기서 jdk 버전을 프로젝트에 맞게 변환해주어야 한다.


👩🏻‍💻 github actions를 활용한 test

그렇다면 빌드에서 나아가 github actions를 활용해 test를 실행해보자! 기본적으로 가장 많이 작성되는 unitTest를 실행하는 코드를 작성할 것이다.

  test:
    needs: build # build 종속성을 갖게 된다. , build job 끝난  실행된다.
    runs-on: ubuntu-latest
    steps:

    # 위에서 말했듯이 각각의 job 독립적이다. 따라서 checkout jdk 설정을 별도로 다시 진행한다.
      - uses: actions/checkout@v3
      - name: set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: 'zulu'
    
    # Unit Test 실행
      - name: Unit Test
        run: ./gradlew testDebugUnitTest

    # test 대한 report upload
      - name: Upload Test Reports Folder
        uses: actions/upload-artifact@v2
        if: $
        with:
          name: reports
          path: app/build/test-results 

여기서 업로드된 테스트 리포트를 눈으로 확인할 수 있도록 출력하는 코드도 추가한다. 여기서 나는 marketplace에서 제공하는 Android Test Report Action을 사용할 것이다.

  # report 출력하는 job 추가한다.
  report:
    runs-on: ubuntu-latest
    needs: test # test 대한 report 출력하는 것이므로 test job 종속을 가진다.
    if: $
    steps:
      - name: Download Test Reports Folder
        uses: actions/download-artifact@v2
        with:
          # with 통해 액션의 입력 매개변수 이름 지정
          # reports라는 이름의 artifact 다운로드 하게 된다.
          name: reports

      - name: Android Test Report
        uses: asadmansr/android-test-report-action@v1.2.0

그렇다면 이제 결과를 확인해보자!!

우선, 종속성에 따라 job들이 이어진 형태를 확인할 수 있을 것이다! 그리고 만약 모든 job들이 성공적으로 build된다면 아래와 같이 test에 대한 report를 확인할 수 있을 것이다.


👩🏻‍💻 github action을 활용한 auto merge

이제 마지막 단계이다. github action을 이용해 auto merge를 진행할 것이다.

# 1. build-and-test 마무리되어야 merge 작업이 진행된다.
# 2. pull-reqest 생성하고, 파일을 변경하는 작업이 필요하므로
     필요한 permission 설정해준다.
     checkout 경우, 워크플로우로 코드를 가져와 병합하기 위해 필요하다.
# 3. merge 진행한다.

  merge-branch:
    permissions:
      checks: write
      contents: write
      pull-requests: write
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Merge staging -> develop
        uses: devmasx/merge-branch@master
        with:
          type: now
          target_branch: 'develop'
          message: Merge staging -> develoop
          github_token: $

여기서 GITHUB_TOKEN의 경우, 단순 발급만 하면 별도로 secret을 설정하지 않고 secrets.GITHUB_TOKEN으로 접근해 사용할 수 있다.


🤔 추가정리

위 코드를 작성하게 되면 다음과 같은 warning이 발생하였다.

test: The following actions uses node12 which is deprecated and will be forced to run on node16: actions/upload-artifact@v2. For more info: https://github.blog/changelog/2023-06-13-github-actions-all-actions-will-run-on-node16-instead-of-node12-by-default/
report: The following actions uses node12 which is deprecated and will be forced to run on node16: actions/download-artifact@v2. For more info: https://github.blog/changelog/2023-06-13-github-actions-all-actions-will-run-on-node16-instead-of-node12-by-default/

즉, node12가 deprecate되었으므로 node16을 사용하라는 말이다! 따라서 v2v3로 변경함으로써 위의 warning을 제거할 수 있었다.

...
      - name: Unit Test
        run: ./gradlew test

      - name: Upload Test Reports Folder
        uses: actions/upload-artifact@v3 #  수정
        if: $
        with:
          name: reports
          path: app/build/reports/tests

  report:
    runs-on: ubuntu-latest
    needs: test
    if: $
    steps:
      - name: Download Test Reports Folder
        uses: actions/download-artifact@v3 #  수정
        with:
          name: reports

      - name: Android Test Report
        uses: asadmansr/android-test-report-action@v1.2.0


[추가] github action을 달던 중 local property로 인해 오류가 다시 한 번 발생했다. 해당 이슈에 대해서는 다음 게시글에서 다뤄보고자 한다.

😌 정리

github action을 미루고 미루다 드디어 적용을 하였다. 막상 적용해보니 정말 간단했고, 내가 정의한 대로 개발 워크플로가 자동화되는 것이 매우 흥미로웠던 것 같다. 처음에는 뭐가 잘못됐는지 몰라 계속해서 build 오류가 발생했지만 각각의 의미를 알고 원하는 코드를 추가하여 워크플로우가 성공적으로 빌드되는 것을 확인하니 무척 뿌듯했다. 앱 개발을 어느 정도 마무리하고 CD까지 github actions를 통해 진행하여 추후 블로그에 내용을 정리해야겠다. :0


📃참고

댓글남기기