GitHub Actions는 GitHub에서 제공하는 서비스로, 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포) 플랫폼입니다.
오늘은 아래 그림에서 3번까지의 과정을 해보겠습니다.
저는 현재 인텔리제이에서 springboot + gradle을 사용중입니다.
1. Dockerfile 작성
먼저 Spring Boot 애플리케이션을 실행할 Docker 이미지를 생성하기 위해 Dockerfile을 작성해야 합니다. 프로젝트 루트 디렉토리에 Dockerfile을 생성하고 내용을 작성합니다.
# JRE (Java Runtime Environment) 버전을 사용합니다.
# JRE는 Java 애플리케이션을 실행하는 데 필요한 최소한의 구성 요소만 포함합니다.
# 개발 시 JRE만 필요한 경우에 유용합니다.
# 가벼운 이미지이며 실행환경에 최적화되어 있습니다.
FROM adoptopenjdk:11-jre-hotspot
# build/libs/ 디렉토리에 있는 모든 JAR 파일을 app.jar로 복사합니다.
COPY build/libs/*.jar app.jar
# java -jar app.jar 명령을 실행하도록 설정합니다.
ENTRYPOINT ["java", "-jar", "app.jar"]
2. GitHub Actions Workflow 생성
이제 GitHub Actions workflow 파일을 생성하여 빌드 및 이미지 생성 단계를 정의합니다.
저는 java11, gradle 을 사용했기 때문에 Java whth Gradle 을 선택했습니다.
원하는 이름으로 수정해도 됩니다. 저는 github-actions.yml 로 수정했습니다.
인텔리제이로 돌아와서 git pull 을 받고 확인해 보면 .github/workflows/github-action.yml 이 생겼습니다.
IDE 말고 github 에서 직접 수정해도 됩니다.
# 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: CI Build & Upload DockerHub
on:
# msater 브랜치로 push가 되면 동작합니다.
# push:
# branches: [ "master" ]
# msater 브랜치로 PR이 오면 동작합니다.
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 저장소 Checkout
uses: actions/checkout@v3
# GitHub-Actions에서 사용될 JDK를 세팅합니다.
# (프로젝트나 AWS의 Java 버전과는 달라도 무방합니다.)
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# gradle caching
# 빌드 시간이 20~30% 단축
# 공식문서 참고 : https://github.com/actions/cache
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# gradlew에 실행권한을 주지 않으면 에러가 뜹니다.
# Run ./gradlew build
# /home/runner/work/_temp/ec1db276-8c5b-4000-a69f-6ae292aee7e6.sh:
# line 1:
# ./gradlew: Permission denied
# Error: Process completed with exit code 126.
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# ./gradlew build 이 실행되면 build/libs 폴더에 jar 파일이 생깁니다.
# 관련 설정 : build.gradle 의 jar {...}, bootJar{...} 부분
- name: Build with Gradle
run: ./gradlew build
# 현재 디렉토리에 있는 Dockerfile 을 사용하여 도커 이미지를 빌드합니다.
# 이때 이미지 이름은 <docker_hub_username>/<image_name> 로 설정됩니다.
# 도커 허브에 이미지를 publish 하기 위해서는 앞에 유저이름을 꼭 붙여야 합니다.
- name: Build Docker image
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/foodlink-springboot .
# docker/login-action 이라는 Action을 사용하여 도커 로그인을 진행합니다.
# -u, -p 옵션을 사용하여 인라인 명령을 사용하면, GitHub Actions에서는
# 보안상의 이유로 오류가 발생하므로 해당 Action을 사용합니다.
- name: Docker Hub 로그인
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Docker Hub 저장소에 이미지를 push 합니다.
- name: Docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/foodlink-springboot
3. 도커허브 가입하고 token 발급하기
가입을 합니다. 레포지토리는 따로 만들지 않아도 됩니다. 그리고 Account Settings - Security 에서 New Access Token 을 눌러 token을 발급 받습니다. 이후에 github 에서 이것을 secret 에 등록하면 됩니다.
4. github 에서 secrets 설정하기
github 에서 secrets를 적용하고자 하는 레포지토리의 Settings - Secrets and variables - Action 에 들어가서 New repository secret 을 눌러서 설정합니다.
저는 dev 브랜치를 만들고 거기서 수정 및 push 후 github 에서 dev -> master 로 PR 을 할 경우에 github action이 동작하게 하였습니다.
아래처럼 PR 을 하면 Action 탭에서 현재 동작하는 상황을 확인 할 수 있습니다.
완료 후 docker hub에 접속해서 확인해 보면
업로드가 정상적으로 되었습니다!
이미지 출처 및 참고
https://zzang9ha.tistory.com/404
https://zzang9ha.tistory.com/339
https://hudi.blog/deploy-with-docker-and-github-actions/
https://itcoin.tistory.com/685
'CI CD' 카테고리의 다른 글
빌드 후에 jar 파일이 두개가 생겼다? (0) | 2023.05.18 |
---|---|
./gradlew build JAVA_HOME 에러 (0) | 2023.05.17 |
댓글