JenkinsCli自动化

问题

每次重装后 Jenkins内的任务都得手动创建

思路

发现Jenkins有 命令行工具, 可以实现自动化

image-20220407162034484

怎么做

根据自己搭建的Jenkins网站中的 Jenkins 命令行 说明

image-20220407161834172

准备

java环境

猜测

jenkins的镜像中有

验证

1
docker exec jenkins_jenkins_1 java --version

image-20220407162701124

结果

有Java环境

jar包

可以直接点击下载, 再重新上传回服务器

猜测

分析下载链接, 发现是从自己服务器下载的, jar包肯定在自身镜像内

image-20220407163201785

查找

找出符合文件大小的jar包

image-20220407164528393

1
docker exec jenkins_jenkins_1 find / -name *.jar -size +3M -size -5M

image-20220407164359854

很明显 是 /var/jenkins_home/war/WEB-INF/lib/cli-2.340.jar

验证

image-20220407163343133

image-20220407164803444

结果

是同一个包

测试

直接连接

测试

1
docker exec jenkins_jenkins_1 java -jar /var/jenkins_home/war/WEB-INF/lib/cli-2.340.jar -s https://jenkins.chenyiliang.top/ -webSocket help

image-20220407165358666

结果

1
io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error.

失败

分析

需要身份认证

身份认证

查找

查看文档 Jenkins HTTP 连接

image-20220407170138445

使用 -auth 参数

测试

1
docker exec jenkins_jenkins_1 java -jar /var/jenkins_home/war/WEB-INF/lib/cli-2.340.jar -s https://jenkins.chenyiliang.top/ -auth username:passwd help

image-20220408130454363

结果

没有任何反应

分析

nginx反向代理问题

image-20220408130916393

Nginx反向代理

查找

查找文档 反向代理-Ngxin

需要在 nginx的配置=> server => location 中添加一些配置

image-20220408131409981

1
2
3
4
5
6
7
8
# ws
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# jenkins cli
proxy_buffering off;
proxy_request_buffering off;

测试

1
docker exec jenkins_jenkins_1 java -jar /var/jenkins_home/war/WEB-INF/lib/cli-2.340.jar -s https://jenkins.chenyiliang.top/ -auth username:passwd help

image-20220408140712790

结果

成功

使用

调用方式

1
2
3
4
5
6
# 找到Jenkins容器id
ContainerId=$(docker ps | grep jenkins | awk '{print $1}')
# 找到JenkinsCli位置
JenkinsCliPath = $(docker exec $ContainerId ls /var/jenkins_home/war/WEB-INF/lib/cli-*.jar)
# JenkinsCli 调用命令
docker exec $ContainerId bash -c "java -jar $JenkinsCliPath -s https://jenkins.chenyiliang.top/ -auth username:passwd COMMAND"

bash 调用命令

使用容器中的 bash 调用命令而不直接使用 java 的原因是因为有一些命令需要的一些参数 需要在容器内执行, 而直接使用java调用会在当前直接执行

常用命令

下方命令替换 COMMAND

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 验证身份 查看自己是否有权限执行
who-am-i
# 安装插件xxx yyy并重启
install-plugin xxx yyyy -restart
# 获得插件xxx的版本号
list-plugins xxx | awk '{print $NF}'
# 执行xxx.groovy脚本
groovy = < xxx.groovy
# 重启
safe-restart
# 根据配置文件 创建任务
create-job JOB_NAME < config.xml
# 构建任务
build JOB_NAME -s

who-am-i

  • 验证用户是否已经注册

  • 验证是否登录成功

  • 验证主机连接没有问题

groovy

执行 xxx.groovy 脚本的效果等同于在 脚本命令行] (chenyiliang.top) 内执行

image-20220408143024116

注意
  • 脚本路径需要在容器内是有效的

  • 需要自己预导入需要的库

image-20220408143223059

1
2
3
4
import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*
举例

根据之前生成过的 WebHook 密码, 生成任务配置文件中的 secretToken, 使用此配置文件, 避免在托管后台修改 WebHook 密码

1
2
import hudson.*
println(hudson.util.Secret.fromString("xxxxxxxxxxx").getEncryptedValue())

create-job

注意
  • 脚本路径需要在容器内是有效的

  • 配置文件可以是根据以前自己手动配置过的任务配置 修改生成的