0
点赞
收藏
分享

微信扫一扫

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


配套视频

开篇

本期视频,我们来解决上节课发现的两个问题。问题一是业务源码和部署清单放在同一个仓库,耦合严重。问题二,需要实现 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​​ 的形式存储在源码仓库中。

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

账号密钥

2. 添加触发 CI 的 Token

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

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

person token

3. 创建 github workflow

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

  1. 下载源码到当前目录
  2. 登录​​docker hub​
  3. 打包源码镜像并推送到镜像仓库
  4. 触发​​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 }}

部署清单工作流

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

  1. 下载部署清单到当前目录
  2. 执行​​kustomize edit set image​​ 命令修改镜像
  3. 提交对​​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​​

举报

相关推荐

0 条评论