[GitHub] Actions를 이용하여 docker image build & push 해보기 (CI)

공부기록·2024년 6월 24일
0
post-thumbnail

Github Actions을 이용한 CI/CD과정

이 포스트에서는 Github Actions을 이용한 docker hub에 이미지 push까지 진행해보자!


yml파일 작성하기

  • 앞에서 말했던 과정은 생략하고 새로운 부분을 공부해보자!
on:
  release:
    types:
      - published

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{github.repository}}

Trigger는 Release 발생시로 설정해주었다. push만으론 믿지못해...
환경변수는 두 개가 필요한데 이는 우리가 docker hub에 이미지를 생성할건데 이미지 build & push에 이용된다. 저 환경변수들은 GitHub Container Registry 관련 변수이다.

GitHub Container Registry

조직 혹은 개인 계정에서 컨테이너 이미지를 저장하고 이미지를 레포지토리와 연결할 수 있다.


jdk 설치

distribution? jdk를 제공해주는 vender사 중 하나이다.

      # jdk 설치
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

submodule

  • submodule에 접근하려면 내 토큰이 필요하다.
    해당 repo > settings > Secrets and variables > Actions > New repository secret


토큰에서 권한에 따른 제한이 존재하므로 필요한 권한 설정이 필요하다.

      # submodule 접근
      - name: Checkout submodule
        uses: actions/checkout@v4
        with:
          submodules: recursive
          token: ${{secrets.ACTION_TOKEN}}

또한 submodule 변경이 될 수 있으니 그것도 관리해주어야한다.

     # 서브 모듈 변경 점 있으면 update
      - name: Git Submodule Update
        run: |
          git submodule update --remote --recursive

Docker Hub 로그인

도커허브에 이미지 올려야하니까 로그인해야된다.
내 docker hub 이름이랑 password는 공개되면 안되니까 secret로 관리해줘야한다. 아까 ACTION_TOKEN 만들었던 방법으로 넣어주기.

      # docker hub 로그인
      - name: Log in to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{secrets.DOCKERHUB_USERNAME}}
          password: ${{secrets.DOCKERHUB_PASSWORD}}

password는 docker hub에서 생성한 access token을 뜻한다.
profile > account settings > Security > New Access Token


image의 메타데이터 추출

이미지의 메타데이터를 추출한다. steps가 순차적이기도 한데 동시실행도 가능하다. build-push-action에서 docker hub에 이미지를 push하면 metadata-action에서 해당 이미지의 tags와 labels를 추출하고 그걸 가지고 docker hub 이미지의 tags와 labels를 적용한다.

      # 이미지의 metadata 추출
      - name: Extract metadata (tags, labels) for Docker
        uses: docker/metadata-action@v4
        with:
          images: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}
          
      # Docker Hub에 올리기
      - name: Build and Push Docker Image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ${{secrets.DOCKERHUB_USERNAME}}/study-server
          labels: ${{steps.meta.outputs.labels}}

그리고 이 build 되는 과정에서 배포를 위한 Dockerfile이 필요하다.

terminal창에 ./gradlew build 해보면 build/libs에 jar파일이 생성될거다. 해당 jar파일 이름을 COPY에 넣어주면된다.

우리는 /usr/src/app을 작업 디렉토리로 사용할 것이다.
그리고 현재 존재하는 jar파일을 app.jar파일에 복사한 후 terminal에서는 java -jar app.jar이 실행되어 해당 프로젝트가 실행될 것이다.


프로젝트 빌드

이건 spring boot 빌드하는 과정이다. ./gradlew clean build -x test 명령어를 실행해야하는데 이러려면 gradlew에 실행권한을 주어야한다.

      # 프로젝트 build에 필요한 과정
      - name: Grant execute permission for gradlew
        run : |
          chmod +x gradlew
          ./gradlew clean build -x test



Docker Hub 확인

이러면 Docker hub에 올라간 것을 확인할 수 있다!ㅠㅠ


CD까지 진행한 것은 아니므로 수동으로 로컬에서 image를 받아와 실행해보자

$ docker pull {hub명}/{이미지명}:latest

$ docker images

이미지 확인 후 컨테이너 실행하면 끝!

docker에서도 8080포트가 이용되고 우리도 8080포트에서 실행할 것임을 명시해준다.

$ docker run -dp 8080:8080 {hub명}/{이미지명}:latest

오랜만에 공부하는 이미지 실행 명령어

-d : 백그라운드 실행
-p : 포트포워딩 호스트포트:컨테이너포트


배포 완료!

로컬이지만ㅎㅎ


출처

0개의 댓글

관련 채용 정보