지난 포스트에서 Github Action을 간단하게 이용해 보았습니다.
이번에는 Github Action을 이용해서 실제로 도커파일을 build하고 push하는 과정을 진행해보겠습니다.
먼저 아래와 같은 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단위로 끊어서 보겠습니다.
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:
- 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 }}
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
태그로 항상 최신 버전의 이미지를 나타냅니다.물론이에요. 아래는 방금 전에 작성해 주신 글을 정리하여 다듬은 내용입니다.
위 워크플로우를 사용하기 위해서는 시크릿 변수를 정의해줘야 합니다.
Secrets and Variables
에 Actions로 들어가줍니다.
변수 설정
Secrets
에 New Repository Secret
를 클릭하고 Name
과 값을 넣어주면 됩니다. 저는 아래와 같은 변수들을 설정해주었습니다.
이제 해당 레포지토리로 push를 해주시면 워크플로우가 진행을 하게 됩니다. 저는 개인 프로젝트를 진행중인 작업을 기준으로 진행을 하였습니다.
워크플로우 진행 (성공)
Docker Hub 확인
Docker registry에 잘 올라온 것을 확인할 수 있습니다.
이제 위의 작업을 통해 GitHub Action을 사용하여 도커 이미지를 빌드하고 푸시하는 전체 프로세스를 완료할 수 있습니다. 이를 통해 코드 변경 사항이 발생할 때 자동으로 도커 이미지를 업데이트하고 배포할 수 있게 됩니다.