Jenkins最佳实践

1,jenkins执行问题

1.1 权限组

1
sudo visudo

jenkins的user添加到root的组里,这样就可以执行root相同的命令了

1
2
3
root    ALL=(ALL)       ALL
# 新增下面这一行
jenkins ALL=(ALL) NOPASSWD:ALL

这个方法只是确保能执行命令,命令关联的权限依然是有问题的。

1.2 切换到jenkins账号

1
sudo su -s /bin/bash jenkins

1.3 命令的权限

例如docker,你就需要允许jenkins获得相同的权限

1
2
3
sudo usermod -aG docker jenkins
# 需要重启Jenkins
sudo systemctl restart jenkins

如果不添加,执行docker相关的命令,会报下面这个错:

1
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied

2,用户权限

2.1 安装并启用插件

在插件安装页面安装Role-based Authorization Strategy
再在"Manage Jenkins->Security->Configure Global Security"页面,勾选Role-Based Strategy,如下图:

此时再进入"Manage Jenkins"页面的"Security"模块就可以看到"Manage and Assign Roles"的角色编辑入口了。

2.2 jenkins工程示例

假设我们的jenkins工程如下:

1
2
3
4
5
6
7
8
└── folder1
├── folder2
│   ├── dev-job1
│   ├── dev-job2
│   ├── test-job1
│   └── test-job2
├── job1
└── job2



我们希望user-dev看到dev开头的job,user-test看到test开头的job

2.3 权限说明

如下图:
Global roles,基础角色
Item roles,基于project的角色

2.4 基于权限配置

新建一个Global roles的角色,假设test_global_role,只勾选Over rallread,别的都不要勾选。(因为Global roles权限会覆盖Item roles的权限)
接下来是关键:
新建一个只能看到名称是test开头的job的角色read_test,再配置正则:

1
2
3
4
5
6
folder1|folder1/folder2|folder1/folder2/test.*

# job名包含test,且忽略大小写
(.*)((?i)test)(.*)
# job名以test开头,且忽略大小写
((?i)test)(.*)
  • "|"表示多个正则的并列关系
  • "/"是文件夹的分割线
  • ".*"表示结尾的正则匹配
    由于test开头的job都在"folder1/folder2/“下面,所以需要每个文件夹并列写,直到写到最后一级目录。
    最后点击"save”,再新建用户勾选这个角色,那么这个用户就只能看到"folder1/folder2/"下面的test开头的job了。

3,修改端口

1
2
3
4
5
6
$ vim /etc/sysconfig/jenkins
....
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8080"