自动化部署(二):Jenkins持续集成(CI/CD)

一、简介

Jenkins 是一个开源的持续集成(CI)工具,用于自动化构建、测试和部署软件项目。它提供了一个易于使用和可扩展的平台,帮助团队更高效地开发和交付软件。

官网:https://www.jenkins.io

中文文档:https://www.jenkins.io/zh/

二、前置软件安装

我这里使用的是 CentOS7+jdk21+maven3.8.8+jenkins2.479.3+git,进行介绍 jenkins的安装与使用,在进行安装之前,服务器必须装好 jdk21 / maven3.8.8 / git,并且配置好环境变量

2.1 maven

Maven下载链接:https://maven.apache.org/download.cgi

将压缩包通过Xftp工具上传到服务器中,这里我在根目录下创建了Jenkins目录用来存放包(/jenkins)。

shell 复制代码
tar -xzf apache-maven-3.8.8-bin.tar.gz

更改Setting文件

修改Maven的依赖包存储路径和下载源地址,依赖包存储路径博主创建在 /jenkins/apache-maven-3.8.8/repository

shell 复制代码
vim /jenkins/apache-maven-3.8.8/conf/settings.xml

<localRepository>/jenkins/apache-maven-3.8.8/repository</localRepository>
<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>Aliyun Maven</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

2.2 jdk

JDK下载链接:https://www.oracle.com/cn/java/technologies/downloads/#java21

将压缩包通过Xftp工具上传到服务器中,这里我在根目录下创建了Jenkins目录用来存放包(/usr/local/java)。

shell 复制代码
mkdir /usr/local/java
tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/java

配置JAVA环境变量

创建软连。接一般linux可能会有自己自带的java环境,是jdk1.8的,它已经占用了/usr/bin/java 的这个软链接。因此你需要先删除这个软连接。

powershell 复制代码
rm -rf /usr/bin/java

然后重新创建 java 软链接到 /usr/bin/ 目录下

shell 复制代码
ln -s /usr/local/java/jdk-21.0.5/ /usr/bin/java

编辑系统配置文件

shell 复制代码
vim /etc/profile

按下 键盘i 进入可编辑模式;按下shift + G 快速定位到文件结尾处

然后输入以下内容

shell 复制代码
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH

激活配置文件

shell 复制代码
source /etc/profile

2.3 git

下载地址:https://www.kernel.org/pub/software/scm/git/

shell 复制代码
mkdir -p /usr/local/git
tar -zxvf git-2.45.3.tar.gz -C /usr/local/git/

安装编译环境

shell 复制代码
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

安装上面编译环境的时候,yum自动帮你安装了git,这时候你需要先卸载这个旧版的git。否则还是一个老版本

shell 复制代码
yum remove git

编译源码

进入刚刚解压的git文件夹中

shell 复制代码
make perfix=/usr/local/git all

安装git

清除之前编译产生的临时文件和目标文件。在 Git 源代码目录下,可以运行make clean

shell 复制代码
# 这个时候一定要在git-2.45.3的文件夹下执行
make prefix=/usr/local/git install

配置环境变量

shell 复制代码
vim /etc/profile
export PATH=$PATH:/usr/local/git/bin
source /etc/profile

三、jenkins安装

在下载安装包之前要先确定应该下载哪个版本的 Jenkins,Jenkins 的版本依赖于 Java 的版本,可在 Jenkins-Java Support Policy 中进行查看

官网下载war包https://www.jenkins.io/download/,我这里下载的是2.479.3版本,下载完成进行,上传到服务器进行启动

shell 复制代码
cd /jenkins
nohup java -jar jenkins.war --httpPort=18080 > jenkins.log 2>&1 &

启动完成,浏览器访问ip:端口,端口默认是18080


linux查找密码

powershell 复制代码
cat /root/.jenkins/secrets/initialAdminPassword

3.1 插件安装

打开 /root/.jenkins/hudson.model.UpdateCenter.xml,内容替换

xml 复制代码
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>

再删除文件(/root/.jenkins/updates/default.json,因为会先查找default.json中配置的插件镜像下载地址,没有才会去找hudson.model.UpdateCenter.xml中配置的镜像地址)。建议一次下完所有依赖的插件,手动一个个装完。如果嫌弃麻烦。就在最开始的时候,选择 jenkins 推荐安装的插件,这样就不会出现依赖版本冲突的问题。安装推荐的插件。

设置jenkins账号密码

注意:当前使用jenkins构建build的时候会在jenkins的根目录/root/.jenkins/下生成一个workspace文件夹,里面存放拉取下来的项目,并且打包后的jar包也在这里,jenkins配置build构建时的 pom 路径就得填写这文件夹下的项目里的pom,然后打包完后,将打包的jar包复制到我们预先创建的项目名称,流程思路就是这样。

安装额外的插件:登录进入首页选择菜单 Manage Plugins 进入安装 maven插件 :Maven Integration进行安装完成后,就可以创建一个 maven项目,进行配置。

四、jenkins 配置

4.1 maven

4.2 jdk

4.3 git

4.4 maven 插件设置

五、构建一个item

5.1 准备工作

shell 复制代码
#!/bin/bash
APP_NAME=jzjweb-bakend-1.0-SNAPSHOT.jar # 名称自定义,需要修改
PORT=8081 # 端口自定义,需要修改
PROJECT_PATH=$(cd `dirname $0`; pwd) #当前文件夹名称,不需要修改

if [ -f "$APP_NAME" ];then
  rm -rf $APP_NAME
fi

pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
if [ -n "${pid}" ]; then
  kill -9 $pid
fi

# 注意 jzjwebtest 名称需要自行修改成你自己创建的名称
cp /root/.jenkins/workspace/jzjwebtest/target/$APP_NAME $PROJECT_PATH/

nohup java -server -Xms512m -Xmx512m -Xmn128m -jar $APP_NAME > $PROJECT_PATH/nohup.out 2>&1 &

构建起名

勾选Discard old builds(丢弃旧版本): Days to keep builds (保留构建的天数1) / Max # of builds to keep5(要保留的最大构建数5)

item的源码

Build Triggers(构建触发器)

勾选 Build whenever a SNAPSHOT dependency is built(构建 SNAPSHOT 依赖项时构建) -> Schedule build when some upstream has no successful builds(当某些上游没有成功构建时安排构建)

Build(构建)

  • 1.配置pom位置:/root/.jenkins/workspace/填写的工程名(填写的jenkins工程名称),如:/root/.jenkins/workspace/jzjweb-bakend
  • 2.Goals and options(目标和选项):clean package -Dmaven.test.skip=true,注意 :前面不能有 mvn,还需要注意的是如果是聚合工程,则只需要打包依赖的工程clean install -pl j-demo -am -amd -Ptest -Dmaven.test.skip=true,这条命令只会打包 j-demo依赖的工程与j-demo工程。

Post Steps(发布步骤)

  • 1.选择 Run only if build succeeds(仅在构建成功时运行)

  • 2.Add post-build step(添加构建后步骤),选择 shell.sh脚本

shell 复制代码
cd /jzjweb-bakend #必须设置,否则nohup.out日志文件不能生成
chmod 777 /jzjweb-bakend/start.sh
sh start.sh
BUILD_ID=dontKillMe /jzjweb-bakend/start.sh

说明:jzjweb-bakend是事先创建好的目录,并且目录下创建一个start.sh脚本,内容就是上边步骤2的脚本内容 其他 Build Environment(构建环境) / Pre Steps(预步骤) 等等不用填。

最后工程创建成功,就可以点击进去再点击 Build Now进行立即构建。

查看构建日志

最后说明一下:当使用jenkins构建build的时候会在jenkins的根目录/root/.jenkins/下生成一个workspace文件夹,里面存放拉取下来的项目。

六、GitLab触发构建

安装 Generic Webhook Trigger 插件

配置构建

Gitlab 配置项目集成钩子,并绑定 webhook

  • 仓库的owner才能设置项目的webhook,切换到root

  • 配置只有master被push了,才发出请求

注意:新版本的gitlab不允许往本地发钩子

管理员设置一下

修改启动脚本,使得项目重启先停后起 start.sh

shell 复制代码
#!/bin/sh
PROJECT_PATH=/root/.jenkins/workspace/jzjwebtest/target/
PROJECT_NAME=jzjweb-bakend-1.0-SNAPSHOT.jar
# stop process
tpid=`ps -ef|grep $PROJECT_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    # 是先关闭和其有关的程序,再将其关闭
    kill -15 $tpid
fi
sleep 5

tpid=`ps -ef|grep $PROJECT_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo 'Stop Success!'
fi

# start process
tpid=`ps -ef|grep $PROJECT_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'App is already running.'
else
    echo 'App is NOT running.'

    nohup java -jar $PROJECT_PATH$PROJECT_NAME >/dev/null 2>&1 &
    echo Start Success!
    sleep 2
fi

测试下webhook

还在刚刚配置gitlab 的集成配置页面,找到webhook 列表,点击 下拉选项里的 Push events

可以看到,jenkins 已经自动获取到webhook 的通知请求,并开始了构建

测试真实推送master分支,自动构建项目

idea里,master分支确实commit+push

jenkens开始下一次构建了!

项目上线了!

相关推荐
hhzz4 小时前
Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)
运维·自动化·ansible
小张认为的测试6 小时前
Jenkins下载 Maven、Allure 插件并且配置环境
java·软件测试·ci/cd·jenkins·maven
Anna_Tong9 小时前
一站式云原生支持,Alibaba Cloud Linux性能有多强?
开发语言·微服务·云原生·容器·自动化·perl
喝醉酒的小白17 小时前
批量创建ES索引
大数据·elasticsearch·jenkins
Suwg20918 小时前
【由浅入深认识Maven】第4部分 maven在持续集成中的应用
servlet·ci/cd·maven
周杰伦_Jay18 小时前
详细介绍:持续集成与持续部署(CI/CD)技术细节(关键实践、CI/CD管道、优势与挑战)
程序人生·ci/cd·docker·微服务·云原生·容器·人机交互
hcja6661 天前
CVE-2024-23897-Jenkins任意文件读取漏洞复现
运维·web安全·网络安全·中间件·jenkins
铭毅天下1 天前
Elasticsearch 性能测试工具全解析
大数据·测试工具·elasticsearch·搜索引擎·jenkins
大懒猫软件1 天前
如何有效使用Python爬虫将网页数据存储到Word文档
爬虫·python·自动化·word