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为例:

jenkins搭建springboot环境

2. 部署并安装Registry

建构docker私有仓库Registry

三. 配置从gitlab到jenkins的自动化构建

  1. 创建Jenkins构建任务:

    此处选择:构建一个自由风格的软件项目

  2. 创建任务启动触发器:

  • 选择构建触发器(Build when a change is pushed to GitLab. GitLab webhook URL):

  • 点击高级按钮,生成访问Token:

  • 进入需要构建的Gitlab项目,选择:设置-->继承,配置URL、触发器与Token:

    此处输入Jenkins生成的构建请求地址与访问Token,因为我这里使用的是Tag发布版本,因此选择触发器为:标签推送事件

  1. 配置Jenkins的gitlab代码拉取

    配置需要构建项目的git地址,以及配置访问授权,我这里选择的是用户名密码的方式,也可以直接去Jenkins配置SSH的授权

  2. 配置参数化构建

    命名构建传递参数为:RELEASE,参数类型为:标签
    由于我们使用gitlab的TAG方式进行发版,因此构建参数选择标签,如果使用其它方式,请选择自己需要的方式

  3. 配置项目文件,增加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
  1. 配置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

  1. 执行Jenkins构建任务

两种执行方式,gitlab触发(上面配置)以及在任务界面点击:Build with parameters执行


查询执行结果


jenkins搭建springboot环境(非Maven)
https://www.lingyepro.com/archives/392
作者
零叶独舞
发布于
2023年01月02日
许可协议