본문 바로가기
DevOps

CI/CD 구축하기(2) - Docker Hub

by byeongoo 2021. 8. 25.

 

이번편에서는 지난 CI/CD 구축하기(1) - Github Action 이란? 에서 빌드한 결과를 Docker 이미지로 만들어서 Docker Hub에 push 해보는 과정까지 진행해보겠다.

1. Docker Hub 회원 가입 및 토큰 발행

먼저 Docker Hub에 접속해서 회원 가입 및 로그인을 한다.

 

 

Docker Hub에서는 소스 코드를 깃허브에 올려서 관리하는 것 처럼, 빌드한 도커 이미지를 Docker Hub에 저장해서 사용할 수 있도록한다.

 

Github Action에서 Docker에 이미지를 올리기 위해서 인증 token을 발행한다. 토큰 발행하는 방법은 여기를 참고한다.

 

 

2. Github Action Docker 이미지 PUSH

github repository의 Settings -> Secrets 메뉴에 접속하여 New repository secret을 클릭하고 secrets를 등록한다.

  • DOCKERHUB_USERNAME : Docker Hub에 등록된 유저 이름을 등록한다. 
  • DOCKERHUB_TOKEN : Docker Hub에서 발행한 token 값을 등록한다.

 

다음으로 Github Action에서 기존에 작성한 yml 파일을 수정한다. Login to DockerHub step을 추가하였다.

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

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'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with Gradle
      run: ./gradlew build
      
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}

 

파일 수정 후 build 과정을 보면 Login to DockerHub가 성공한 것을 볼 수 있다.

 

 

이제 도커 이미지를 빌드하고 push하는 step을 추가한다. 도커 이미지를 빌드하기 위해서는 Dockerfile이 프로젝트에 먼저 작성되어 있어야한다. 

 

gradle로 빌드 시 jar 파일은 build\libs 폴더 아래에 생성된다. build.gradle에 bootJar 영역에 jar 파일 이름을 설정해 두었는데 jar 이름을 "springboot-template"로 설정해두었다.

#실행하기 위한 환경만 필요하면 jre, 개발까지면 jdk
FROM openjdk:11-jdk

#컨테이너 안에 jar 파일은 app.jar 될꺼임
COPY build/libs/springboot-template.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

 

이제 Github action의 yml 파일에 도커 이미지를 빌드하고 Docker Hub에 push 하는 내용을 추가한다.

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

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'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with Gradle
      run: ./gradlew build
      
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}
    
    - name: build and release to DockerHub
      env:
        NAME: goohoon # 계정 명
        REPO: spring-template # 레포 이름
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest

 

빌드 결과를 확인해보면 성공한 것을 알 수 있다.

 

Docker Hub repository에 실제로 올라왔는지 확인해보자. 올라왔다면 아래처럼 latest라는 태그가 생긴것을 볼 수 있다.