
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-demo 和 kustomize 目录移过去就可以啦;
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 之前,我们还要做一些准备工作。
为不在工作流中暴露认证信息,需要将 docker hub 账号密码以 secret 的形式存储在源码仓库中。

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

person token
该工作流由下面几个步骤组成:
docker hubflask-demo-customize 的工作流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 }}
此工作比较简单,由以下几个步骤组成:
kustomize edit set image 命令修改镜像kustomization.yaml 文件的变更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 应用并演示自动化执行效果
通过仓库拆分和 Github Action 的工作流编排,我们实现了全自动化的 Gitops。ArgoCD 官方强烈推荐的最佳实践,也差不多是这样的。但是,我们仍然有问题需要解决,这也是 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