jenkins搭建springboot环境(非Maven)
由于当前项目繁多,线上环境复杂,每次上线需要庞大的配置文件修改以及项目文件拷贝,因此需要一定的自动化运维支撑基本的上线操作。初步规划为经典的gitlab触发jenkins自动构建打包并且构建docker镜像,发布到公司制定的服务器上,并且线上支持多环境配置,自动发布等功能。
具体构建流程,如下入所示:
一. 下载安装并配置jenkins
官网下载地址:https://www.jenkins.io/download/
由于要直接使用Docker进行镜像构建,此处使用官网提供的ubuntu仓库进行安装,也可以直接使用war包,而非使用Docker。
1. 添加jenkins仓库KEY
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
2. 添加jenkins最新仓库配置到ubuntu仓库
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
3. 更新仓库并且安装jenkins
sudo apt-get update
sudo apt-get install fontconfig openjdk-11-jre #此处JDK也可以使用JDK8,如果已经安装则忽略
sudo apt-get install jenkins
4. 配置Jenkins仓库地址
因为国际线路带宽运营商拿来卖钱(事实上大多外部访问缓慢不是因为某Wall的原因),因此Jenkins官方仓库在某些运营商网络下相当卡顿,因此一般国内需要对Jenkins仓库重新配置软件源地址:
在Jenkins目录找到文件hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?> <sites> <site> <id>default</id> <url>https://updates.jenkins.io/update-center.json</url> </site> </sites>
更新为:
<?xml version='1.1' encoding='UTF-8'?> <sites> <site> <id>default</id> <url>https://mirrors.aliyun.com/jenkins/updates/update-center.json</url> </site> </sites>
5. 启动并且初始化jenkins
systemctl enable jenkins
systemctl start jenkins
#jenkins第一次运行会初始化admin账户密钥,并且打印到systemd的日志下
#如果第一次运行没有记录初始化密码,则需要到Jenkins安装目录寻找secrets\initialAdminPassword
#这个密码需要在第一次运行的Jenkins解锁页面使用,因此需要记下来
systemctl status jenkins
打开浏览器,访问部署Jenkins的服务器http://IP:8080,第一次等待的比较久,可以去泡杯茶。一段时间以后出现初始化解锁页面:
输入刚刚记下的初始化密码,然后进入初始化配置页面:
因为我不想过多使用Jenkins的插件(稳定性比较差的原因),因此一路默认到主界面
选择“安装推荐插件”,然后耐心等待到创建第一个管理员账户页面,这里我使用admin继续,并且进入系统配置选择中文环境:
进入系统管理-->插件管理-->安装必要插件:
Publish Over SSH:远程执行脚本使用
Gitlab Plugin:从gitlab仓库拉取代码使用
Git Parameter Plug-In:用作对指定Tag进行构建
进入系统管理-->系统配置-->Publish Over SSH,添加之后需要部署项目的服务器
二. 部署配置registry私有Docker镜像仓库
1. 配置Docker运行环境,以Ubuntu或Debian为例:
2. 部署并安装Registry
三. 配置从gitlab到jenkins的自动化构建
创建Jenkins构建任务:
此处选择:构建一个自由风格的软件项目创建任务启动触发器:
选择构建触发器(Build when a change is pushed to GitLab. GitLab webhook URL):
点击高级按钮,生成访问Token:
进入需要构建的Gitlab项目,选择:设置-->继承,配置URL、触发器与Token:
此处输入Jenkins生成的构建请求地址与访问Token,因为我这里使用的是Tag发布版本,因此选择触发器为:标签推送事件
配置Jenkins的gitlab代码拉取
配置需要构建项目的git地址,以及配置访问授权,我这里选择的是用户名密码的方式,也可以直接去Jenkins配置SSH的授权配置参数化构建
命名构建传递参数为:RELEASE,参数类型为:标签
由于我们使用gitlab的TAG方式进行发版,因此构建参数选择标签,如果使用其它方式,请选择自己需要的方式配置项目文件,增加Docker镜像的打包支持
根据之前教程:SpringBoot项目Dockcer镜像构建,整理脚本编写统一构建脚本
#!/bin/bash
help() {
echo "用法:"
echo "build.sh [-c commond] [-v VERSION]"
echo "描述:"
echo "-c,运行方式:package、docker、run."
echo "-v,版本号:docker镜像打包参数."
echo "-e,环境配置文件."
echo "-k,执行run命令的时候是否保留上一个镜像文件,一般在多环境下使用."
echo "-m,MAVEN配置环境变量."
echo "-j,JAVA配置环境变量."
echo "-h,帮助."
exit 1
}
while getopts "c:v:e:k:m:j:h" opt; do
case $opt in
c) commond=$OPTARG;;
v) VERSION=$OPTARG ;;
e) ENV_FILE=$OPTARG;;
k) IS_KEEP=$OPTARG;;
m) MAVEN_HOME=$OPTARG ;;
j) JAVA_HOME=$OPTARG ;;
h) help ;;
esac
done
export BASE_PATH=`pwd`
#预置参数
###配置自己的Registry私有仓库地址
export REGISTRY_HOST=
###配置自己的工具下载地址,如果直接使用参数-j,-m构建也可以不配置
export TOOLS_HOST=
#判断版本号是否存在
if test -z "$VERSION"
then
export VERSION='latest'
fi
#判断环境变量是否存在
if test -z "$ENV_FILE"
then
export ENV_FILE='dev.env'
fi
#判断是否保留镜像
if test -z "$IS_KEEP"
then
export IS_KEEP='no'
fi
package() {
if [ -z "$MAVEN_HOME" -o -z "$JAVA_HOME" ];then
createEnv
fi
#打包项目文件
cd fda_auth
$MAVEN_HOME/bin/mvn clean package
cd ../
cd fda_auth_ica
$MAVEN_HOME/bin/mvn clean package
cd ../
cd fda_gateway
$MAVEN_HOME/bin/mvn clean package
cd ../
cd fda_tools
$MAVEN_HOME/bin/mvn clean package
cd ../
}
createEnv() {
#判断是否存在文件夹
if [ ! -d $BASE_PATH"/tmp/" ];then
mkdir tmp
fi
cd tmp
#判断是否存在MAVEN
if [ ! -d "apache-maven/" ];then
wget $TOOLS_HOST/tools/apache-maven.tar.gz
tar -zxvf apache-maven.tar.gz
rm -rf apache-maven.tar.gz
rm -rf apache-maven/conf/settings.xml
cp $BASE_PATH/build/settings.xml apache-maven/conf/
fi
#判断是否存在JAVA
if [ ! -d "jdk1.8.0_65/" ];then
wget $TOOLS_HOST/tools/java/jdk1.8.0_65.tar.gz
tar -zxvf jdk1.8.0_65.tar.gz
rm -rf jdk1.8.0_65.tar.gz
fi
export JAVA_HOME=$BASE_PATH/tmp/jdk1.8.0_65
export MAVEN_HOME=$BASE_PATH/tmp/apache-maven
#回主目录
cd $BASE_PATH
}
packDocker() {
#启动Docker打包
docker build -t $REGISTRY_HOST/fda_boot:${VERSION} -f Dockerfile .
# echo $REGISTRY_USER_PASSWORD | docker login -u $REGISTRY_USER_NAME --password-stdin $REGISTRY_HOST
docker push $REGISTRY_HOST/fda_boot:${VERSION}
}
runDocker() {
appName=`awk 'BEGIN {RS = "\n+";ORS = "\n"} /'appName='/ {print $0}' $ENV_FILE | sed 's/appName=//'`
envs=`awk 'BEGIN {RS = "\n+";ORS = "\n"} /'envs='/ {print $0}' $ENV_FILE | sed 's/envs=//'`
ports=`awk 'BEGIN {RS = "\n+";ORS = "\n"} /'ports='/ {print $0}' $ENV_FILE | sed 's/ports=//'`
docker stop `docker ps --filter "name=${appName}" -q -a`
docker rm `docker ps --filter "name=${appName}" -q -a`
#判断是否保留镜像
if test -z "$IS_KEEP"
then
docker rmi `docker images | grep 'fda_boot' | grep ${VERSION} | awk '{print $3}'`
fi
docker pull $REGISTRY_HOST/fda_boot:${VERSION}
docker run -d --privileged=true --name ${appName} --restart=always \
-e TZ=Asia/Shanghai \
-e ENV="$envs" \
$ports \
-v /tmp/fda_boot/:/logs/ \
-v /tmp/fda_boot/process:/process \
$REGISTRY_HOST/fda_boot:${VERSION}
}
if [ "$commond" = "package" ];then
package
elif [ "$commond" = "docker" ];then
packDocker
elif [ "$commond" = "run" ];then
runDocker
elif [ "$commond" = "registry" ];then
registry
fi
cd $BASE_PATH
配置Jenkins构建
选择执行shell,并且输入:
#执行项目打包
sh build.sh -c package -j "/opt/tools/jdk1.8.0_65" -m "/opt/tools/apache-maven"
#执行Docker镜像打包以及发布的私有仓库
sh build.sh -c docker -v $RELEASE
如图所示:
7. 配置Jenkins远程多环境运行
在构建后操作中选择:Send build artifacts over SSH,并配置如下:
在Exec Command下输入构建脚本为:
cd /tmp/build/
sh build.sh -c run -v $RELEASE -e dev.env
此处注意Jenkins的Publish Over SSH插件一些坑:
Transfer Set上传文件不包含一些插件不支持上传的文件如:.git文件,最具可以查询下插件官网
执行命令的初始路径根据插件版本不同,并非一定是Remote director设置的路径,最好手动cd一下
如果需要看到上传执行详情,需要在高级选项中勾选:Exec in pty
因为Docker进项需要下载时间,最好增大执行超时时间:Exec timeout (ms)
特别注意,根据版本不同,并不是所有版本都显示远程脚本执行信息,如果不显示,需要在高级选项中勾选:Verbose output in console
执行Jenkins构建任务
两种执行方式,gitlab触发(上面配置)以及在任务界面点击:Build with parameters执行
查询执行结果