如何及时响应用户的请求,又不耽误美好的时光?方法肯定很多。
本着能搞复杂,绝不简单处理的原则,这里采用“GitLab webhook 触发构建”。
- 先通过 git 移动端向 GitLab 提交一份包含某个操作指令的代码;
- GitLab 通过 GitLab webhook 触发 Jenkins 执行构建,下拉代码;
- Jenkins 从 GitLab 代码里获取执行指令,根据指令执行预设的脚本;
- 最后将执行结果和日志回传到同一个代码库的另一个分支,方便发起者查询执行结果,形成闭环。
- “GitLab webhook 触发构建”这种方式适合于远程利用 WEB 接口方式进行运维,作为远程运维的一种补充。(也可在 运维/DevOps/SRE 场景中扩展为更完整的自动化流程。)
一、部署 Jenkins 运行环境
1、在宿主机创建用户和目录并授权
Jenkins 容器内是以 Jenkins(uid=1000,gid=1000)用户来运行的,先在宿主机环境先创建这个用户;
mkdir /opt/jenkins
cd /opt/jenkins
#
# 因为知道Jenkins容器内是以Jenkins(uid=1000,gid=1000)用户来运行的,先在宿主机环境先创建这个用户
groupadd -g1000 jenkins
useradd -u1000 -g1000 -s /sbin/nologin jenkins
#
# 创建Jenkins的数据存储目录
mkdir data
#
# 将data目录的所有者改为jenkins,这样容器启动就可以将数据写入这个目录了。
chown -R jenkins:jenkins data
#
# 让jenkins容器对宿主机的docker有访问权限,但这种配置在docker重启后就复位了,不建议。
#
#chown jenkins /var/run/docker.sock
#
# 获取宿主机 `docker` 组的 GID(组 ID),供下面的compose配置文件里的group_add参数使用。
getent group docker | cut -d: -f3
#
# 输出示例:993
2、创建 Jenkins 的 compose.yaml 文件
将 Dockerd 的套接字挂进容器内供 Jenkins 调用,通过 “group_add” 配置项授予容器访问该套接字的权限。(这里属于典型的 云原生 容器化部署方式。)
cat > compose.yaml <<EOF
services:
jenkins-lts:
stdin_open: true
tty: true
ports:
- 8588:8080
- 10241:50000
container_name: jenkins
environment:
- TZ=Asia/Shanghai
privileged: true
group_add:
- 993 # 替换为宿主机docker组的GID
volumes:
- ./data:/var/jenkins_home
# 要在容器里创建镜像和运行容器,把宿主机的dockerd的监听套接字挂进容器
- /var/run/docker.sock:/var/run/docker.sock
restart: always
image: jenkins/jenkins:2.528.3-lts-jdk21
networks: {}
EOF
3、启动 Jenkins 容器
# 启动容器
docker compose up -d
# 检查容器状态
docker compose ps

4、查看 Jenkins 的初始密码并登录
查看 Jenkins 的初始密码,访问 http://JENKINS-IP:8588 。
# 查看jenkins的密码
docker compose logs jenkins-lts

二、Jenkins 基本配置
1、初次登录 Jenkins

2、安装推荐的插件
在这一步如果显示离线:要么配置代理(好处是可以批量安装推荐插件,省去一个个点);要么跳过插件安装。跳过后再回来补装通常也没问题,除了提示连不上 goole 外,其他都能正常安装。


记得安装 “Localization: Chinese (Simplified)”、“Docker plugin” 和 “GitLab Plugin”,后面会经常用到。

3、修改 Jenkins 管理员密码,就可以进入 Jenkins 管理界面

4、设置界面中文
先安装 “Localization: Chinese (Simplified)” 插件,然后进行如下配置。

5、配置 Docker 插件
要在构建里使用 Docker 功能,先安装 Docker 插件,再按如下配置。

6、进入 Jenkins 容器内生成生成密匙对
#
# 进入Jnekins容器内
docker compose exec jenkins-lts bash
#
# 创建密钥
ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:dz5psbGyeBdi1tcsAt62T4y8qCByWQwcmev60m7nIuc root@apm-100
The key's randomart image is:
+--[ED25519 256]--+
| ..o. |
| . o+ |
| ..+= . |
| .** + + |
|.oooB S = * |
| .o. . + B + |
| o.. . + * |
| o.* o .+ o . |
| .OE=o. .o |
+----[SHA256]-----+
7、将生成的私钥输入到 Jenkins 凭证里
将上面生成私钥按如下方式输入 Jenkins 的凭证里。
注意:Username 是 git,使用 ssh 方式拉取代码都是使用 git 用户名,但是这里随便填写其他的用户名似乎也是可以的。

三、Jenkins 作业创建
1、源码管理部分的配置
创建一个“自由风格的”作业,命名 “mytest”。
选择 "git" 作为源码管理,仓库 URL 填写 “ssh://xxx.xxx.xxx.xxx:2222/root/myproject.git”。这是后面 GitLab 里要创建的代码仓库,现阶段还没有;凭证选择我们上面创建的凭证。
这里有可能报错,因为 GitLab 相关配置还没有,配置好了就正常了。分支选择 “*/main”。

2、触发器部分
勾选 “Build when a change is pushed to GitLab. GitLab webhook URL”。
记住 GitLab webhook URL,后面会在 GitLab 里用到,其他保持默认即可。(Webhook 触发流水线/作业,是 DevOps 常用的自动化入口之一。)

3、触发器高级部分
展开触发器高级选项,记住 “Secret token” 的值,后面会在 GitLab 里用到,其他保持默认即可。

4、“环境”部分选择 “Delete workspace before build starts”
清理构建空间,不拖泥带水,避免麻烦。

5、在“构建步骤”增加 “Execute shell”
功能就是从 GitLab 代码库拉取代码,然后从某个文件读取指令并执行,执行完成将结果写入日志。
这部分可以根据不同的需要、不同的场景进行相应修改。你希望“指令长什么样”?执行权限如何收敛?这些都可以在脚本层逐步加固。

示例脚本:
#!/bin/bash
set -e # 执行出错立即终止
echo "$(date +%Y%m%d%H%M%S) Fail." > /tmp/result.txt
echo "### 开始执行指令..."
cat code.txt && echo "$(date +%Y%m%d%H%M%S) Success." > /tmp/result.txt
echo "### 指令执行结束 ###"
6、在“构建步骤”里再增加另外一段 “Execute shell”
这一段的主要目的是将上面命令的执行结果上传到同一个代码仓库里的另外分支中,方便命令发起者查看执行结果,形成可追溯的闭环。
这部分同样可以根据不同的需要、不同的场景进行相应修改。

示例脚本:
#!/bin/bash
set -e
# 配置Git用户信息(Jenkins默认可能无配置,否则提交会失败)
git config --global user.name "Jenkins Bot"
git config --global user.email "jenkins@your-server.com"
# 同步远程分支信息
git fetch origin
# 切换到result分支(本地无则创建,本地有则重置为远程最新版本)
git checkout -B result origin/result
# 2. 将result文件复制到当前(result分支)目录
mv /tmp/result.txt ./
# 提交并推送结果文件
git add result.txt
git commit -m "Jenkins自动提交执行结果: $(date +%Y%m%d%H%M%S)"
git push origin result
GitLab webhook 触发构建的 Jenkins 这部分的配置基本就结束了。