Jenkins 安装
Jenkins 使用 JAVA 语言编写,首先需要安装好 JDK
,配置好 java
环境变量。
export JAVA_HOME=/opt/java/jdk1.8.0_211
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export JENKINS_HOME=/mnt2/JenkinsHome
Jenkins的安装包可以使用war包,Jenkins下载地址。
推荐使用 tomcat 运行 Jenkins,安装好 tomcat,把 Jenkins.war 放到 tomcat的 webapp/
目录下。
记得给tomcat/bin
目录下的sh文件执行权限。chmod a+x -R ./bin/*.sh
。
把java软链接到相应的目录下,这个在创建节点的时候会用到,按下不表。
ln -s /mnt2/opt/java/jdk1.8.0_211/bin/java /usr/local/bin/java
。
运行tomcat /bin/start.sh
即可。一般访问地址就是ip:port/jenkins/
。
端口更换
如果出现端口占用的情况,使用 netstat -pant | grep portnumber
查看。更改 Jenkins 端口或者 kill 掉占用端口的进程。
- 推荐更换端口,默认是8080。 修改tomcat的
conf/server.xml
文件。这里port选择了 9999 - 如果希望配置成 https访问的话可以参考 tomcat 配置成 https访问。
插件安装
浏览器第一次进入 Jenkins 会提示安装一些插件,可以安装或者跳过。
自行安装插件的话可以在这里下载。
下载 .hpi
文件 到本地,在 Jenkins =>系统管理=>管理插件=>高级=>上传插件中,选择相应的 .hpi 文件,再点击上传,就会自动安装。安装会有依赖顺序,安装错误会提示缺少相应的插件,先安装缺少的那个即可。
Jenkins 安装完成后的配置
要实现 gitlab 和 Jenkins的连接需要进行一些配置。首先是要安装一些插件。安装配置过程遇到的问题放在后边的章节。
常用插件
- gitlab plugin(依赖git plugin、git client plugin等多个插件)
- gitlab merge request builder plugin
- ssh slaves plugin
- multijob plugin(多任务构建时必须)。
- Role-based Authorization Strategy (登录用户的权限访问控制)
- Build Timeout (构建超时可以进行一定的操作)
- Email Extension Plugin(支持邮件定制)
- Parameterized Trigger plugin(传参触发其他构建)
- deploy plugin(部署 ear/war 文件 到一个远程应用服务器)
- delivery pipeline plugin(可视化 delivery pipeline)
- build pipeline plugin(构建流水线)
- poll mailbox trigger plugin(邮件触发Job)
- Build monitor view plugin(Job状态展示)
Jenkins 配置步骤
进入 Jenkins,系统管理,系统设置,里面有很多配置项目、
- Jenkins Location 配置项
填入访问Jenkins的URL以及管理员的邮箱地址。注意这里的邮箱地址和 mail等插件里填写的发送地址需要一样。 - gitlab 配置项
添加名称、URL、以及认证凭据,凭据可以在这个页面新建,也可以在 Jenkins 主页的凭据里添加。
这里实际上的用处是让 Jenkins 能够调用 gitlab 的 API,比如发送构建的状态给 gitlab,gitlab-plugin 的介绍。 Gitlab API token
在 gitlab 里用户头像,注意这个用户至少应该是项目的 'Developer’以上权限的拥有者。
点击setting
,在这里创建一个access token
,然后给 Jenkins 使用。注意这里的 token 关闭或者刷新这个页面就没了,所以抓紧拷贝。- git 配置
填入git plugin的user.name
以及user.email
。
Jenkins 创建项目节点
multijob 插件允许项目可以在同一个服务器上设置不同节点,并发构建不同的项目,在新建一个
multijob 项目前,需要先建立要项目运行的节点(系统管理-管理节点-新建节点)。
创建好后 launch一下就可以了。可能的连接问题见下文。
Host 填写节点服务器的 IP。Credential 填写该节点服务器的登录用户及其密码。
Jenkins 新建 Job
这部分的变量来自 gitlab webhook
发送过来的信息。需要 gitlab 那边开启 webhook
,做相应的设置。
- 源码管理部分
这里的 Credential 选择 SSH Username with private key。使用过 github 的应该都知道访问仓库有添加公钥到用户的这一步操作。本质上是使用 SSH 公钥登录的方式登录到 gitlab。该用户需要有访问代码仓库的权限。
这里的Username填什么无所谓,可以填写生成密钥对的用户,方便区分。
私钥部分填写生成的私钥,公钥上传到gitlab相应的用户。密码的话如果生成密钥对的时候有的话就填写一下。
- 构建触发器部分
很多选项可以配置,比如 trigger 的事件包含哪些。 - 构建结束
可以添加很多构建结束的动作,比如归档生成的东西、给 gitlab 返回构建状态(信息可定制)、发送构建状态等信息的邮件,邮件内容可定制。构建结束注意这里应当添加一项Publish build status to GitLab
,把构建状态发送回 gitlab。 - gitlab 上的就能显示出构建状态。可以看到是外部的CI构建成功。
注意这里不要选择 Gitlab commit status publisher
,这个会导致一个关于 ruby
的错误。如果有这种情况的话去掉即可。
Jenkins 用户权限控制
选中 Role-Based Strategy
后在系统管理中会出现 Manage and Assign Roles
。这里面首先进行角色权限的管理,然后给每个用户赋予一个角色。角色包括:Global roles
, Project roles
以及 Slave roles
。
顾名思义,分别对应全局的权限控制,某个 project 的权限控制以及 slave 节点的权限控制。
创建了上面的 role
以后就可以分别给用于赋予不同的 role
了。
Jenkins 安装问题汇总
web界面出现jenkins实例似乎已离线问题
修改 JenkinsHome 下的 hudson.model.UpdateCenter.xml
,插件更新源地址由https://
更改为http://
。
位置也可能在/var/lib//jenkins/hudson.model.UpdateCenter.xml
;或者改为国内的镜像http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
。
URL没有开启 UTF-8 解码
解决方案:在 tomcat目录下conf/server.xml文件中增加 URIEncoding="UTF-8"
。
Jenkins 设置 gitlab 插件时由于启用了 https 访问,需要导入受信任的证书
如果在Test Connection
时返回错误码:sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。
Java在访问 SSL 加密的网站时,需要从 JDK 的 KeyStore 里面去查找相对应得可信证书,如果不能从默认或者指定的 KeyStore 中找到可信证书,就会报这个错误。另外,Java 所使用的证书仓库并不是 Windows 系统自带的证书管理。所以即使系统中包含此证书也不可以使用。解决方案:借助 keytool
将 SSL 的证书添加到 KeyStore 中即可。
进入到 JAVA JDK 下的jre\lib\security
目录,运行命令:keytool -import -file your_certification.cer [or xxx.crt] -keystore cacerts -alias [server or other name]
会提示输入密码,默认密码为 changeit
,选择 “yes” 将其安装到 JDK 可信证书库中。之后测试可以看到 success。
创建新节点后登录不上,报错:大意是找不到 JAVA版本,而实际上 Jenkins 所在的服务器已经正确安装了 JDK。
Checking java version fails - SSH slave not connecting
Java not found on hudson.slaves.SlaveComputer
解决方案: 查看出错的日志,可以看到默认是从 /usr/local/bin/ 目录下去找 java的,所以建一个软链接过去就可以了。ln -s path/to/jdk1.8.0.211/java /usr/local/bin/java
向本机发送 webhook时出现错误,从GitLab 10.6起 gitlab 默认不允许向本机发送 webhook requests。
解决方案: https://docs.gitlab.com/ee/security/webhooks.html 以管理员身份登录 gitlab,进入 Admin Area->Settings->Network
Jenkins pdf 无法打开,系统管理-脚本命令行-运行指令。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'none'; img-src 'self'; style-src 'unsafe-inline'; child-src 'self'; frame-src 'self'; object-src 'self';")
或者配置 Jenkins启动执行 groovy
脚本,在 JenkinsHome下新建一个文件夹 init.groovy.d
,新建文件 *.groovy
,这样每次Jenkins启动都会完成预定的动作。
https://issues.jenkins-ci.org/browse/JENKINS-33195?filter=10244https://wiki.jenkins.io/display/JENKINS/Post-initialization+script
You can create a Groovy script file $JENKINS_HOME/init.groovy,
or any .groovy file in the directory $JENKINS_HOME/init.groovy.d/,
to run some additional things right after Jenkins starts up.
This script can access classes in Jenkins and all the plugins.
groovy脚本如下
import jenkins.model.*
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'none'; img-src 'self'; style-src 'unsafe-inline'; child-src 'self'; frame-src 'self'; object-src 'self';")
Jenkins 邮箱发送失败,Client dose not have permissions to send as this sender
这里填写的邮箱和测试邮箱需要是同一个。