Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。现记录一下本人使用jenkins+gitee在当前和远程服务器自动构建一个springboot项目,并使用docker打包成镜像进行部署,废话不多说,开搞
拥有一台服务器,本人使用的是阿里云的linux的服务器。服务器安装Docker,Maven,Git,Jenkins,JDK并配置好环境变量
Jenkins安装参考:https://blog.csdn.net/quwujin/article/details/112533165
Git安装参考:https://www.cnblogs.com/zhi-leaf/p/10978538.html
Maven安装参考:https://www.cnblogs.com/zhi-leaf/p/6323081.html
JDK安装参考:https://www.cnblogs.com/zhi-leaf/p/10315125.html
Docker安装参考: https://blog.csdn.net/z1353095373/article/details/107102745-
将自己的springboot项目push到gitee仓库,拿到项目的url
- Jenkins配置
(1) 服务器Jenkins安装好之后,在浏览器访问服务器ip:(jenkins端口号),出现以下界面
输入cat /var/lib/jenkins/secrets/initialAdminPassword
获取密码,复制粘贴到管理员密码,点击继续
(2) 之后出现下面的界面,选择安装推荐的插件或者选择插件来安装都可以,需要的插件可以在配置完jenkins后在自行下载
(3) 插件安装完以后,出现创建管理员的界面,依次操作就好
(4)配置完成后,可以看到jenkins的功能界面,下图是我已经创建过两个任务
4.jenkins插件的安装
(1) 安装插件的路径
(2) 需要安装的插件
Git 插件:拉取代码
Gitee 插件: 开启webhook,push代码后自动构建,下面会讲配置过程
Maven Integration plugin 插件:maven打包
Publish Over SSH 插件:远程服务器连接
(3)工具环境配置
配置JDK
配置git
配置maven
对应的*_HOME在环境变量中都可查看
vim /etc/profile
(4) 配置ssh
拉到最下面
-
创建任务
(1)在jenkins主页面,点击New Item创建一个新任务
(2)配置git
(3)配置gitee,
复制url和密码,打开gitee仓库,在管理 - WebHooks - 添加webHook,将url和密码填入对应的输入框
(4) 配置maven
(5) 如果是将项目部署到jenkins所在的服务器(不需要看6),脚本自行百度搜索编写,贴出我自己的
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/home/project
# 源jar路径
SOURCE_PATH=/var/lib/jenkins/workspace
#项目名称
PROJECT_NAME= xxx
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME= xxx
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH ...."
cp $SOURCE_PATH/$PROJECT_NAME/$SERVER_NAME/target/$SERVER_NAME-1.0-SNAPSHOT.jar $BASE_PATH/$SERVER_NAME.jar
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "$SERVER_NAME.jar 备份..."
cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
echo "备份 $SERVER_NAME.jar 完成"
else
echo "$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
#清除旧容器
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID"
echo "停止旧容器"
docker stop $SERVER_NAME
echo "删除旧容器"
docker rm $SERVER_NAME
fi
# 清楚旧镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
echo "删除镜像"
docker rmi $IID
fi
#构建镜像
echo "开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "构建镜像成功!"
# 运行docker容器
echo "创建并启动$SERVER_NAME容器..."
docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -d -p 8085:8085 $SERVER_NAME
echo "$SERVER_NAME容器启动完成"
}
# 运行docker容器
function run(){
backup
transfer
build
}
#入口
run
(6) 如果是部署到远程服务器(5可略过)
我自己将maven打包出来的jar包传输到远程服务器的/home/source下面并将/home/source下的.jar复制到/home/project中(jenkins.sh)中实现.
/home/project添加两个文件,一个jenkins.sh脚本,一个DockerFile文件,构建成功将文件传输到远程服务器,会执行jenkins.sh脚本
cd /home/project
sh jenkins.sh
下面贴出我的两个文件,仅供参考
DockerFile文件:
#基础镜像
FROM openjdk:8-jdk-alpine
#镜像制作人
MAINTAINER yjy
VOLUME /tmp
ADD ./mall.jar mall.jar
#暴露运行的端口号
EXPOSE 8085
#执行jar包
ENTRYPOINT ["java","-jar","mall.jar"]
jenkins.sh文件
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/home/project
# 源jar路径
SOURCE_PATH=/home/source
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=mall
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
function transfer(){
echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH ...."
cp $SOURCE_PATH/$SERVER_NAME-1.0-SNAPSHOT.jar $BASE_PATH/$SERVER_NAME.jar
echo "迁移完成"
}
# 构建docker镜像
function build(){
#清除旧容器
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID"
echo "停止旧容器"
docker stop $SERVER_NAME
echo "删除旧容器"
docker rm $SERVER_NAME
fi
# 清楚旧镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
echo "删除镜像"
docker rmi $IID
fi
#构建镜像
echo "开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "构建镜像成功!"
# 运行docker容器
echo "创建并启动$SERVER_NAME容器..."
docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -d -p 8085:8085 $SERVER_NAME
echo "$SERVER_NAME容器启动完成"
}
# 运行docker容器
function run(){
transfer
build
}
#入口
run
-
开始构建