65.9K
CodeProject 正在变化。 阅读更多。
Home

如何为 Docker 项目创建持续集成持续部署 (CI-CD) 解决方案

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021 年 3 月 31 日

CPOL

3分钟阅读

viewsIcon

6173

如何为 Docker 构建持续集成和持续部署解决方案

我不是 Docker 大师,但我了解它非常有用,并且我喜欢在某些项目中不时地使用它。我喜欢的另一件事是 DevOps 和自动化,但在我拥有的一个项目中,我缺少了这一点。在之前的设置中,容器被构建并发布到 DockerHub,并将日期作为标签。很好,但很难知道哪些版本是“稳定的”,哪些版本是“进行中”。

这篇文章是关于我如何为我的 Docker 项目构建持续集成和持续部署解决方案。所有代码都在 GitHubDocker Hub 上。我分享我的旅程,以便其他人可以享受这种自动化,而无需花费一个周末来构建它。

目标

在本次构建结束时,将有两个 GitHub Actions 来构建和发布应用程序的不同版本到 Docker Hub 上。

发布版本:每次在 GitHub 上发布版本时,都会构建并发布带有匹配版本号的容器标签。(例如:myapp:v1

Beta 版本:每次在 GitHub 的我的分支中进行推送时,都会发布一个带有特定标签的容器。该标签将与草稿发布版本号匹配,并带有 -beta。(例如:myapp:v2-beta)。

在这篇文章中,应用程序是一个 Node.js Twitch 聊天机器人。应用程序的类型并不重要 - 这篇文章侧重于交付。

发布发布版本

每次在 GitHub 上发布版本时,工作流程都会被触发。它将首先检索“发布版本”,然后使用它构建和标记容器,最后将其发布(也称为推送)到 Docker hub。因为“发布”也是“稳定”版本,所以它也会更新容器标签 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 标识的 steps 中,我从 outputs 中检索了 RELEASE_VERSION 的值。

在此 GitHub Action 中,我使用了 elgohr/Publish-Docker-Github-Action@master,因为它很简单并且可以满足我的需求。 如果您愿意,可以直接执行 docker 命令或使用 *docker/github-actions*。

可以从 GitHub 市场 中获得许多选项。

发布 Beta 版本

每次在 GitHub 上进行推送时,工作流程都会被触发。它将首先检索最新版本草稿模式的“发布版本”。 工作流程会将 -beta 添加到检索到的版本并使用它来标记容器。 最后,将其发布(也称为推送)到 Docker hub。

再次,这是完整的 YAML,稍后我会对其进行分解。

name: Build Docker Images
on: [push]
jobs:
  build:
    name: cloudbot-beta
    runs-on: ubuntu-latest
    steps:
    - id: last_release
      uses: InsonusK/get-latest-release@v1.0.1
      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),为了使此工作流程成为可能,您需要创建一个新版本并将其保存在草稿中。

就像在发布工作流程中一样,我需要检索版本。 由于草稿只有部分人可见,因此我们需要获得访问权限。 这可以通过使用 github.token 轻松完成。 这些是在 GitHub Action 启动时自动创建的。

然后使用步骤 InsonusK/get-latest-release,我们将检索版本。

- id: last_release
    uses: InsonusK/get-latest-release@v1.0.1
    with:
        myToken: ${{ github.token }}
        exclude_types: "release, prerelease"
        view_top: 1

这次在传递标签的值时,我们将 "-beta" 连接到它。

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

总结

瞧,一个非常简单且易于实现的容器项目的 ci-cd。 有许多不同的选择,期待了解您是如何完成的?

历史

  • 2021 年 3 月 31 日:初始版本
© . All rights reserved.