Github Action으로 Spring boot 프로젝트 이미지를 Docker hub에 업로드하자

코딩하는범이·2021년 12월 17일
0

매번 CircleCI를 이용하다가 github에 있는 Github Action을 사용하기로 했다.
사실 파이프라인이 매번 잘 돌아가는지 확인 하려면 CircleCI의 홈페이지에 접속하는게 귀찮았기 때문이다.

public repository는 Action에 대한 부분을 자유롭게 쓸 수있지만, private repository는 제약사항이 있다. 본인의 저장소가 private 하다면, Jenkins,CircleCI 를 사용하는 것도 좋은 생각인것 같다.

일단 docker 이미지를 만들기 위한 작업은 모두 되어 있다고 가정한다. ex) Dockerfile

해당 Github Repository의 Action을 누르게 되면 아래와 같은 화면이 등장한다

필자는 Gradle 기반의 Spring boot 프로젝트라서 Java with Gradle을 선택했다.

그리고 제공해주는 템플릿을 아래와 같이 변경했다.

최종 결과

# 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://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 17
      uses: actions/setup-java@v2
      with:
        java-version: '17'
        distribution: 'adopt'
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Test with Gradle # test application build
      run: ./gradlew test
    - name: Build with Gradle
      run: ./gradlew build -x test
    - name: Temporarily save build artifact
      uses: actions/upload-artifact@v2
      with:
        name: build-artifact
        path: build
        retention-days: 1
  docker:
    name: Deploy Docker Image
    runs-on: ubuntu-latest
    needs: build
    env:
      REPO: ${{ secrets.DOCKER_REPO }}
    steps:
    - uses: actions/checkout@v2
    - name: Retrieve built
      uses: actions/download-artifact@v2
      with:
        name: build-artifact
        path: build
    - name: Docker Hub Sign-in
      run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
    - name: Building Docker Image
      run: docker build -t $REPO:latest -t $REPO:${GITHUB_RUN_ID} .
    - name: Publish Docker Image
      run: docker push $REPO

아래를 통해서 main branchs에 push 되었을때만 ci를 돌린다.

on:
  push:
    branches: [ main ]

위에 보이는 ${{secrets.DOCKER_USERNAME}}는 해당 Repository의 Secrets 에 추가해 주었다.

Repository의 Settings -> Secrets 에서 추가 할 수 있다.

그리고 위의 코드는 각각의 Runner에서 돌아가게 되는데 docker runner에 needs: build 를 넣어 주었다 하더라도 build runner에서 수행했던 결과는 docker runner에서 공유하지 못한다.
하지만 docker에서 build 하기 위해서는 gradle build 값이 필요하다.

그래서 아래와 같은 코드가 위에 추가된 것이다.

build

- name: Temporarily save build artifact
      uses: actions/upload-artifact@v2
      with:
        name: build-artifact
        path: build
        retention-days: 1

docker

- name: Retrieve built
      uses: actions/download-artifact@v2
      with:
        name: build-artifact
        path: build

실제로 main 브랜치에 푸쉬하면 아래와 같이 잘 동작하는 것을 확인 할 수 있다.

profile
기록 그리고 기억

0개의 댓글