基于Docker搭建和配置Jenkins

容器启动命令

1
docker run -p 8080:8080 -p 50000:50000 -h jenkins --name=jenkins --restart=on-failure -v /etc/localtime:/etc/localtime -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11

我通常会把/root和/mnt也映射进容器,并且通过root用户启动容器,用起来方便但安全性差,需视情况选择。

1
2
3
4
5
6
docker run -u root --privileged -p 8080:8080 -p 50000:50000 -h jenkins --name=jenkins --restart=on-failure\
-v /etc/localtime:/etc/localtime\
-v jenkins_home:/var/jenkins_home\
-v /root:/root\
-v /mnt:/mnt\
jenkins/jenkins:lts-jdk11

修改Jenkins时区

系统管理(Manage Jenkins)-脚本命令行(Script Console)

执行

1
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')

以root进入容器

1
docker exec -uroot -it jenkins bash

修改jenkins启动脚本

1
vim /usr/local/bin/jenkins.sh

找到java启动war的语句,增加启动参数

1
-Xms256M -Xmx256M -Xmn96M -Xss1M -Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai

参照修改Linux时区

重启容器,在宿主机执行

1
docker restart jenkins

允许匿名通过Token构建项目

默认不允许匿名触发构建,也不建议匿名触发,在外部触发可以通过

1
curl -o /dev/null -s -w %{http_code} http://<用户名>:<密码或API_TOKEN>@<JENKINS_URL>/job/<PROJECT>/build?token=<PROJ_TOKEN>

或者

1
curl -w %{http_code} -u <用户名>:<API_TOKEN> http://<JENKINS_URL>/job/<PROJECT>/build?token=<PROJ_TOKEN>

其中API_TOKEN是属于用户的,在用户管理界面可以配置。PROJ_TOKEN是属于项目的,在项目配置界面构建选项可以配置。

如需匿名触发构建

系统管理-全局安全配置-授权策略-登录用户可以做任何事

勾选“匿名用户具有可读权限”

这样设置之后就可以通过

1
curl -o /dev/null -s -w %{http_code} <JENKINS_URL>/job/<PROJECT>/build?token=<TOKEN>

从外部来触发构建,token在项目里设置。

项目权限配置策略

依赖插件 Matrix Authorization Strategy

需求:

  1. 系统管理员可以看到和控制所有的项目
  2. 普通用户可以创建项目和完全控制自己创建的项目,以及被人别人授权控制的项目

配置方法

系统管理-全局安全配置
系统管理员会自动勾上Administer去权限,多个系统管理就手动Add user然后勾上Administer
对Authenticated Users 只勾上 全部Read 和任务Create
配置项目时勾上启动项目安全,如果是对所有人开放管理和使用的项目,就把Authenticated Users后面的勾都勾上
如果是仅自己使用,就把自己用户名后面的所有勾都勾上

BTW: 不方便的一点就是目前添加用户需要手动输入用户名,而不能选择,希望后面的版本会改进。