目录
Jenkins使用Docker方式安装
直接使用 Jenkins.war 启动
配置管理Jenkins
1、Jenkins原理和基本初始化
2、安装 Publish over SSH插件
3、安装和配置工具【jdk、git、maven】
4、配置项目
5、基于git分支部署【可选项】
5-1)、输入框方式
5-2)、下拉选项方式
6-1、脚本命令行部署
6-2、脚本Docker部署
之前也接触写了好几篇Jenkins的博客,但是自己使用最新版本的Jenkins【2.339版本】,然后去发布Spring boot项目,发现还是花了自己不少的时间,所以记录一下。整理一下遇到的问题:
1、还是对Jenkins的整体不熟悉,安装时选择默认插件安装,结果默认中并没有 Publish Over SSH 1.2.4插件,还以为是Jenkins的版本变动比较大,浪费了很多时间;
2、对shell脚本不熟悉,导致来回调了很久;
Jenkins使用Docker方式安装
直接使用命令安装(省略安装Docker的部分):
docker run \
-u root \
--rm \
-d \
-p 8300:8300 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
查看docker镜像信息:docker images
启动镜像:docker run -d -p 8300:8300 jenkinsci/blueocean
也可以增加jvm参见进行启动:
docker run -d -p 8300:8300
-e JAVA_OPTS='-Dfile.encoding=utf-8 -server -XX:+UseG1GC -Xms256m -Xmx256m'
jenkinsci/blueocean
查看是否启动,可以执行ps -ef|grep 8300或jenkins ; 或者执行命令 docker ps -a
直接使用 Jenkins.war 启动
直接下载文档版本的 jenkins.war包,可以在选择对应的版本
http://updates.jenkins-ci.org/download/war/
如:https://updates.jenkins-ci.org/download/war/2.339/jenkins.war
- cd /home/kevin/
- mkdir jenkins
- cd jenkins
- 下载包:wget http://updates.jenkins-ci.org/download/war/2.339/jenkins.war
- 执行 java -jar jenkins.war
配置管理Jenkins
1、Jenkins原理和基本初始化
浏览器访问:http://ip:8300
需要输入密码,则在启动日志或者对应的文件中查看,如果不好找也可以搜索文件位置,使用:
find / -name initialAdminPassword
点击安装插件
2、安装 Publish over SSH插件
请一定注意需要安装 Publish over SSH插件,安装完成后可以看到:
然后在 Configure System 配置ssh server,然后在项目job创建时可以直接使用插件的服务,如下:
3、安装和配置工具【jdk、git、maven】
需要在Jenkins的管理菜单,进入工具管理进行配置:
Maven也已经安装了,这里需要设置 setting.xml的配置文件地址,服务部署时的配置文件,将其放到服务器中的 /home/kevin/maven/setting.xml, 则:
JDK
whereis jdk
并查看jdk信息如下:
所以配置地址为:/usr/local/jdk/jdk1.8
Git
yum list git
yum -y install git
最后查看git版本: git --version
以及查看git的安装地址:whereis git
最后,在jenkins上进行配置:
4、配置项目
Jenkins允许将项目使用 视图(VIEW)或 文件夹以将所有要发布的项目进行隔离,如下:
现在直接在 mosty-framework下创建 mosty单体项目(Freestyle project或maven项目都可以):
继续先为gitlab创建账号、密码:
继续项目基础信息配置:
继续配置代码拉去地址:
配置maven打包的位置和命令,如果是maven子项目时需要增加对应的路径:
继续【构建】部分
下面就是在 Publish over SSH中编写脚本等的时候了,这个时候分为两种情况,一种是直接将spring boot打成jar包,然后在服务器端进行启动;另一种是推包过去在服务器端打成 docker镜像再启动
5、基于git分支部署【可选项】
5-1)、输入框方式
在基础配置中,选择参数构建,选择字符串类型,填入对应的参数配置
在git配置中选择分支部分,使用参数进行代替,如下:
构建时样式:
5-2)、下拉选项方式
需要先按照 git paramter插件:
配置构建参数:
git地址配置时,分支选项使用参数代替:
构建时的样式:
6-1、脚本命令行部署
Publish Ssh over的执行脚本见下面,当前配置的ssh server的服务器地址为: /home/mosty/project/workspace
Shell脚本说明(这里还需要注意,及时jdk设置了环境变量,在服务器任何地方都可以使用 java -jar命令启动,但是脚本这里也要写 java的具体路径,如下):
- 打印开始;定义jar包名字的变量;定义jar包的使用路径(即启动的位置);
- 使用p命令获取当前正在运行的该包的pid,如果pid存在则将进程杀死,这里使用了 -9,也可以去掉
- 由于publish over ssh配置的将包放到了 /home/mosty/project/workspace位置;此时先判断基础路径(即启动的位置)是否存在上次启动的包,如果有则将其使用日期进行修改,并将包mv到一个专门存放历史包的位置;再将推上来的包放到新的要启动的位置;
- 此时新的要启动的包,可能没有执行权限等,这里直接暴力的修改为 777权限(读写执行)
- 使用java -jar命令启动spring boot项目,这里增加了后台启动,jvm参数控制;
- 由于应该是使用了 nohup命令,此时直接退出的话,要不就是包启动了但是jenkins没有收到状态;要不就是jenkins显示成功了,但是包没有起来,此时需要sleep一定的时间并且在 Publish over SSH配置时勾选Exec in pty选项【见下图】
echo "Stopping SpringBoot Application"
JAR_FILE=mosty-1.0.0-SNAPSHOT.jar
BASE_PATH=/home/mosty/project/mosty
PID=ps -ef | grep $JAR_FILE | grep -v grep | awk '{print $2}'
echo $PID
echo "--------kill start--------------"
if [ -n "$PID" ]
then
echo "kill -9 的pid:" $PID
kill -9 $PID
fi
echo "--------kill finish-----------------"
echo "--------replace start--------------"
DATE=$(date +%Y%m%d%H%M%S)
JAR_FILE_PATH="/home/mosty/project/mosty/$JAR_FILE"
if [ -f "$JAR_FILE_PATH" ]; then
mv $BASE_PATH/$JAR_FILE /home/mosty/project/workspace/bak/$JAR_FILE.$DATE.bak
fi
mv /home/mosty/project/workspace/$JAR_FILE $BASE_PATH/
echo "--------replace finish-----------------"
echo "Execute shell Finish"
chmod 777 $BASE_PATH/mosty-1.0.0-SNAPSHOT.jar
echo "修改jar包权限为 777 "
echo "Executing program….."
nohup /usr/local/jdk/jdk1.8/bin/java -server -Dfile.encoding=UTF-8 -Xms256m -Xmx256m -XX:+UseG1GC -jar $BASE_PATH/$JAR_FILE --spring.config.location=$BASE_PATH/application.yml $BASE_PATH/nohup.log 2>&1 &
sleep 15s
执行完脚本后不需要等管道直接返回成功,可以选择:
6-2、脚本Docker部署
Publish Ssh over的执行脚本,其中Dockerfile 和 docker.sh 参见下面部分;当前配置的ssh server的服务器地址为: /home/mosty/project/workspace
Shell脚本说明
- 定义docker镜像的名称
- 同上面一样将spring boot包上传,再将上次运行的包修改后放到一个专门存放历史版本的地方,最后将上传的包mv到需要运行的位置
- 修改待运行的jar包的权限为 777(可读写执行)
- 获取当前正在运行的docker的进程
- 如果有正在运行的docker,则先停止;再删除;
- 使用新的Spring boot jar包构建镜像(Dockerfile 与jar包当前为同一级目录)
- 运行 docker.sh脚本(也就是启动docker脚本,见下)
echo "jenkins开始部署"
IMAGE_NAME=mosty-jar
echo "--------replace start--------------"
DATE=$(date +%Y%m%d%H%M%S)
JAR_FILE="/home/mosty/project/mosty/$JAR_FILE"
if [ -f "$JAR_FILE" ]; then
mv /home/mosty/project/mosty/$JAR_FILE /home/mosty/project/workspace/bak/$JAR_FILE.$DATE.bak
fi
mv /home/mosty/project/workspace/$JAR_FILE /home/mosty/project/mosty/
echo "--------replace finish-----------------"
chmod 777 /home/mosty/project/mosty/mosty-1.0.0-SNAPSHOT.jar
echo "修改jar包权限为 777 "
echo '================获取容器id=================='
CID=$(docker ps | grep "$IMAGE_NAME" | awk '{print $1}')
echo 容器id=$CID
echo '================获取镜像id=================='
IID=$(docker images | grep "$IMAGE_NAME" | awk '{print $3}')
echo 镜像id=$IID
if [ -n "$CID" ]; then
echo 存在$IMAGE_NAME容器,停止容器并删除
docker stop $CID
docker rm $CID
fi
docker build -t $IMAGE_NAME -f Dockerfile .
echo 已经构建$IMAGE_NAME的镜像
sh /home/mosty/project/mosty/docker.sh
Dickerfile脚本表简单:
FROM java:8
VOLUME /tmp
ADD mosty-1.0.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker.sh 脚本,和脚本说明:
- -d 后台运行docke;
- -p 将 9999端口与docker的9999端口进行关联或挂载;
- -e 设置jvm参数
- -v 挂载linux的包到docker的跟目录,由于docker运行的目录不是当前目录,并且这样的话也能实现修改当前的 application.yml 优先级高于项目中的yml,方便修改后重启
docker run -d -p 9999:9999
-e JAVA_OPTS='-Dfile.encoding=utf-8 -server -XX:+UseG1GC -Xms256m -Xmx256m -XX:+PrintGC -XX:+PrintGCTimeStamps'
-v /home/mosty/project/mosty/application.yml:/application.yml mosty-jar
end!!!