本篇以redhat workshop的一个例子为蓝本
讲述从代码到镜像管理,再通过修改git,提交github Pull Request,完成gitOps的流程
Pipeline流程简述
避免贴冗长的代码,下面挨个对task简单说明下,文章最后会有验证环节继续看实际效果。
完整配置看这里:https://github.com/massivezh/tekton-cicd-demo/blob/main/Pipeline.yaml
第一部分:把应用代码统统变成docker镜像
-
clone-repo
克隆app代码 -
set-image-tag
提取commit的id,作为将来镜像的tag -
build-n-push
buildah构建镜像,并上传到docker hub -
tag-to-latest
给镜像打上latest的tag
第二部分:gitOps的操作
-
clone-deploy-repo
克隆gitOps代码 -
patch-dev
更新dev环境镜像版本 -
commit-to-dev dev
环境就直接push了 -
patch-prod
更新prod环境镜像版本 -
branch-to-prod
创建branch到git -
pr-to-prod
创建Pull Request等待人工介入审批
可以看到上面gitOps流程里,dev环境直接push到main分支上,就触发ArgoCD直接部署了,
而prod环境要等PR merge到main上才能触发ArgoCD部署。
一些具体细节
其中大部分task在之前的系列中已经讲过了,不再赘述
这里做一些补充分别是准备各种用户名密码和Pull Request部分的操作
先是准备secrets
分别是docker hub,git,git rest api的登录凭据
这一部分很繁琐,实际运用过程中最好用vault之类的工具进行管理
docker凭据
- 使用docker login或者nerdctl login生成配置文件
- 再根据文件生成secret
kubectl create secret generic dockerconfig-secret --from-file=/root/.docker/config.json
git命令行工具凭据
按下面配置生成secret
kind: Secret
apiVersion: v1
metadata:
name: git-basic-auth-secret
type: Opaque
stringData:
.gitconfig: |
[credential "https://github.com"]
helper = store
.git-credentials: |
https://gitbot:xxxxx@github.com
git rest api凭据
由于最后Pull Request是使用的github-open-pr
这个task使用github rest api操作,
所以需要单独创建一个secret包含TOKEN
kubectl create secret generic github --from-literal token="TTOKEN"
Pull Requets的处理
pull request最后是在github-open-pr
这个task实现的
通过github rest api的post提交一个Pull Requets请求
可以用curl工具,也可以写段程序调用库
主要参数是在Body parameters里的这几个:
-
title
提交PR需要写的废话标题 -
body
提交PR需要写的废话内容 -
base
就是main分支,也是会触发ArgoCD执行的这个分支 -
head
前面步骤自动创建的branch,本文对应2f7d99,包含最新提交内容。
参考:https://docs.github.com/en/rest/pulls/pulls#create-a-pull-request#
结果验证
- 手动在app仓库改点东西,注意commit id最后几位是
2f7d99
- docker hub有构建完的镜像,分别有tag:2f7d99 和latest
- 接下来看到main分支里dev环境配置已经更新(实际会触发ArgoCD部署最新版本)
- 而main分支的prod环境并没有更新
- 原因就是创建了新的branch
- 然后更新在branch:2f7d99里了
- 最后创建了Pull Request,待人工介入是否要merge到main分支
- 一旦手动介入确认了PR,merge到了main分支,最终会触发ArgoCD部署到prod环境。
与原始版本的一些出入
由于操作的环境不一样,演示的目的也不一样,与原始的demo有一点的改动
大致如下:
- 取消了trigger触发部分,简化流程(trigger请参考前几篇文章)
- 不使用gitea的内置仓库,而是使用github
- 不使用内置docker registry,而是使用docker hub
- 部分系统添加了登录认证处理
- 使用catalog的
github-open-pr
task替代自定义的task-create-pr