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

目标

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

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

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

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

发布发布版本

每次在 GitHub 上发布版本时,都会触发工作流。它将首先检索“发布版本”,然后使用它构建和标记容器,最后将其发布(也称为推送)到 Docker 集线器。因为一个“发布”也是一个“稳定”版本,它也会更新容器标签latest

让我们看一下 GitHub Action 的完整 YAML 定义,之后我将对其进行分解。

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: release了 和type: published,根据需要进行调整。

下一个有趣的部分是 step 中的行vars

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

在这里,我使用环境变量GITHUB_REF(前 10 个字符的条纹包含“ refs/tags/ ”)来初始化一个局部变量RELEASE_VERSION。该值可从该步骤的输出中获得,例如 YAML 的最后一行。

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

从id 标识的步骤vars中,我从outputs的值中检索到RELEASE_VERSION

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

GitHub 市场提供了许多选项。

发布测试版

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

再一次,这里是完整的 YAML,我会在之后分解它。

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),为了使这个工作流程成为可能,您需要创建一个新版本并将其保存在Draft 中

就像在发布工作流中一样,我需要检索版本。因为草稿只对某些人可见,所以我们需要获得访问权限。这很容易通过使用github.token. 这些是在 GitHub Action 启动时自动创建的。

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值