GitHub Actions (2)

greenTea·2024년 1월 29일
0
post-thumbnail

GitHub Actions를 이용한 도커 build, push

지난 포스트에서 Github Action을 간단하게 이용해 보았습니다.

이번에는 Github Action을 이용해서 실제로 도커파일을 build하고 push하는 과정을 진행해보겠습니다.

먼저 아래와 같은 yml 파일을 만들어줍니다.

workflow.yml

name: push image to hub
on:
  push:
    branches:
    - main
    paths-ignore:
      - '.github/**'
    

jobs:
  makeTagAndRelease:
    name: create tag and release
    permissions:
      contents: write
    outputs:
      tag_name: ${{ steps.tag_version.outputs.new_tag }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: crate tag and version
        id: tag_version
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
      - name: Create a GitHub release
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ steps.tag_version.outputs.new_tag }}
          name: Release ${{ steps.tag_version.outputs.new_tag }}
          body: ${{ steps.tag_version.outputs.changelog }}
  dockerBuild:
    runs-on: ubuntu-latest
    needs: makeTagAndRelease
    steps:
    - name: checkout
      uses: actions/checkout@v4.1.1
    - name: docker login
      uses: docker/login-action@v3.0.0
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    - name: docker build and push
      uses: docker/build-push-action@v5.1.0
      with:
        push: true
        context: .
        tags: |
            ${{ secrets.DOCKER_REPO }}/check-yml:${{ needs.makeTagAndRelease.outputs.tag_name }},
            ${{ secrets.DOCKER_REPO }}/check-yml:latest

위 파일을 job단위로 끊어서 보겠습니다.

1. 기본 정의

name: push image to hub
on:
  push:
    branches:
    - main
    paths-ignore:
      - '.github/**'
  • push 이벤트가 발생한 경우에 해당 워크플로우가 동작을 하게 됩니다.
  • paths-ignore를 통해 '.github/**'에서 변화가 발생한 경우에는 해당 워크플로우를 진행하지 않겠다고 정의하였습니다.

2. 태그 정의

jobs:
  makeTagAndRelease:
    name: Create tag and release
    permissions:
      contents: write
    outputs:
      tag_name: ${{ steps.tag_version.outputs.new_tag }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Create tag and version
        id: tag_version
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Create a GitHub release
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ steps.tag_version.outputs.new_tag }}
          name: Release ${{ steps.tag_version.outputs.new_tag }}
          body: ${{ steps.tag_version.outputs.changelog }}

이 부분은 실제로 GitHub Action을 통해 태그를 생성하고 릴리스를 만드는 작업입니다.

  • actions/checkout@v2를 사용하여 현재 작업 디렉토리에 GitHub 리포지토리의 내용을 가져옵니다.

  • uses: mathieudutour/github-tag-action@v6.1를 사용하여 GitHub Actions를 통해 태그를 생성합니다. 이때 ${{ secrets.GITHUB_TOKEN }}를 사용하여 GitHub API에 인증합니다.

  • uses: ncipollo/release-action@v1를 사용하여 태그에 대한 GitHub 릴리스를 생성합니다. 이때 생성된 태그의 이름과 릴리스의 제목은 생성된 태그를 기반으로 합니다. body는 변경 로그(Changelog)로 설정되어 있어, 변경사항에 대한 내용을 기록할 수 있습니다.

  • steps.tag_version.outputs.new_tag
    tag_name이라는 이름 변수를 저장합니다. 이렇게 저장된 값은 다른 job에서 ${{needs.makeTagAndRelease.outputs.tag_name }}과 같은 방식으로 참조할 수 있습니다.

    outputs:
      tag_name: ${{ steps.tag_version.outputs.new_tag }}

3. 도커 빌드 및 푸시

  dockerBuild:
    runs-on: ubuntu-latest
    needs: makeTagAndRelease
    steps:
    - name: checkout
      uses: actions/checkout@v4.1.1
    - name: docker login
      uses: docker/login-action@v3.0.0
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    - name: docker build and push
      uses: docker/build-push-action@v5.1.0
      with:
        push: true
        context: .
        tags: |
            ${{ secrets.DOCKER_REPO }}/check-yml:${{ needs.makeTagAndRelease.outputs.tag_name }},
            ${{ secrets.DOCKER_REPO }}/check-yml:latest
  • needs: makeTagAndRelease는 앞서 정의한 makeTagAndRelease job의 완료를 기다린 후에 현재의 job이 실행되도록 하는 옵션입니다.
  • actions/checkout@v4.1.1를 통해 다시 한 번 레포지토리의 코드를 가져옵니다.
  • docker/login-action@v3.0.0은 Docker Hub에 로그인하는데 사용됩니다. 여기서 ${{ secrets.DOCKER_USERNAME }}${{ secrets.DOCKER_PASSWORD }}는 Docker Hub에 로그인하기 위해 필요한 사용자 이름과 비밀번호를 나타냅니다.
  • docker/build-push-action@v5.1.0는 Docker 이미지를 빌드하고 푸시하는데 사용됩니다. push: true로 설정하여 빌드된 이미지를 Docker Hub에 푸시합니다. tags에서는 두 가지 태그를 설정했습니다. 첫 번째는 이전 job에서 생성된 태그 값에 해당하는 이미지, 두 번째는 latest 태그로 항상 최신 버전의 이미지를 나타냅니다.

물론이에요. 아래는 방금 전에 작성해 주신 글을 정리하여 다듬은 내용입니다.


4. 나머지 작업

위 워크플로우를 사용하기 위해서는 시크릿 변수를 정의해줘야 합니다.

  1. Secrets and Variables에 Actions로 들어가줍니다.

    Step 1

  2. 변수 설정

    SecretsNew Repository Secret를 클릭하고 Name과 값을 넣어주면 됩니다. 저는 아래와 같은 변수들을 설정해주었습니다.

    Step 2

5. 워크플로우 진행

이제 해당 레포지토리로 push를 해주시면 워크플로우가 진행을 하게 됩니다. 저는 개인 프로젝트를 진행중인 작업을 기준으로 진행을 하였습니다.

  • 워크플로우 진행 (성공)
    Workflow Success

  • Docker Hub 확인

Docker registry에 잘 올라온 것을 확인할 수 있습니다.

결론

이제 위의 작업을 통해 GitHub Action을 사용하여 도커 이미지를 빌드하고 푸시하는 전체 프로세스를 완료할 수 있습니다. 이를 통해 코드 변경 사항이 발생할 때 자동으로 도커 이미지를 업데이트하고 배포할 수 있게 됩니다.

profile
greenTea입니다.

0개의 댓글