본문 바로가기
프로젝트

[Project] Github action을 활용하여 PR시 자동 Build 설정하기 (CI설정)

by jaee_ 2021. 11. 13.

Github action을 통해서 깃허브 자체적으로 CI & CD를 진행할 수 있습니다. 오늘은 Gradle CI를 적용하는 방법만 포스팅할 예정입니다. 

 

프로젝트 환경은 Spring-boot Gradle 입니다. Git-Flow로 브랜치 관리를 하는 프로젝트라 develop 브랜치에 pull request 또는 push 시 자동으로 build가 되는 설정을 해보려고 합니다. 


Github Action을 통해 CI 설정하기 

1. 우선 Github Repository에서 action 카테고리로 들어갑니다. 

2. 그 뒤 set up a workflow yourself 를 클릭하여 직접적으로 파일을 생성하여 만들수도 있지만, 저는 이미 만들어져 있는 workflow를 사용하였습니다.

3. Continuous integration workflows (지속적인 통합 workflow) 카테고리에 보시면 Java with Gradle 이라는 항목이 존재합니다. 이것을 클릭합니다. 

 

4. 클릭하게 되면 Github에서 제공해주는 Gradle 기반 Java 프로젝트에서 작동하는 Gradle 워크플로 템플릿을 생성할 수 있습니다. 

 

5. start commit 을 통해 commit 하면 적용이 됩니다. 

 


workflow에 대해 조금 더 알아보기

위에서 적용했던 workflow 템플릿의 코드입니다. 아래의 코드가 어떻게 적용이 되는지 알아보도록 하겠습니다. 

# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# 번역 : 이 워크플로는 Gradle을 사용하여 Java 프로젝트를 빌드하고 모든 종속성을 캐시/복원하여 워크플로 실행 시간을 개선합니다.
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
# 번역 : 자세한 내용은 위에 적힌 url을 참조하라는 글입니다. 

name: Java CI with Gradle

on:
  push:
    branches: [ mater ]
  pull_request:
    branches: [ mater ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        cache: gradle
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build
  • name : workflow 의 이름입니다. Github은 repository의 작업 페이지에 workflow 이름을 표시합니다. 
  • on : 필수 workflow 를 트리거(발생하는..?) 하는 Github 이벤트 이름입니다.
    • 단일로도 사용이 가능하며, 위의 에제처럼 여러 이벤트를 사용할 수도 있습니다.
    • 다만, 위의 예제처럼 여러 이벤트에 대한 구성이 필요하다면 콜론 ':' 을 사용하여 이벤트를 구성해야 합니다.
    • 목록형으로 사용하고자 하는 경우엔 [push, pull_request] 이렇게도 사용이 가능합니다. 
  • 위의 예제로 살펴본다면 on 키워드를 통해 push 와 pull_request 라는 action이 일어났을 때 적용이 되며, push 와 pull_request 가 적용되는 브랜치명을 지정하여 해당 브랜치에만 적용이 될 수 있도록 설정한 것입니다 .만약 여러개의 브랜치로 작성하고 싶다면 다음과 같이 작성도 가능합니다. 
on:
  push:
    branches: [ mater, develop, test_branch ]
  pull_request:
    branches: [ mater ]
    • jobs : workflow의 실행은 하나 이상의 작업으로 구성이 되며 병렬로 실행이 됩니다. (위 예제에선 build 작업 하나만 수행합니다. )
    • runs-on : 필수 . 작업을 실행할 시스템 유형입니다. 즉, 위의 예제에서는 build가 실행되는 시스템은 우분투 최신버전입니다. 
    • steps : 작업에는 steps 라는 작업이 포함됩니다. 
    • steps 안에있는 uses : 작업으로 실행할 재사용 가능한 워크플로 파일의 위치 및 버전입니다.
    • steps 안에있는 name : Github 에 표시할 단계의 이름입니다. 
    • steps 안에있는 with : 해당 users를 사용할 때 필요한 입력값들 입니다. 
    • steps 안에있는 run :운영 체제의 셸을 사용하여 명령줄 프로그램을 실행합니다. 

다른 workflow 구문들이 궁금하거나 자세히 알고싶다면 이곳에 가면 자세히 알 수 있습니다. 

 


action적용 후 pull request 해보기

Github Action을 통해 CI 설정하기 를 통해 action을 설정하면 위의 그림과 같이 action이 설정된 것을 볼 수 있습니다. 

 

pull request 후 merge 까지 진행해보겠습니다. 

실패,,,,

^^.. 순조로울 리가 없죠 action template 도 github에서 제공해주고 그걸 고대로 만들기만 했으니 너무 날로 먹으려했나봅니다.. 안되는 이유를 알아보도록 하겠습니다. 

실패한 action을 따라 들어가보니 다음과 같은 화면을 만났습니다. 

해석을 해보자면 "cannot access 'gradlew' : No such file or directory" : gradlew의 파일을 찾을 수 없다. ... 왜 찾지 못할까요? 

한참을 고민고민을 하다가 파일 또는 디렉토리를 못찾으면 찾을 수 있게끔 env를 설정해주자! 라는 결론이 났습니다.

 

다시 workflow를 수정하러 갑니다. 

# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

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

jobs:
  build:
  
    runs-on: ubuntu-latest
    # env 추가
    env : 
      working-directory: ./demospringioc
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        cache: gradle
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      # 실패했던 이 step에도 경로지정
      working-directory: ${{ env.working-directory }}
    - name: Build with Gradle
      run: ./gradlew build
      # 다른 step도 혹시 모르니 경로 지정
      working-directory: ${{ env.working-directory }}

이렇게 경로를 찾을 수 있도록 직접 지정해주었습니다. 

 

그리고나서 push 및 pull request 를 하니!!!!!!

성공하였습니다 : ) 

 


참고한 사이트

https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions

https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

댓글