🍊 触发Jenkins
# Jenkins简介
一款免费且开源的持续集成工具
通俗地讲,它可以自动化地对代码仓库进行操作。
在torchserve部署中,因为源代码经常性会有修改,如果每次修改完源代码之后需要手动更新镜像,那未免有些繁琐,Jenkins可以帮助我们自动化这一过程。
每次代码仓库的master分支有所变化,Jenkins就会触发预先设定的命令,完成镜像的构建
Jenkins在意识形态上是站在乌克兰那一边的
# Jenkins项目设置
在Jenkins界面点击"New Items",然后输入项目名字,选择`FreeStyle project`.
>i Jenkins项目名字,尽量和代码仓库的名字保持一致。在公司,不同部门共用Jenkins,一般会在一类项目加一个前缀,例如`ai-inference`表示AI模型推理。
>i 配置没必要重头开始,如果以前有项目已经建立过,可以在最下面的`Copy from`处,拷贝一个项目,可以拷贝车牌识别项目的配置。
Description处填写项目的简述
Discard old builds可以删除老旧的构建,我一般设置为保留10条记录
## Source Code Management
选择Git,然后输入项目地址,比如说`https://gitlab.com/yinghaodang/chat_gpt.git`,选用HTTP/HTTPS协议的话,要注意是否开启了2FA认证,一般情况下是开启的。2FA认证要求使用token代替密码访问代码仓库。token的获取在个人信息界面的`Access Tokens`处。
下图是配置Credentials的界面,点击`ADD`按钮即可弹出。

下图是源代码管理界面的截图

## Build Triggers
Jenkins要想使用Gitlab的Webhooks需要安装插件,插件管理页面搜索`gitlab plugin`。
`Generic Webhook Trigger`这个插件也不错,根据介绍一个插件就集成了GitHub,Gitlab和Gitee。
>i 有个小技巧,可以看插件的副标签,选择含有`Build Triggers`的插件。
>w 生产环境中,Jenkins的插件需要一开始规划一下。因为安装插件之后需要重启Jenkins,如果有项目正在构建的话会失败。

源代码的任意一点变化,需要经过两道关卡才能触发Jenkins。
- Gitlab中的设置,可以设置何种行为发送HTTP请求
- Jenkins插件里的设置,可以设置接收何种行为的HTTP请求
## Build Steps
在这里输入一些想对源代码做的操作。
根据Jenkins的安装位置不同,项目配置文件所在的位置也有所不同,如果以Docker形式安装,其位置在`/var/jenkins_home/jobs/xxx`。对应的工作目录就是`/var/jenkins_home/workspace/xxx`,此目录和代码仓库的目录别无二致,如果此目录下有Dockerfile,则需要`cd`到该目录下,然后`docker build -t image_name:v1 .` 和 `docker push image_name:v1`
本来是想用chat_gpt这个项目测试一下的,但是由于Docker里面没有装Docker。虽然是以`--privileged=true`形式启动的,但是Docker容器里面装Docker听说有风险。
第一次需要手动触发Build Now按钮
`build`之后的结果会以`#1`,`#2`这样的形式存在,点击进入,然后点击`Console Output`
```
Started by user yinghaodang
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/chat_gpt
The recommended git tool is: NONE
using credential da260279-810b-4ecd-a76c-2f3aced047b4
Cloning the remote Git repository
Cloning repository https://gitlab.com/yinghaodang/chat_gpt.git
> git init /var/jenkins_home/workspace/chat_gpt # timeout=10
Fetching upstream changes from https://gitlab.com/yinghaodang/chat_gpt.git
> git --version # timeout=10
> git --version # 'git version 2.30.2'
using GIT_ASKPASS to set credentials Gitlab代码仓库的访问权限,日期到2023年4月3日过期。
> git fetch --tags --force --progress -- https://gitlab.com/yinghaodang/chat_gpt.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git config remote.origin.url https://gitlab.com/yinghaodang/chat_gpt.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
> git rev-parse refs/remotes/origin/main^{commit} # timeout=10
Checking out Revision 5463f3192ccdb27130e326ca3b63b11916342ea3 (refs/remotes/origin/main)
> git config core.sparsecheckout # timeout=10
> git checkout -f 5463f3192ccdb27130e326ca3b63b11916342ea3 # timeout=10
Commit message: "Initial commit"
First time build. Skipping changelog.
[chat_gpt] $ /bin/sh -xe /tmp/jenkins13890970920643442894.sh
+ cd /var/jenkins_home/jobs/chat_gpt
+ ls
Finished: SUCCESS
```
可以观察到项目的地址是`/var/jenkins_home/workspace/chat_gpt`
如果仅是测试的话可以使用:
```
cd /var/jenkins_home/workspace/chat_gpt
ls > /var/jenkins_home/temp
```
新创建的`temp`文件会映射到宿主机的`~/software/jenkins/temp`(以卷的形式)
通过当本地push代码到代码仓库之后,观察Jenkins是否会执行命令并在本地形成`temp`文件。
如果想要写一个Bash命令的话,还是需要宿主机的环境的,以Docker安装Jenkins难以解决这个问题。Jenkins的原始镜像非常"贫瘠"。

[本文相关的Jenkins安装](https://easydoc.net/doc/20630880/Id3thciC/o443c7sx)
# Gitlab仓库设置Webhooks
Webhook是一种应用给其他应用提供实时信息的方式。当某个事件发生时,比如代码推送或评论发布,源网站可以发起一个HTTP请求到webhook配置的URL,从而触发另一个网站的行为。webhook有时也被称为反向API。
在torchserve部署中,Webhooks可以使得代码仓库一旦发生变化,就会发送一个HTTP请求到Jenkins,从而触发Jenkins的一系列操作。
>i 一般而言,Jenkins中会写下:构建镜像,然后推送镜像,这两行代码。
过程我已经懂了,但是复现的过程中,有出现了奇奇怪怪的困难
GitLab不允许Webhooks本地的,不玩了,跑了。

图片上URL是Jenkins设置界面Triggers处出现的URL,密码是Jenkins的秘钥。获取方式请看下图。

# 查看结果
目前只有一份文件

只能手动Build一下了
