jenkins节点管理
jenkins定时构建

背景

通过docker安装的jenkins,配置jenkins job的源码管理是通过git,但git拉取到的代码是在jenkins容器的目录当中/var/jenkins_home/workspace/<job_name>,如果没有在jenkins镜像中安装运行环境,运行的时候就可能提示错误,如运行python项目时提示bash: python: command not found

jenkins docker安装

这里就不赘述jenkins的安装,可进一步参考jenkins安装,我这里使用的是jenkinsci/blueocean镜像

docker run --name monkey_jenkins -p 8080:8080 -p 50000:50000 -itd -v ~/Documents/jenkins_home:/var/jenkins_home jenkinsci/blueocean

You can run builds on the master (out of the box) but if you want to attach build slave servers: make sure you map the port: -p 50000:50000 - which will be used when you connect a slave agent.
注意,如果需要使用slavle节点,必须映射端口50000:50000

问题解决

由于宿主机已经搭建了对应的运行环境,所以把宿主机设置为jenkins的一个slave节点,并限制项目运行节点在宿主机上就可以

  1. 插件管理-可选插件搜索并安装SSH Agent,重启后生效
  2. Jenkins- 系统管理 - 全局安全配置, 把 SSH Server 设置为启用(默认是禁用)
  3. Jenkins- 系统管理 - 节点管理,新增节点
  4. 添加节点界面填写
    • 名称:自定义一个节点名称
    • 执行器数量:可以同时执行的job线程数,随便写个数字
    • 远程工作目:宿主机上workspace目录
    • 标签:自定义
    • 用法:尽可能的使用这个节点
    • 启动方式:Launch agent agents via SSH
    • 主机:你自己的宿主机linux服务的ip
    • Credentials:添加你的linux服务器远程访问的root账号和密码
    • Host Key Verification Strategy:这项选择Non verifying Verifcation Stragegy
  5. 限制项目运行节点
    • General-限制项目的运行节点,标签表达式输入步骤4中定义的节点名称

Launch agent agents via SSH 连接不上

我这里采用ssh方式不行,一直连接deny,也不知道怎么回事,于是采用了通过java web启动代理
设置好后节点会提示到节点连接Jenkins的方式,如我的为(在宿主机上执行,先下载agent.jar在执行目录下):

java -jar agent.jar -jnlpUrl http://localhost:8080/computer/mac/jenkins-agent.jnlp -secret xxxx -workDir "~/apitest"

shell脚本中有后台运行python http server异常退出

提示错误:Process leaked file descriptors. See https://www.jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors for more information 然后server会退出

解决办法可参考jenkins Process leaked file descriptors

  • Jenkins-->Manage Jenkins-->Configure System 在Global properties下,新增新的环境变量
key=BUILD_ID
value=allow_to_run_as_daemon start_my_service

jenkin定时构建

定时构建语法

* * * * **号等同于H

  • 第一个*表示分钟,取值0~59,若其他值不做设定,则表示每个设定的分钟都会构建
  • 第二个*表示小时,取值0~23, 若其他值不做设定,则表示每个设定小时的每分钟都会构建
  • 第三个*表示一个月的第几天,取值1~31,若其他值不做设定,则表示每个月的那一天每分钟都会构建一次
  • 第四个*表示第几月,取值1~12,若其他值不做设定,则表示每年的那个月每分钟都会构建一次
  • 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日,若其他值不做设定,则表示每周的那一天几每分钟都会构建一次

定时构建示例

# 每隔5分钟构建一次(第一个*为分钟)
H/5 * * * *

# 每两小时构建一次(第二个*为小时)
H H/2 * * *

# 每隔3天执行一次(第三个*为一个月的第几天)
H H H/3 * *

# 每隔3天执行一次(每月的1-15号)	
H H	1-15/3 * *
 
# 周六到周日,18点-23点,三小时构建一次(第五个*为一周中的第几天)
H 18-23/3 * * 6-7

# 每天凌晨2:00跑一次 (第二个*为小时)
H 2  * * *

# 每天中午12点定时构建一次(第二个*为小时)
H 12 * * *

# 每天的8点,12点,22点,一天构建3次
H 8,12,22 * * *

jenkins时间同步问题

查看jenkins系统管理-系统信息-系统属性发现user.timezone不对,在定时构建时jenkins时区问题会导致定时构建达不到预期效果。因此就需要修改容器时区,可进一步参考永久修改以容器化方式运行的Jenkins系统时间,这里使用docker run加上参数去修复该问题

docker run --name monkey_jenkins -p 8080:8080 -p 50000:50000 -itd -v ~/Documents/jenkins_home:/var/jenkins_home -e JAVA_OPTS='-Duser.timezone=Asia/Shanghai'  jenkinsci/blueocean

参考及扩展阅读