[GitHub Actions] Pull Reqeust시 코드 테스트 실행하기

Belluga·2021년 8월 31일
0

GitHub Actions

GitHub Actions을 통해 push, pull request, issue 등의 이벤트 발생 시 명령을 실행함으로써 반복되는 작업을 자동화할 수 있습니다.

예를 들어

  • 누군가 저장소에 대한 pull 요청을 할 때마다
    테스트 스크립트를 실행하는 명령을 수행할 수 있고

  • 작업 결과를 저장소에 push 할 때 코드 테스트를 실행하여
    이상이 없다면 운영 서버에 적용하고
    담당자에게 작업 완료 메시지를 보내는 등의 작업을 수행할 수 있습니다.

GitHub Actions를 통해 GitHub에서 프로젝트를 빌드, 테스트, 패키징, 릴리스, 배포까지 할 수 있습니다.

GitHub Actions 시작해보기

GitHub Actions는 리포지토리에 워크플로우를 추가하면 이벤트에 의해 트리거 되는 방식으로 작업이 수행됩니다.

GitHub 상단 Actions 탭을 눌러 워크플로우를 생성할 수 있습니다.
워크플로우는 yml 파일이며 생성시 프로젝트 리포지토리/.github/workflows/ 하위 경로에 저장됩니다.

workflow

워크플로우에는 events, jobs, steps를 정의할 수 있습니다.

저희가 main 브랜치에 push, pull request 요청시 코드 테스트를 실행 하도록 작성한 워크플로우는 아래와 같습니다.

name: Jagoga CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  workflow_dispatch:

jobs:
  test: 
    runs-on: ubuntu-latest 
    steps:
    - uses: actions/checkout@v2 
    - name: Set up JDK 11 
      uses: actions/setup-java@v1
      with:
        java-version: 11 
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Test with Gradle
      run: ./gradlew test

workflow 구성 요소 살펴보기

🌿 name - Optional

name: Jagoga CI

워크플로우의 이름을 지정할 수 있습니다.
하단 Actions 탭의 Workflows에 노출되는 워크플로우 이름입니다.

🌿 on

GitHub Actions는 이벤트 기반의 기술이기 때문에 이벤트를 명시해야합니다.
워크플로 파일을 트리거하는 이벤트를 지정합니다.

name: Jagoga CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

저희는 main 브랜치에 push, pull_request 이벤트가 발생될때 트리거하기 위해 위처럼 구성하였습니다.

자세한 이벤트 목록은 아래 링크에서 확인할 수 있습니다.
https://docs.github.com/en/actions/reference/events-that-trigger-workflows

🌿 jobs

jobs는 워크플로우 파일 에서 실행되는 모든 작업(job)들의 목록을 명시합니다.

jobs:
  test: 
    runs-on: ubuntu-latest 
    steps:
    - uses: actions/checkout@v2 
    - name: Set up JDK 11 
      uses: actions/setup-java@v1
      with:
        java-version: 11 
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Test with Gradle
      run: ./gradlew test

이 때 test는 한 작업의 이름이 되어 노출됩니다.

🌿 runs-on

    runs-on: ubuntu-latest 

job을 실행할 컴퓨터를 지정합니다. Ubuntu Linux에서 실행되도록 구성하였습니다.

🌿 steps

실제로 수행되어야 하는 일(step)들의 목록을 명시합니다.
하이픈(-)을 구분자로 step이 구분된다고 보면 될 것 같습니다.

steps:
    - uses: actions/checkout@v2 
    - name: Set up JDK 11 
      uses: actions/setup-java@v1
      with:
        java-version: 11 
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Test with Gradle
      run: ./gradlew test

🌿 uses

다른 사람이 만든 action을 사용하고 싶을 때 uses 키워드를 사용할 수 있습니다.

- uses: actions/checkout@v2 

현재 깡통 컴퓨터에는 아무런 데이터가 존재하지 않습니다.
깡통 컴퓨터 안에 github 소스코드를 checkout 하겠습니다.
∗ checkout : 코드를 내려 받는 행위

해당 action은 현재 저장소를 clone, checkout하여 이후 명령어에서 사용이 가능하도록 합니다.

해당 action(actions/checkout@v2)의 저장소 링크입니다. 참고하면 좋을 것 같습니다.
https://github.com/actions/checkout

- uses: actions/setup-java@v1

JDK 11를 셋팅하기 위해 위 action을 추가하였습니다. v1의 경우 디폴트가 Zulu OpenJDK라고 합니다.

해당 action(actions/setup-java@v1)의 저장소 링크입니다. 참고하면 좋을 것 같습니다.
https://github.com/actions/setup-java#setup-java

🌿 name

해당 step에 이름을 지정할 수 있습니다.
이름을 지정한 step은 위와 같이 지정된 이름으로 노출됩니다.

🌿 run

실제 수행할 일을 지정합니다.

Example

    - name: Run a one-line script
      run: echo Hello World!
    - name: Run pwd
      run: pwd

GitHub Actions 탭에서 작업 수행 내용을 확인할 수 있습니다.

steps:
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Test with Gradle
      run: ./gradlew test

저희는 Gradlew 권한 설정 후 테스트 코드를 실행하도록 하였습니다.

처음 의도했던 대로 main 브랜치에 push, pull request 요청시 코드 테스트를 실행 하게됩니다. 테스트 성공/실패 결과를 쉽게 확인할 수 있습니다.

테스트 실패시 Merge 안되게 하기

코드 테스트는 실행하지만 테스트 실패시에도 main 브랜치에 merge가 가능한 상황입니다.

main 브랜치에 대해 protection rule을 설정하여 GitHub Actions 테스트를 통과한 브랜치만 머지 할 수 있도록 설정하였습니다.(방금 생성한 test 워크플로우)

환경변수

TODO...

References

https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions

0개의 댓글