Argo CD系列视频图文版之Github 实现全自动化 CICD

2022-03-31 14:02:03 浏览数 (1)

配套视频

http://mpvideo.qpic.cn/0bc3oiaawaaa7mac2jveojqva4wdbnzaacya.f10002.mp4?dis_k=0377bc3b10a320fa1c8a85ee40d76ea8&dis_t=1648706234&vid=wxv_2156802563935993863&format_id=10002&support_redirect=0&mmversion=false

开篇

本期视频,我们来解决上节课发现的两个问题。问题一是业务源码和部署清单放在同一个仓库,耦合严重。问题二,需要实现 CICD 的自动化

第一个问题很简单,业务源码和部署清单拆分成两个仓库,我们只需要建立新建两个 Github 仓库,分别把 flask-demokustomize 目录移过去就可以啦;

flask-demo[1]

flask-demo-kustomize[2]

第二个问题我们基于 Github Action 来实现。对于使用 Gitlab 的企业用户,也可以通过 Gitlab-ci 实现;这部分内容,大家可以留言或加群咨询。Github Action,是 Github 推出的工作流引擎,可以帮助开发者实现非常多的自动化操作。

这节课的重点,在于如何配置 Github Action,实现全自动持续集成,持续交付。开发人员只需提交代码,合并后的动作,全自动处理。

我们先来解释整体的 CICD 工作流。

流程规划

flask-demo 提交代码后,自动构建容器镜像,并将制品推送到 docker hub 中,再触发 flask-demo-kustomize action,修改部署清单仓库中的镜像地址。ArgoCD 会每隔 3 分钟自动检查部署清单,应用最新的配置。

#todo 流程图

源码仓库工作流

在配置 Github Action 之前,我们还要做一些准备工作。

1. 添加 docker hub 账号密码

为不在工作流中暴露认证信息,需要将 docker hub 账号密码以 secret 的形式存储在源码仓库中。

账号密钥

2. 添加触发 CI 的 Token

我们需要源码仓库的工作流自动触发部署清单仓库中的工作流,此时需要创建具有 workflow 权限的 Personal access token。按照步骤 1 同样存储在 secret 中。

person token

3. 创建 github workflow

该工作流由下面几个步骤组成:

  1. 下载源码到当前目录
  2. 登录 docker hub
  3. 打包源码镜像并推送到镜像仓库
  4. 触发 flask-demo-customize 的工作流
代码语言:javascript复制
name: CI
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Docker Login
        uses: docker/login-action@v1.10.0
        with:
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          logout: true

      - name: build image
        run: |
          make image
          docker tag flask-demo:latest ${{ secrets.USERNAME }}/flask-demo:${{ github.sha }}
          docker push ${{ secrets.USERNAME }}/flask-demo:${{ github.sha }}

      - name: Trigger CI
        uses: InformaticsMatters/trigger-ci-action@1.0.1
        with:
          ci-owner: pyfs
          ci-repository: flask-demo-kustomize
          ci-ref: refs/heads/master
          ci-user: pyfs
          ci-user-token: ${{ secrets.CI_TOKEN }}
          ci-name: CI
          ci-inputs: >-
            image=${{ secrets.USERNAME }}/flask-demo
            sha-tag=${{ github.sha }}

部署清单工作流

此工作比较简单,由以下几个步骤组成:

  1. 下载部署清单到当前目录
  2. 执行 kustomize edit set image 命令修改镜像
  3. 提交对 kustomization.yaml 文件的变更
代码语言:javascript复制
name: CI
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  workflow_dispatch:
    inputs:
      image:
        required: true
        description: 'docker image name'
      sha-tag:
        required: true
        description: 'docker image tag'
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
     if: ${{ github.event.inputs.image }}
      
      - name: kustomize edit
     if: ${{ github.event.inputs.image }}
        run: |
          curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
          kustomize edit set image ${{ github.event.inputs.image }}:${{ github.event.inputs.sha-tag }}
          rm -f kustomize
      
      - name: Git Commit/Push Changes
        uses: actions-x/commit@v2
  if: ${{ github.event.inputs.image }}
        with:
          message: "kustomize set image to ${{ github.event.inputs.image }}:${{ github.event.inputs.sha-tag }}"

配置 ArgoCD 应用

配置 ArgoCD 应用并演示自动化执行效果

结束语

通过仓库拆分和 Github Action 的工作流编排,我们实现了全自动化的 GitopsArgoCD 官方强烈推荐的最佳实践,也差不多是这样的。但是,我们仍然有问题需要解决,这也是 Gitops 中的一个重点。

观察我们的配置清单仓库,会发现 secret 中存储的是数据库连接信息,这么重要的信息,竟然只用 base64 加密就直接存储在代码仓库中。不但加密方式可逆,而且加密方法还是全网都知道的。

虽然 git 仓库作为我们实践 Gitops 的单一可信任源,但在 git 仓库中泄露敏感数据的案例却比比皆是。所以如何处理 Secret 中的数据加密问题,关系到 Gitops 项目能否成功落地。

ArgoCD 社区,给出了多种解决方案,但没有尽善尽美的银弹。下期视频,咱们找一种方案研究研究。

参考资料

[1]flask-demo: git@github.com:pyfs/flask-demo.git

[2]flask-demo-kustomize: https://github.com/pyfs/flask-demo-kustomize

0 人点赞