https://docs.github.com/en/enterprise-cloud@latest/actions/use-cases-and-examples/building-and-testing/building-and-testing-java-with-gradle
도입 이유
스프링부트로 협업하면서 PR을 사용하기로 했는데 develop 브랜치에 충돌만 안나면 머지되도록 되어 있었다.
github action을 배우고, 테스트 워크플로를 작성할 수 있다는 것을 알게 되었고, 이 기능을 활용해서 다른 사람 코드가 컴파일 오류 없이 잘 돌아가는지 알아서 테스트 해주면 정말 편하겠다는 생각이 들어서 사용해보기로 했다.
Build and test (Java & Gradle)
공식 문서에 스프링부트로 애플리케이션을 만드는 프로젝트에서 지속적 통합을 위해 사용할 수 있다고 나와 있다.
워크플로우를 사용하면 PR에 대한 커밋이 default 브랜치에 대한 빌드 또는 테스트 실패를 발생시키는지 알 수 있다.
Github-hosted runnuers 에는 JDK 와 Gradle을 포함한 사전 설치된 소프트웨어가 있는 Tool cache가 있다.
JDK 및 Gradle의 소프트웨어 및 사전 설치된 버전 목록은 Using GitHub -hosted runners 를 참조
Using a Gradle workflow template
공식문서에 나온대로 "Java with Gradle" 을 선택해서 "Configure" 버튼을 누르면 알아서 '.github/workflows' 에 `gradle.yml` 파일을 생성해준다.
gradle.yml 분석하기
자동으로 생성된 gradle.yml은 아래와 같다.
아래 워크플로우 템플릿은 `build` 작업을 실행한다. 디폴트 Gradle 설정에서는 이 명령은 종속성을 다운로드하고, 클래스 빌드, 테스트 실행, 클래스를 배포 가능한 형식(.jar)로 패키징한다.
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# 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://docs.github.com/en/actions/automating-builds-and-tests/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 #이후에 도커에 배포하면 OS환경 우분투로 통일
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Build with Gradle Wrapper
run: ./gradlew build
# NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
# If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
#
# - name: Setup Gradle
# uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
# with:
# gradle-version: '8.9'
#
# - name: Build with Gradle 8.9
# run: gradle build
dependency-submission:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies.
# See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
위 워크플로우의 각 단계를 분석해보자.
Customizing when workflow runs are triggered
on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]
on 속성은 워크플로우가 트리거되는 시점을 정의한 것이다.
위에서는 develop 브랜치에 push 하거나 PR을 날리는 이벤트가 있으면 작업을 실행한다.
Running your jobs on different operating systems
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
GitHub Actions는 Linux, Windows, macOs 에 대한 hosted runner를 제공한다.
`runs-on`을 사용해서 워크플로우의 작업이 실행되는 OS를 정해줄 수 있다.
Using an action
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
`Action`는 GitHub에서 누구나 빌드하고 배포할 수 있는 재사용가능한 코드 단위이다. 라이브러리 같은 개념으로 다른 사람들이 만들어 올린 Script 라고 생각하면 쉽다.
https://github.com/actions/ 여기서 다양한 actions을 볼 수 있다.
빌드할 때 사용할 자바가 필요하므로 actions에 올라온 라이브러리를 사용
with:
java-version: '17'
distribution: 'temurin'
with 속성에 대한 설명
`with`는 `uses`에서 사용할 actions에 파라미터로 넣어줄 값을 설정하는 것이다.
`with`에 사용되는 값은 `actions/setup-java@v4` actions에 정의되어 있는 input 파라미터를 의미한다.
- `java-version`
- `distribution`
위 두개를 정의해주었는데, 정의해준 값이 해당 actions에 input 파라미터로 사용된다.
프로젝트에서 자바 17을 사용하고 있으므로 17로 설정해줬다.
Runnig a command
- name: Build with Gradle Wrapper
run: ./gradlew build
`run`에 작성한 명령어를 작업의 가상 머신(GitHub Actions가 제공하는 무료 서버)에서 실행한다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Multi-Stage (0) | 2024.10.23 |
---|---|
[Docker] Build Context (0) | 2024.10.23 |
[Docker] Dockerfile 살펴보기 (0) | 2024.10.19 |
[Docker] 캐시를 사용한 효율적인 빌드 수행 방법(1) - Docker Build Cache 무효화 (3) | 2024.10.19 |