目录
一. 基础
- jenkins有三个概念: 持续部署, 持续集成, 持续交付
- 解释使用jenkins的原因: 普通的项目部署流程, 当项目开发完毕,通过maven或其他方式将项目打包(mvn package),将打包后的文件上传到服务器上运行(或在windows下,通过当前jar包所在路径打开cmd, 输入”java -jar”,点击要运行的jar包拖到cmd命令窗口,回车运行), 比较繁琐, 通过jenkins与git实现自动化部署,代码编写完毕后,通过git将代码推送到管理平台github或码云,开发者在jenkins平台创建自动化任务通过jenkins,读取管理平台的代码,通过jenkins自动化打包,通过jenkins执行shell脚本,启动代码
- 使用jenkins最终的目标是
- 降低风险: 多次集成,并做了相应的测试,有利于健康状况的了解,减少假定
- 减少重复过程: 正常情况下需要手动编译,测试,打包,发布, 将手动更换为通过jenkins自动化实现
- 任何时间任何地点,只要能连接jenkins,通过jenkins即可打包发布
- jenkins与Hudson: jenkins大部分是由原Hudson人员开发,
- jenkins可以整合GitHub或Subversion
二. 基于Docker安装Jenkins到linux服务器
- 进入linux,输入进入docker的命令: # docker ps (前提linux服务器安装了docker)
- 输入通过docker安装jenkins命令(该命令是启动jenkins,如果本机中没有,下载后启动,第一次下载的实际可能比较长,显示INFO: STARTED INITIALIZATION表示启动成功,注意启动成功后需要关闭防火墙):
#docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean
- 访问jenkins,默认端口号是8080 (ip:端口号直接访问,注意第一次启动访问时,会加载一下配置文件,在该页面可能会等待3-10分钟)
- 解锁jenkins,在安装的jenkins目录中找到jenkins的initialAdminPassword文件,在文件中找到jenkins管理员密码,复制密码,粘贴到访问的页面输入框中,该存放密码的日志文件在docker容器中的"/var/jenkins_home/secrets/initialAdminPassword",目录下,需要进入docker容器中,然后打开查看:
- 输入进入docker容器的命令,查看docker容器id: # docker ps 会显示一个英文与数字混合的12位字符串,复制字符串容器id
- 输入进入docker容器的命令: # docker exec -it 7f485bd95c3b(复制的容器id) /bin/bash
- 进入jenkins容器,打开initialAdminPassword文件的命令,查看文件中的管理员秘钥,复制秘钥
cat /var/jenkins_home/secrets/initialAdminPassword- 将秘钥粘贴到
- 进入新手入门页,安装插件,点击安装推荐的插件
- 插件下载完毕设置管理员用户账号密码
- 完毕
三. 配置Jenkins
- 点击系统管理—>点击全局工具配置,配置jenkins使用的jdk与maven
- 配置jenkins的jdk环境, 首先要进入安装的jenkins容器中查看jdk目录输入” echo $JAVA_HOME”命令,会显示安装的jdk目录,复制目录
- 配置maven版本
- 安装maven Interation插件,点击系统管理----点击插件管理----点击可选插件----搜索Maven Integration,选中点击直接安装, 安装完成后点击安装完成后重启(jenkins自动化部署默认不支持部署maven项目,需要使用该插件)
四. 配置jenkins连接代码管理平台,实现自动部署
- Jenkins访问页面中点击新建任务,输入任务的发布名称,点击构建一个maven项目,点击确定
- 此时jenkins右侧会出现当前jenkins管理的项目,点击项目----点击左侧配置,复制项目代码在github,或码云的克隆地址,勾选配置页的git, 将复制的克隆地址粘贴到配置页的Reponsitory URL处, 并在Credentials添加自己登入github或码云账户与密码
- 配置页下拉到Build, 在Bulid的Root POM中输入pom.xml, Goals and options中输入”clean install” 最后点击保存
- 点击右侧立即构建,代码构建后会在docker容器中
- linux中输入”# docker ps”命令获取docker容器id, 输入一下命令进入docker容器
#docker exec -it 7f485bd95c3b(复制的容器id) /bin/bash
- 配置页中点击控制台输出,查看
五. 通过jenkins运行打包好的项目
- 通过jenkins运行打包好的项目: 登入jenkins页面, 点击需要运行的项目,点击左侧配置按钮,右侧下方找到Post Steps, 点击Add post-build step选择执行shell,会出现一个输入框,输入一下shell脚本代码(下面的红色部分需要修改,修改的数据可以在第四的第6步中获取到), 点击保存, 点击立即构建
#!/bin/bash
#服务名称此处的名称推荐与发布运行的项目名称一致
SERVER_NAME=mayikt_springboot
#打包后生成的项目jar包名字,有点像target目录下的jar包名称,如果生成的是war包war包可移动到Tomcat的webapps目录下运行,这里使用jar包,用java -jar 命令执行
JAR_NAME=mayikt_springboot-0.0.1-SNAPSHOT
# 源jar路径
#/usr/local/jenkins_home/workspace--->jenkins 工作目录
#demo 项目目录
#jenkins打包项目后,打的包所在位置(docker容器中,)
JAR_PATH=/var/jenkins_home/workspace/mayikt_springboot/target
# 打包完成之后,把jar包移动到运行jar包的目录--->work_daemon,work_daemon这个目录需要自己提前创建(jenkins打包项目后,打的包所在位置(docker容器中,)与上面的一样)
JAR_WORK_PATH=/var/jenkins_home/workspace/mayikt_springboot/target
echo "查询进程id-->$SERVER_NAME"
PID=`ps -ef | grep "$SERVER_NAME" | awk '{print $2}'`
echo "得到进程ID:$PID"
echo "结束进程"
for id in $PID
do
kill -9 $id
echo "killed $id"
done
echo "结束进程完成"
#复制jar包到执行目录
echo "复制jar包到执行目录:cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH"
cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH
echo "复制jar包完成"
cd $JAR_WORK_PATH
#修改文件权限
chmod 755 $JAR_NAME.jar
#启动打包的项目命令(前台启动,会一直转圈,需要修改为后台启动,查看下面第3步)
java -jar $JAR_NAME.jar
- 注意jenkins是通过容器进行部署的,项目,jar包服务也是通过容器运行的,运行项目后如果直接访问可能访问不到, 需要设置端口映射(linux上操作,注意关闭防火墙)
- 重启容器: systemctl restart docker
- 清空未运行的容器: docker rm $(sudo docker ps -a -q)
- 输入映射端口命令(8087是jenkins打包运行的项目访问端口号,-p表示外部映射内部的端口号,外部访问容器的8087端口号,容器接收到8087,访问内部的8087)
docker run -p 8080:8080 -p 8087:8087 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean
- 重新访问jenkins页,登入,点击需要打包运行的项目,点击立即构建即可
- 注意点如果使用上面的shell脚本启动项目,因为shell脚本中的启动命令是”java -jar” ,属于前台启动方式,如果在配置页中点击”立即构建”,打包项目运行项目,可能会一直在开始启动状态—到不了启动完成状态,会一直转圈,修改shell脚本代码
#!/bin/bash
#服务名称
SERVER_NAME=mayikt_springboot
# 源jar路径,mvn打包完成之后,target目录下的jar包名称,也可选择成为war包,war包可移动到Tomcat的webapps目录下运行,这里使用jar包,用java -jar 命令执行
JAR_NAME=meitedu_springboot-0.0.1-SNAPSHOT
# 源jar路径
#/usr/local/jenkins_home/workspace--->jenkins 工作目录
#demo 项目目录
#target 打包生成jar包的目录
JAR_PATH=/var/jenkins_home/workspace/meitedu_springboot/target/
# 打包完成之后,把jar包移动到运行jar包的目录--->work_daemon,work_daemon这个目录需要自己提前创建
JAR_WORK_PATH=/var/jenkins_home/workspace/meitedu_springboot/target/
echo "查询进程id-->$SERVER_NAME"
PID=`ps -ef | grep "$SERVER_NAME" | awk '{print $2}'`
echo "得到进程ID:$PID"
echo "结束进程"
for id in $PID
do
kill -9 $id
echo "killed $id"
done
echo "结束进程完成"
#复制jar包到执行目录
echo "复制jar包到执行目录:cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH"
cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH
echo "复制jar包完成"
cd $JAR_WORK_PATH
#修改文件权限
chmod 755 $JAR_NAME.jar
#启动打包的项目命令(后台启动)
BUILD_ID=dontKillMe nohup java -jar $JAR_NAME.jar &
六. Jenkins Pipeline
- Pipeline在Unix/Linux系统中经常用到, Pipeline将一个命令/程序/进程的输出发送到另一个命令/程序/进程,以进行进一步处理。比如:cat test.txt | grep test1。Jenkins 中的Pipeline借用了Unix/Linux中的 Pipeline思路,实现像流水线一样来调度Jenkins任务,通过Jenkinsfile来描述整个持续集成流程
- 新建pipeline任务
- 编写Pipeline脚本可选择Pipline script或者Pipline script from SCM
Pipline script模式是将脚本写在下面的输入框中
Pipline script from SCM是将Pipeline script放到Git或者SVN上,执行的时候从上面拉下来执行
- Pipeline Script,编写如下代码
pipeline {
agent any
stages {
stage('begin') {
steps {
echo 'Hello pipeline'
}
}
}
post {
always {
echo 'say goodbay'
}
}
}
Pipline script模式是将脚本写在下面的输入框中
stages:添加执行步骤
post:任务执行完成后执行的操作
Pipeline Script from SCM
- Pipeline Script除了写在jenkins界面以外,也可以放入git源码库进行管理,在 Jenkins Pipeline任务中选择 Pipeline script from SCM
- 添加git源码地址,在 Script Path中填写需要运行的Jenkinsfile文件所在的地址
- 创建完成后保存,点击Build Now,我们可以看到不同构建阶段进度
- 构建日志
七. Jenkinsfile语法
- 上面Pipeline Script编写的代码就可以看为jenkinsfile代码,先了解一个jenkinsfile语法
- 参考博客
八. Jenkinsfile的使用
- pipeline项目中,可以直接在jenkins的web UI上编写pipeline脚本,还有一种方法是使用Jenkinsfile,它放在源码管理库中,比如github、SVN等。为了使pipeline项目管理更加方便,也就是Pipeline script from SCM模式, 将pipeline脚本保存到jenkinsfile文件中,与项目代码一块存入git
- 编写jenkinsFile需要先了解jenkinsFile语法
- 参考博客