jenkins ci 环境搭建

简介

jenkins是一个持续集成(CI)工具,使用java编写

CI continuous integration 持续集成

SCM source code management 源码管理

下载jenkins

有多种安装方式,我们选择war包部署,war包下载地址 https://jenkins.io/download/

下载的war包为jenkins.war

部署至tomcat

这里采用一台单独的tomcat部署jenkins

1
2
3
4
5
6
7
8
9
10
11
12
# 因为此tomcat只用来部署jenkins,所以先删除webapps下其他应用
rm -rf ${tomcat_path}/webapps/*
# 部署jenkins的war包
mv ${download_path}/jenkins.war ${tomcat_path}/webapps/ROOT.war
# 指定jenkins工作目录(如有必要),默认为~/.jenkins
vim ${download_path}/bin/catalina.sh
CATALINA_OPTS="-DJENKINS_HOME=~/jenkins-cluster-1/"
#
vim ${download_path}/conf/context.xml
<Context ...>
<Environment name="JENKINS_HOME" value="~/jenkins-cluster-1/" type="java.lang.String"/>
</Context>

配置jenkins

tomcat部署启动完jenkins后,访问对应端口可以看到如下jenkins的初始界面

查看/root/.jenkins/secrets/initialAdminPassword文件可以获得管理员密码,输入后可以解锁Jenkins,开始使用。

安装插件

初始化界面会提示我们安装插件,我们选择推荐插件

推荐的插件如下图所示

我们主要需要身份认证 源码管理 打包构建 管道命令 几个方面的插件

身份认证

ssh plugin SSH Slaves plugin Credentials Binding Plugin

源码管理

git plugin github plugin GitHub Branch Source Plugin gitlab plugin subversion Plug-in

打包构建

Gradle Plugin

管道命令

Pipeline Pipeline:State View Plugin

pipeline构建参考

其它插件

Role-based Authorization Strategy基于角色的的用户权限控制

设置全局工具

系统设置->Global Tool Configuration->JDK、Git、Maven

系统设置->Shell->Shell executable->/bin/zsh

Jenkins内部shell UTF-8 编码设置

参数化构建

Pipeline构建

创建一个新任务,任务类型选择pipeline

拉取源码

勾选GitHub hook trigger for GITScm polling 参考Trigger Jenkins builds by pushing to Github

  1. 在jenkins所在服务器上生成ssh key
  2. 在gitlab的Deploy Key中添加public key
  3. 在jenkins创建项目,添加gitlab的项目地址,选择添加Credential,填入private key

编写构建打包部署的pipeline脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
node {
stage('checkout') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '{git_credentialsId}', url: '{git_url}']]])
}
stage('build') {
sh 'mvn clean package'
}
stage('send war to server') {
sh 'scp {user_root_path}/.jenkins/workspace/{you_project_name}/target/{you_project_packaged_name}.war {user}@{server_ip}:{tomcat_path}/webapps/javavirtual.war'
}
stage('restart tomcat server'){
sh 'echo "wait restart shell"'
}
}

基于角色的任务访问控制

  1. 系统管理->管理插件->安装Role-based Authorization Strategy插件
  2. 系统管理->Configure Global Security->访问控制->授权策略->Role-Based Strategy->保存
  3. 系统管理->Manage and Assign Roles->Manage Roles->Global roles->在admin角色外创建其他角色分配Overall/Read权限
  4. 指定角色访问特定项目

系统管理->Manage and Assign Roles->Manage Roles->Project roles->添加一个角色,然后指定项目Pattern(注意:patter不是正则表达式,其中*要用.*代替)

FAQ

pipeline使用nohup命令启动后台进程无效

参考ProcessTreeKiller

使用Boolean类型参数化构建时,参数逻辑判断总是true

jenkins传入groovy的boolean parameter是对象类型,非null总是true,所以判断总为true,进行一次类型转换就好

1
def booleanParameter = Boolean.valueOf(jenkinsBooleanParameter);

容器的编码问题

Your container doesn’t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, this will cause problems. See Containers and Tomcat i18n for more details.