使用GitHub工作流和JFrog人工定制Webhooks在Kubernetes上自动部署

完全自动化使您的持续部署(CD)更快、无缝且更少出错。例如,当Docker镜像被推送到生产环境时,触发Helm Chart的部署。

最新的JFrog Artifactory释放使这变得容易!用新的自定义Webhook支持与各种服务直接集成的特性,例如Gitlab管道,詹金斯和GitHub的行为.
这篇博文将通过一个循序渐进的例子来设置Artifactory,当一个特定Docker镜像的新标签被推送时通知Github,创建一个Github Action,用更新后的Docker镜像重新部署一个Helm图表。
先决条件
首先,您需要一个正在运行的Artifactory服务器。如果你还没有,您可以免费创建一个云实例.在下面的示例中,这将是mydemo.jfrog.io.
首先创建两个存储库码头工人和舵.在下面的例子中,它们将以我们最喜欢的项目Vegapunk命名:Vegapunk -docker和Vegapunk -helm。Helm存储库包括一个名为turbine的Helm Chart,它使用一个名为turbine的Docker映像。
我们还需要一个Kubernetes集群,比如亚马逊的.在这个集群上,我们需要一个服务帐户它允许集群连接到我们的Artifactory实例来下载Helm图表和Docker映像。服务帐户使用人工作用域令牌,存储在Kubernetes密钥中。
最后,我们需要一个Github存储库来保存Github Actions工作流。
步骤1:设置Github工作流
创建一个名为.github /工作流/ main.yml它包含以下内容。
“开启”部分描述了何时触发工作流。在我们的示例中,我们将使用repository_dispatch事件它允许使用REST API调用触发工作流。
“types”属性定义了一个过滤器来区分REST调用。
: repository_dispatch:类型:热部署的名字:部署工作:部署:名称:部署到集群上运行:ubuntu-latest步骤:-名称:部署到集群用途:wahyd4 / kubectl-helm-action@master env: KUBE_CONFIG_DATA: ${{秘密。KUBE_CONFIG_DATA}} with: args: | echo部署标签${{github.event.client_payload。标签}}helm repo添加vegapunk-helm https://mydemo.jfrog.io/artifactory/api/helm/vegapunk-helm——用户名k8s——密码${{秘密。RT_HELM_REPO_PASSWORD}} helm upgrade——install -n demo——set image。= $ {{github.event.client_payload标签。——version=0.1.0 turbine vegapunk-helm/turbine kubectl get pod -n demo
以下示例JSON有效负载触发工作流:
{“event_type”:“热部署”,“client_payload”:{“标签”:“3.0.0}}
在这个有效载荷中client_payload.tag属性定义了必须部署的Docker镜像的标签。
作为第一步,工作流配置Helm CLI,通过添加一个Helm存储库(舵手回购)。它使用一个名为k8s的特定Artifactory用户帐户,该帐户具有所需的权限,并使用存储在Github Actions secrets (RT_HELM_REPO_PASSWORD)。
然后,使用helm upgrade,该步骤触发在Kubernetes集群上部署helm图表。它覆盖了属性图像。tag(来自Helm 's)values.yaml),使用REST请求中提供的Docker图像标记$ {{github.event.client_payload.tag}}.
作为最后一个操作,该步骤显示pod的状态,以便我们可以看到更改。
所有这些操作都连接到Kubernetes集群,这需要一个Kubernetes配置文件。此配置作为Github Action秘密传递,名为KUBE_CONFIG_DATA(详情请参阅kubectl-helm-action Github Action)。
步骤2:创建Github令牌
通过Github REST API触发Github Actions工作流需要身份验证。遵循Github的文档到创建身份验证令牌具有将在以下步骤中使用的适当权限。
步骤3:在Artifactory上设置Webhook
从政府菜单,导航到常规> Webhooks。
点击新Webhook,将webhook类型切换为自定义类型,并输入如下值:
- 关键:
热部署
该名称将识别我们的webhook。 - 描述:
使用Github Actions触发热部署
提供有关webhook的一些文档的纯文本。 - URL:
https://api.github.com/repos/ <用户名> / <回购> /分派
*重要:将和 替换为您自己的Github存储库详细信息

在事件下拉,选择Docker标签被推送
- 当被要求选择存储库时,选择Docker镜像将被推送到的Docker存储库(在我们的例子中,
vegapunk-docker-dev-local)。 - 在包括模式列表中,添加Docker镜像名称filter turbine/**(因为我们的Docker镜像是
mydemo.jfrog.io / vegapunk-docker /涡轮)。否则,我们的webhook将被任何Docker映像的推送触发。

在秘密,添加Github令牌:
- 名字:
ghtoken - 价值:你的Github令牌(在第2步创建)
自定义webhook的秘密是一个安全的地方,您可以在这里存储您的秘密,而不会有向其他Artifactory用户泄露秘密的风险。
现在,跟着GitHub的文档,添加这些HTTP标头:
授权:Bearer {{.secrets.ghtoken}}这将会增加授权头文件中存储了Github令牌。接受:应用程序/ vnd.github + jsonX-GitHub-Api-Version: 2022-11-28
最后,添加一个JSON负载:
{“event_type”:“热部署”,“client_payload”:{“标签”:“{{. data。标签}}"}}
在此有效负载中,我们将事件类型设置为热部署这样它就可以触发我们的Github Actions工作流。我们还注入了被推送的Docker镜像的标签{{.data.tag}}.当推送Docker映像时,将通过从以下事件数据中提取数据来构建有效负载。点击保存.
{"domain": "docker", "event_type": " pushing ", "data": {"repo_key": "vegapunk-docker", "path": "turbine/3.0.0/manifest. {Json ", "name": "manifest. Json "。Json ", "sha256": "ac3513d79d82ace55aeac8c430bcc53c973d373637490d81525c8244eb9cd300", "size": 1781, "image_name": "turbine", "tag": "3.0.0", "platforms": []}, "secrets": {"ghtoken": ""}}
步骤4:推送/部署Docker镜像
现在,我们可以使用以下命令向Artifactory推送一个新的Docker映像标记。
> docker push mydemo.jfrog.io/vegapunk-docker/turbine:3.0.1 push指的是repository [mydemo.jfrog. io]。99c482acf42e:层已经存在80115eeb30bc:层已经存在049fd3bdb25d:层已经存在ff1154af28db:层已经存在8477a329ab95:层已经存在7e7121bf193a:层已经存在67a4178b7d47:层已经存在3.0.1:digest: sha256:ac3513d79d82ace55aeac8c430bcc53c973d373637490d81525c8244eb9cd300 size: 1781
确保这个新映像的内容不同于以前的映像,否则它可能会阻止部署。
Docker镜像推送触发JFrog Artifactory中的事件,而JFrog Artifactory又会调用Webhook。Webhook向Github发出REST请求,并触发工作流。
查看Github项目的Actions选项卡,我们将看到正在运行的工作流:
> echo 3.0.1 > helm repo add vegapunk-helm https://yann.jfrog.io/artifactory/api/helm/vegapunk-helm——username k8s -*** "vegapunk-helm"已添加到您的存储库> helm升级——安装-n demo——set image.tag=3.0.1——version=0.1.0 turbine vegapunk-helm/turbine Release "turbine"已升级。稳住快乐!名称:涡轮机最后部署:星期四Jan 26 15:20:01 2023命名空间:demo状态:部署修订:4备注:1。通过运行以下命令获取应用程序的URL: export POD_NAME=$(kubectl Get pods——namespace demo -l "app.kubernetes.io/name=turbine,app.kubernetes. io/name=turbine。kubectl——namespace demo $POD_NAME -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod——namespace demo $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "访问http://127.0.0.1:8080使用您的应用程序" kubectl——namespace demo port-forward $POD_NAME 8080:$CONTAINER_PORT > kubectl get pod -n demo NAME READY STATUS restart AGE turbine-6b94d64d6-qjqfj 1/1 Running 0 3m57s turbine- 6fdb9c67cs -w27xj 0/1 ContainerCreating 0 0s
完成后,我们可以检查Kubernetes pod并检查新的Docker镜像是否已经部署:
kubectl description pod -l 'app.kubernetes。io/name=turbine' -n demo名称:turbine-6fdb9c67cc-w27xj命名空间:demo优先级:0服务帐户:default节点:****开始时间:2023年1月26日星期四16:20:02 +0100标签:app.kubernetes. io/name=turbine' -n demo=涡轮app.kubernetes io /实例。io/name=turbine pod-template-hash=6fdb9c67cc注释:kubernetes. ioio / psp:的。特权状态:运行IP: **** IP: IP: ****控制对象:ReplicaSet/turbine-6fdb9c67cc容器:涡轮机:容器ID: docker://723feb3e002b9eca7e72be9552a9732c243845b81848e7208648f2abc750391e图像:mydemo.jfrog.io/vegapunk-docker/turbine:3.0.1图像ID: docker-pullable://mydemo.jfrog. ioio/vegapunk-docker/turbine@sha256:ac3513d79d82ace55aeac8c430bcc53c973d373637490d81525c8244eb9cd300端口:80/TCP主机端口:0 /TCP状态:Running Started: Thu, 26 Jan 2023 16:20:04 +0100 Ready: True Restart Count: 0 live: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3 Readiness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3环境:Mounts: /var/run/secrets/kubernetes。Io /serviceaccount from from kube-api-access-8vt49
就是这样!现在你可以自己尝试一下,发现所有不同的事件,你可以用它来自动化几乎任何事情!