Docker 프로젝트용 CI-CD(지속적 통합 지속적 배포) 솔루션을 만드는 방법

나는 Docker 마스터는 아니지만 매우 유용하다는 것을 이해하고 일부 프로젝트에서 때때로 사용하는 것을 좋아합니다. 내가 좋아하는 또 다른 것은 DevOps 및 자동화이며 내가 가진 프로젝트에서 나는 그것을 놓쳤습니다. 이전 설정에서 컨테이너가 빌드되었고 날짜를 태그로 사용하여 DockerHub에 게시되었습니다. 훌륭하지만 지금은 버전이 "안정적"이고 "진행 중"인 버전을 사용하는 것이 쉽지 않습니다.

이 게시물은 도커 프로젝트를 위한 지속적인 통합 및 지속적인 배포 솔루션을 구축하는 방법에 대한 것입니다. 모든 코드는 GitHubDocker Hub에 있습니다. 나는 다른 사람들이 그 자동화를 즐기고 그것을 구축하는 데 주말을 낭비하지 않도록 내 여정을 공유합니다.



목표



이 빌드가 끝나면 Docker 허브에서 다른 버전의 애플리케이션을 빌드하고 게시하기 위한 두 개의 GitHub 작업이 있습니다.

릴리스 버전: 릴리스가 GitHub에 게시될 때마다 버전 번호가 일치하는 컨테이너 태그가 빌드되고 게시됩니다. (예: myapp:v1)

베타 버전: GitHub의 내 브랜치에서 푸시할 때마다 컨테이너가 특정 태그와 함께 게시됩니다. 태그는 초안 릴리스 버전 번호와 -beta를 일치시킵니다. (예: myapp:v2-베타).

이 게시물에서 애플리케이션은 Node.js Twitch 챗봇입니다. 응용 프로그램의 유형은 배달에 중점을 두는 것이 중요하지 않습니다.

릴리스 버전 게시



릴리스가 GitHub에 게시될 때마다 워크플로가 트리거됩니다. 먼저 "릴리스 버전"을 검색한 다음 컨테이너를 빌드하고 태그를 지정하고 마지막으로 Docker 허브에 게시(일명 푸시)합니다. "릴리스"는 "안정적인"버전이기도 하므로 컨테이너 태그도 업데이트합니다latest.

GitHub Action의 전체 YAML 정의를 살펴보고 나중에 분석하겠습니다.

name: Release Docker Image CI

on:
  release:
    types: [published]
jobs:
  update:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set outputs
      id: vars
      run: echo ::set-output name=RELEASE_VERSION::$(echo ${GITHUB_REF:10})
    - name: Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: ${{secrets.DOCKER_USER}}/cloudbot
        username: ${{ secrets.DOCKER_USER }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        tags: "latest,${{ steps.vars.outputs.RELEASE_VERSION }}"


워크플로가 트리거되는 횟수를 제한하기 위해 on: releasetype: published를 사용했습니다. 원하는 대로 조정합니다.

다음 흥미로운 부분은 단계 vars의 라인입니다.

- name: Set outputs
    id: vars
    run: echo ::set-output name=RELEASE_VERSION::$(echo ${GITHUB_REF:10})


여기에서는 환경 변수GITHUB_REF(처음 10개의 스트라이프에 "refs/tags/"가 포함됨)를 사용하여 로컬 변수RELEASE_VERSION를 초기화합니다. 값은 YAML의 마지막 줄과 같이 해당 단계의 출력에서 ​​사용할 수 있습니다.

tags: "latest,${{ steps.vars.outputs.RELEASE_VERSION }}"


id vars로 식별된 단계에서 출력에서 ​​RELEASE_VERSION 값을 검색했습니다.

이 GitHub Action에서는 elgohr/Publish-Docker-Github-Action@master이 간단하고 필요한 작업을 수행했기 때문에 사용했습니다. docker/github-actions 를 선호하거나 사용하는 경우 docker 명령을 직접 실행할 수 있습니다.

GitHub marketplace에서 사용할 수 있는 많은 옵션이 있습니다.

베타 버전 게시



GitHub에서 푸시가 완료될 때마다 워크플로가 트리거됩니다. 초안 모드에서 가장 최근 릴리스의 "릴리스 버전"을 먼저 검색합니다. 워크플로는 검색된 버전에 대해 발생하고-beta 이를 사용하여 컨테이너에 태그를 지정합니다. 마지막으로 Docker 허브에 게시(일명 푸시)합니다.

다시 한 번, 여기에 전체 YAML이 있습니다. 나중에 분해하겠습니다.

name: Build Docker Images
on: [push]
jobs:
  build:
    name: cloudbot-beta
    runs-on: ubuntu-latest
    steps:
    - id: last_release
      uses: InsonusK/[email protected]
      with:
          myToken: ${{ github.token }}
          exclude_types: "release, prerelease"
          view_top: 1  
    - uses: actions/checkout@v2
    - name: Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: ${{secrets.DOCKER_USER}}/cloudbot
        username: ${{ secrets.DOCKER_USER }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        tags: "${{ steps.last_release.outputs.tag_name }}-beta"


여기서 어려움은 "미래"버전에서 태그를 만들고 싶었다는 것입니다. 모든 사람이 볼 수 없기 때문에 초안 릴리스를 사용하기로 결정했습니다. 따라서 미래처럼 보입니다.

마지막 릴리스가 버전 1(v1.0)인 경우 이 워크플로우를 가능하게 하려면 새 릴리스를 생성하고 Draft에 저장해야 합니다.



릴리스 워크플로와 마찬가지로 버전을 검색해야 합니다. 초안은 일부 사용자에게만 표시되기 때문에 액세스 권한이 필요합니다. 이것은 github.token 를 사용하여 쉽게 수행할 수 있습니다. GitHub Action이 시작되면 자동으로 생성됩니다.

그런 다음 단계InsonusK/get-latest-release를 사용하여 버전을 검색합니다.

- id: last_release
    uses: InsonusK/[email protected]
    with:
        myToken: ${{ github.token }}
        exclude_types: "release, prerelease"
        view_top: 1   


이번에는 태그 값을 전달할 때 "-beta"를 연결합니다.

tags: "${{ steps.last_release.outputs.tag_name }}-beta"




마무리



그리고 짜잔, 컨테이너 프로젝트를 위해 매우 간단하고 구현하기 쉬운 ci-cd입니다. 다양한 옵션이 있으며 어떻게 작업을 수행했는지 알아보고 싶으신가요?

좋은 웹페이지 즐겨찾기