Jenkins自动化部署-教程
1 Jenkins介绍
1.1 软件开发周期
- 需求分析
- 设计
- 实现
- 测试
- 进化
- 维护
1.2 持续集成
- 英文是 continuous integration,简称CI
- 持续集成是指频繁的将代码集成到项目主干上去
- 目的是让产品快速的迭代,同时保持高质量
1.2.1 持续集成步骤
- 提交
- 测试(第一轮)
- 构建
- 测试(第二轮)
- 部署
- 回滚
1.2.2 组成要素
- 自动构建
- 代码存储库
- 集成服务器
1.3 Jenkins
- Jenkins是一个开源的持续集成工具
2 Jenkins安装和持续集成环境配置
2.1 集成流程
- 代码提交到git仓库
- Jenkins将代码拉取到集成服务器,完成编译、打包等工作
- Jenkins将打包好的jar包部署到生产/测试服务器
2.2 Jenkins安装
2.2.1 安装jdk
Jenkins依赖依赖JDK,所以需要先安装JDK
2.2.2 获取Jenkins安装包
- 下载地址:https://jenkins.io/zh/download/
- 安装文件:Jenkins-2.190.3-1.1.noarch.rpm
2.2.3 上传到服务器,进行安装
rpm -ivh Jenkins-2.190.3-1.1.noarch.rpm
2.2.4 修改Jenkins配置
2.2.4.1 centos
vim /etc/sysconfig/jenkins
修改内容:
JENKINS_USER="root"
JENKINS_PORT="8888"
2.2.4.2 unbuntu
vim /usr/lib/systemd/system/jenkins.service
修改内容:
USER=root
Environment="JENKINS_PORT=8888"
vim /etc/default/jenkins
修改内容:
JENKINS_USER="root"
JENKINS_PORT="8888"
vim /etc/init.d/jenkins
修改内容:
- 修改do_start_cmd_override()函数中调用check_tcp_port()函数传入的端口号
check_tcp_port “http” “$HTTP_PORT” “8888” || return 2
2.2.4.3 Jenkins
在以上修改完成后,记得在Jenkins - system manage - Jenkins location将Jenkins的URL地址修改为正确的端口号
2.2.5 启动Jenkins
systemctl start jenkins
2.2.6 添加安全组/防火墙规则
2.2.7 访问Jenkins
打开浏览器访问:<服务器ip>:8888
2.2.8 跳过插件安装
Jenkins插件默认连接官网下载,速度很慢,经常失败
3 Jenkins插件安装
3.1 修改插件下载地址
- Jenkins插件国外的下载地址很慢,修改为国内的
- jenkins - manage jenkins - manage plugins
- 点击available,等待插件列表加载完成
- 修改地址文件,替换为国内地址
- cd /var/lib/jenkins/updates
- sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
- manage plugins中点击advanced,修改update site
- https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 点击submit
- 在浏览器输入:<服务器ip>:8888/restart,重启Jenkins
3.2 安装中文汉化插件
- Jenkins - manage Jenkins - manage plugins
- 点击available,搜索Chinese
- 重启Jenkins,Jenkins汉化就完成了
- 部分菜单汉化会失败
3.3 Jenkins权限管理插件
- 安装role - based - authorization strategy 插件
- 开启权限全局安全配置:manage Jenkins - configure global security
- 授权策略切换为 role - based strategy,保存
- 创建角色:manage Jenkins - manage and assign roles - manage roles
- 三种角色:
- global roles: 全局角色
- project roles:项目角色
- slave roles:节点角色
- 新建全局角色
- base Role - 分配read权限
- 新建项目角色
- roleName - 分配所有权限
- pattern : 可管理的项目名表达式
- 授予角色(在此之前需要新建好用户):manage Jenkins - manage and assign roles - assign roles
3.4 jenkins凭证管理插件
- 安装credential binding插件
- 安装完成后,主页菜单出现credentials
3.4.1 安装git插件
3.4.1.1 安装插件(略)
3.4.1.2 创建凭证
- Jenkins - 凭证 - 系统 - 全局凭证 - 添加凭证
3.4.1.2.1 用户密码凭证
- 使用用户密码凭证,在构建项目时仓库地址只能选择http或https
3.4.1.2.2 ssh密钥
- 使用root用户生成公钥和私钥
- ssh-keygen -t rsa
- 生成的公钥和私钥保存在/root/.ssh/目录下
- id_rsa:私钥
- id_rsa.pub:公钥
- 把生成的公钥放在代码仓库(gitee、GitHub、gitlab)中
- 登录代码仓库服务器 - settings - SSH keys
- 将id_rsa.pub中的内容放到这里
- 然后在Jenkins中添加私钥凭证
- 将私钥的内容放到凭证中,用户名为创建公钥和私钥的用户(这里是root)
- 此时构建项目时仓库地址需要选择ssh
3.4.2 jenkins服务器安装git工具
3.4.2.1 ubuntu
apt-get install git
3.4.2.2 centos
yum install git -y
4 maven安装
4.1 安装maven
4.1.1 ubuntu
apt-get install maven
- 检查是否安装成功:mvn -version
- 默认安装路径:usr/share/maven
4.2 配置环境变量
- 在/etc/profile.d目录下新建文件maven.sh
- vim /etc/profile.d/maven.sh # 不采用
- vim ~/.bashrc # 采用 root用户
- 内容如下
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- export M2_HOME=/usr/share/maven
- export MAVEN_HOME=/usr/share/maven
- export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$PATH
- export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- 加载配置
- source ~/.bashrc
4.3 更换源和本地仓库地址
创建仓库目录
mkdir /root/maven_repo
修改镜像和仓库地址
vim $MAVEN_HOME/conf/settings.xml
添加仓库地址,镜像源地址
<localRepository>/root/maven_repo</localRepository>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4.4 Jenkins配置
- Jenkins - global tool configuration
- 配置JDK:JAVA_HOME填写Jenkins服务器上的JAVA_HOME路径即可
- 配置maven:MAVEN_HOME填写Jenkins服务器上的MAVEN_HOME路径即可
- 点击应用 - 保存
- Jenkins - system configuration - global properties
- 添加Jenkins全局环境变量
- JAVA_HOME
- M2_HOME
- PATH+EXTRA : $M2_HOME/bin
- 点击 应用 - 保存
5 jenkins构建maven项目
5.1 构建项目类型
- FreeStyle Project:自由风格软件项目
- Maven Project:Maven项目
- Pipeline Project:流水线项目,灵活度非常高-推荐
所有的项目创建完成后都放在/var/lib/jenkins/workspace目录下
5.2 FreeStyle Project构建
- 创建项目
- 拉取代码
- 源码管理 - git
- 填好仓库地址和选择对应的凭证
- 编译打包
- 构建 - 添加构建步骤 - executor shell
- 填入mvn clean package命令
- 部署
- 安装deploy to container插件
- 回到配置 - 构建 - 增加构建后操作步骤 - deploy war/ear to a container
- war/ear files:target/*war
- context path:略
- containers - tomcat 8.x remote
- 添加凭证,tomcat所在服务器的一个用户+密码(可以专门创建一个用户来进行部署)
- tomcat url:<tomcat所在服务器ip>:<tomcat端口号>
5.3 maven project构建
5.3.1 安装maven integration插件
5.3.2 构建项目
- 创建项目
- 拉取代码
- 源码管理 - git
- 填好仓库地址和选择对应的凭证
- 编译打包
- build
- Root POM:选择pom文件的位置,项目相对路径
- Goals and options:编译命令,默认使用mvn执行 - clean package这样填写就可以了
- 部署
- 使用deploy to container部署到生产服务器上
- 如果Jenkins服务器和部署服务器是同一台服务器(个人项目)
- 可以使用脚本
- post steps - add post-build step - excitor shell
- 添加下面内容
- cd /home/xaopng/apps # 打开脚本所在目录
- sh xiying # 执行脚本
- 脚本内容(针对spring boot项目)
- #!/bin/bash
- # app=$1
- # port=$2
- app=xiying-1.0-SNAPSHOT # 打包后的jar包名
- port=8080 # 项目端口号
- path=/home/xaopng/apps # jar包存放的位置,需要编译好的jar包移动到此目录
- echo this is app : $app
- echo port : $port
- #若项目已启动,杀死旧进程
- api_pid=`ps -ef | grep "$app.jar" | grep -v grep | awk '{print $2}'`
- echo api_pid = $api_pid
-
- if [ "$api_pid" != "" ]; then
- echo kill api
- kill -9 $api_pid
-
- echo sleep 3s
- sleep 1
- echo sleep 2s
- sleep 1
- echo sleep 1s
- sleep 1
- fi
-
- rm -rf $path/$app.jar
- rm -rf $path/nohup.out
- #将jar包从jenkins工作空间中移动到指定路径下
- mv /var/lib/jenkins/workspace/xiying/target/$app.jar $path
- cd $path
-
- #防止进程被杀死
- BUILD_ID=dontKillMe
- #后台进程形式启动项目
- nohup java -jar -Dserver.port=$port -Xmx256m -Xms128m $app.jar &
- echo $app start success
- exit 0
6 构建触发器
6.1 Jenkins内置4种触发器
- 触发远程构建:通过访问给定地址并在地址种携带token远程构建项目
- 其他工程构建后触发
- 定时构建
- 轮询SCM
6.2 git hook自动触发构建
6.2.1 gitee
- 安装gitee插件
- 回到项目配置 - 构建触发器 - Gitee webhook 触发构建
- 生成密码
- 登录gitee,进入项目,管理 - webhooks
- 填写Jenkins给的URL和生成的密码就可以了
- 有些时候url端口号可能会给错,填写Jenkins启动的端口号就可以了
7 idea插件
7.1 idea安装Jenkins control plugin
- 设置中配置好Jenkins服务器ip、Jenkins用户
- jenkins用户的密码是Jenkins中生成API token,并不是用户密码
7.2 Jenkins开启csrf
7.2.1 jenkins 1.x
- Jenkins - Configure Global Security
- 取消”防止跨站点请求伪造“复选框
7.2.2 jenkins 2.x
7.2.2.1 centos
vim /etc/sysconfig/jenkins
修改内容:
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
7.2.2.1 ubuntu
vim /etc/default/jenkins
修改内容:
JAVA_ARGS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
