매번 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 값이 필요하다.
그래서 아래와 같은 코드가 위에 추가된 것이다.
- name: Temporarily save build artifact
uses: actions/upload-artifact@v2
with:
name: build-artifact
path: build
retention-days: 1
- name: Retrieve built
uses: actions/download-artifact@v2
with:
name: build-artifact
path: build
실제로 main 브랜치에 푸쉬하면 아래와 같이 잘 동작하는 것을 확인 할 수 있다.