配套视频
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
之前,我们还要做一些准备工作。
1. 添加 docker hub 账号密码
为不在工作流中暴露认证信息,需要将 docker hub
账号密码以 secret
的形式存储在源码仓库中。
账号密钥
2. 添加触发 CI 的 Token
我们需要源码仓库的工作流自动触发部署清单仓库中的工作流,此时需要创建具有 workflow
权限的 Personal access token
。按照步骤 1
同样存储在 secret
中。
person token
3. 创建 github workflow
该工作流由下面几个步骤组成:
- 下载源码到当前目录
- 登录
docker hub
- 打包源码镜像并推送到镜像仓库
- 触发
flask-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 应用
配置 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