본문 바로가기
Spring

Github Rest API 를 통한 테스트 자동화

by 초보개발자96 2024. 3. 31.

여러 프로젝트에서 공통으로 사용되는 기능이나 설정을 관리하기 위해 라이브러리를 만들어 배포하는 경우가 있습니다. 한번 배포된 라이브러리는 여러 곳에서 의존할 수 있기 때문에 수정하는 것은 경우에 따라 부담스러운 작업일 수 있습니다. 물론 버저닝을 할 수 있지만 큰 변화가 없는 경우에는 하위 호환을 지켜주는 것이 좋

수정한 라이브러리 자체에 대한 테스트는 Junit 같은 도구를 통해 쉽게 할 수 있습니다. 추가로, 이 라이브러리를 사용하는 쪽에서 수정된 버전으로 빌드나 테스트를 했을 때 깨지지 않는지도 확인하고 싶은 경우가 있을 수 있습니다.

예를 들어 사내에 jackson-databind 2.16.1 버전을 이용하는 common-library 가 있는데, jackson-databind 의 버전을 2.17.0 으로 변경하고 싶다고 가정하겠습니다. 해당 라이브러리의 release-note 에도 특이사항이 없었고 버전을 수정한 뒤에 돌린 테스트도 깨지지 않았지만, 이를 실제로 사용하는 프로젝트를 몇개 샘플링하여 여기서도 정상인지를 확인하고 싶습니다.

가장 간단한 방법은 로컬에 라이브러리를 배포하고 프로젝트를 클론하여 로컬에서 테스트를 돌리는 것입니다. 하지만 자신이 관리하지 않는 프로젝트일 경우 실행 자체가 힘들 수도 있고, 이런식으로 매번 테스트를 진행한다면 라이브러리에 대한 관리가 제대로 안될 가능성이 있습니다.

Github 에서 제공하는 API 와 CI/CD 도구(여기서는 Github actions)를 이용하면 이러한 일련의 과정을 자동화할 수 있습니다.

 


 

Github actions 에서 gh 사용하기

Github 에서는 Github Rest API 를 쉽게 사용할 수 있도록 래핑한 gh 라는 CLI 를 제공하고 있습니다. 예를 들어, gh workflow 라는 명령은 Gihub actions 의 workflow 와 관련된 작업을 수행합니다.

 

# common-library/.github/workflows/common-library-test.yaml
name: common library test

on:
  pull_request:
    branches:
      - main

jobs:
  common-library-test:
    runs-on: ubuntu-latest
    steps:
      - name: Start common library test
        run: gh workflow run common-library-test.yaml --repo myuser/payment-server -F common-library-ref=${{ github.event.pull_request.head.sha }}
        env:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}

 

common-library 에 위와 같은 workflow 를 작성하게 되면 main 으로의 PR 이 발생할때 마다 payment-server 의 common-library-test.yaml workflow 를 실행시켜 줍니다. 이때 어떤 commit 으로 인해 실행되었는지 알려주기 위해 common-library-ref 를 인자로 넘겨줍니다.

 

gh 의 -F 옵션을 통해 key=value 포맷의 query parameter 를 넘길 수 있습니다.

 

# payment-server/.github/workflows/common-library-test.yaml
name: For common library test

on:
  workflow_call:
    inputs:
      common-library-ref:
        type: string
        required: true
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout common-library repository
        uses: actions/checkout@v3
        with:
          repository: myuser/common-library
          path: myuser/common-library
          token: ${{ secrets.GH_TOKEN }}
          ref: ${{ inputs.common-library-ref }}
          
      // publish library
      // checkout payment-server repository
      // change common-library version
      // gradle build and test

 

payment-server 의 common-library-test.yaml 에서는 common-library-ref 를 통해 common-library 의 해당 커밋으로 체크아웃 할 수 있습니다. 이제 workflow 가 실행되는 Runner 위에 라이브러리를 배포하고, payment-server 의 build.gradle 파일에서 common-library 의 버전을 변경하여 빌드하고 테스트하면 원하는 행위를 자동화할 수 있습니다.

 

Commit Statuses

Rest API 의 Commit statuses 를 이용하면 외부에서 특정 Pull requests 에 연관된 commit 에 대한 상태(state)를 보낼 수 있습니다. state 는 error, failure, pending, success 로 총 네개의 상태가 있고, description (요약 정보) 과 target_url (어떤 곳에서 보내었는지) 도 함께 보낼 수 있습니다.

 

gh api -X POST /repos/common-library-repo/statuses/<commit-hash> \
    -F state=success \
    -F target_url=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

 

위 명령을 실행하면 현재 실행되고 있는 workflow url 과 함께 success 상태를 common-library 의 커밋에 보내고, 커밋과 관련된 PR 이 있으면 아래와 같이 나타나게 됩니다.

 

출처:&nbsp;https://www.jenkins.io/blog/2023/12/06/jenkins-to-github/

 

이 방식을 이용하면 payment-server 의 workflow 가 끝날때까지 기다리게 하거나 workflow 가 성공해야 PR 을 머지할 수 있도록 할 수도 있습니다.

이외에도 Github secret, Issue 등을 위한 여러가지 API 를 제공해주고 있으니 Github 과 Integration 이 필요한 기능을 만들 때 Github Rest API 를 참고해보시면 좋을것 같습니다.