Harbor 结合 Webhook 工具的使用

default

背景

由于网络限制,流水线的部署只能控制在外网部分,截止到了生成 docker 镜像阶段,内网部分需要额外的触发部署。

思路如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+--------------------------------------------+
|              推送镜像到 Harbor               |
+--------------------------------------------+
                      |
                      v
+--------------------------------------------+
|             触发 Harbor 的 WebHook           |
+--------------------------------------------+
                      |
                      v
+--------------------------------------------+
|              请求到自建 WebHook 服务            |
+--------------------------------------------+
                      |
                      v
+--------------------------------------------+
|         自建 WebHook 服务调用本地 sh 脚本         |
+--------------------------------------------+
                      |
                      v
+--------------------------------------------+
|            更新并重启目标服务               |
+--------------------------------------------+

部署

Harbor 上创建 Webhook

endpoint 地址为:http://192.168.x.x:10000/hooks/test_deploy

在这里插入图片描述

在这里插入图片描述

harbor 的 webhook 请求内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
	"type": "PUSH_ARTIFACT",
	"occur_at": 1586922308,
	"operator": "admin",
	"event_data": {
		"resources": [{
			"digest": "sha256:8a9e9863dbb6e10edb5adfe917c00da84e1700fa76e7ed02476aa6e6fb8ee0d8",
			"tag": "latest",
			"resource_url": "hub.harbor.com/test-webhook/debian:latest"
		}],
		"repository": {
			"date_created": 1586922308,
			"name": "debian",
			"namespace": "test-webhook",
			"repo_full_name": "test-webhook/debian",
			"repo_type": "private"
		}
	}
}

自建 Webhook 服务

adnanh/webhook: webhook is a lightweight incoming webhook server to run shell commands (github.com)

下载并创建对应文件。

文件夹结构如下:

1
2
3
4
5
./
	webhook
	webhook.exe
	hook.json
	test_deploy.sh

webhook 请求由 webhook 接收,并根据 hook.json 配置内容调用脚本(此处是test_deploy.sh)。

编辑 hook.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[
    {
        "id": "test_deploy",
        "execute-command": "/opt/webhook/test_deploy.sh",
        "command-working-directory": "/opt/webhook/",
        "pass-arguments-to-command": [
            {
                "source": "payload",
                "name": "event_data.repository.name"
            },
            {
                "source": "payload",
                "name": "event_data.resources.0.tag"
            }
        ]
    }
]

编辑 test_deploy.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# 获取 webhook 携带的镜像 tag
NAME=$1

echo "---------start---------"
echo $1, $2
# echo "$NAME"

if [ "$NAME" = "service1" ]
then
    # 获取 webhook 携带的镜像 tag
	# 配置到环境变量中,给 dockercompose.yml 文件调用
    export DATA_PLATFORM_TAG=$1
    echo "restart service1..."
    # 重启目标服务
    cd /opt/docker/app
    docker-compose pull
    # docker-compose stop service1
    docker-compose up service1 -d
    echo "restart service1 finished!"
fi

if [ "$NAME" = "service2" ]
then
    export MARK_TAG=$1
    echo "restart service2..."
    # 重启目标服务
    cd /opt/docker/app
    docker-compose pull
    # docker-compose stop service2
    docker-compose up service2 -d
    echo "restart service2 finished!"
fi

echo "---------end---------"

启动 webhook 服务

1
2
3
4
5
6
# windows
webhook -hooks hooks.json -verbose -hotreload -port 10000

# linux
chmod 755 webhook
./webhook -hooks hooks.json -verbose -hotreload -port 10000

注意给予执行权限 chmod

更优雅地启动/关闭服务

.start.sh

1
2
3
#!/bin/bash
nohup ./webhook -hooks hooks.json -verbose -hotreload -port 10000 > log.log 2>&1 & 
echo $! > service_name.pid

.stop.sh

1
2
#!/bin/bash
kill $(cat service_name.pid)
Comments
  • Latest
  • Oldest
  • Hottest
No comment yet.
Powered by Waline v2.15.8
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……