目录

Jenkins持续集成与Web前端SpringBoot项目的部署

目录

Jenkins持续集成与Web前端、SpringBoot项目的部署

Jenkins是一个开源的持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)工具,广泛应用于软件开发过程中。‌它基于Java开发,旨在提供一个开放易用的软件平台,帮助软件项目实现持续集成和持续交付。它的主要功能有以下几点:

‌1.自动化构建‌:Jenkins可以根据配置自动从代码仓库获取代码,并执行编译、打包等构建操作,例如对于Java项目进行Maven或Gradle构建。

‌    2.集成多种工具‌:Jenkins能够与多种开发工具和技术集成,如Git、Subversion等版本控制系统,以及JUnit、Selenium等测试框架。

‌    3.分布式构建‌:支持在多台机器上进行分布式的构建任务,以提高构建效率,缩短构建时间。

‌    工作流程图:

https://i-blog.csdnimg.cn/direct/3a8e8ab3ba524560ac90b9c68abec15a.png#pic_center

‌    提取 Jenkins镜像

[root@hw-81969 ~]# docker pull jenkins/jenkins

‌    查看镜像

[root@hw-81969 ~]# docker images

REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
jenkins/jenkins   latest    93d377dce516   2 days ago   441MB

‌    运行docker镜像

[root@hw-81969 ~]# docker run -d -u root  -p 1000:8080  -v /jenkins:/var/jenkins_home --name jenkins1 镜像id

‌    访问 Jenkins http://ip地址:1000/

https://i-blog.csdnimg.cn/direct/bbbbdf99279e47abbdad2425bc340a5b.png#pic_center

‌    获取密码,根据它的提示到指定目录寻找,或者通过查看日志获取

[root@hw-81969 ~]# docker logs  镜像id

https://i-blog.csdnimg.cn/direct/914c54edce094ef784330df3407f8555.png

‌    另外一种获取密码的方法:

docker exec -it  [容器名称] /bin/bash
cat /var/jenkins_mount/secrets/initialAdminPassword
exit

‌    输入密码后进入插件选择的界面,推荐安装就行

‌    设定管理员账号,我们直接用admin账号

https://i-blog.csdnimg.cn/direct/8965a118fc9a4a8a87b3d940a243ff0b.png#pic_center

https://i-blog.csdnimg.cn/direct/2c251a5583d344fe9678825038eac9c6.png#pic_center

‌    进入系统管理–>插件管理来安装我们下方用到的插件

Localization:Chinese(Simplified)  汉化插件
Gitee Plugin  对接gitee的插件  
Publish Over SSH   远程连接访问的插件
Email Extension   发送邮件插件
NodeJS   构建Vue等项目
Docker   Docker插件
Generic Webhook Trigger  触发构建任务
thinbackup   数据定期备份

‌    等待其安装完毕,就可以开始使用,默认的站点比较慢,在【高级页面】更换其它国内的镜像

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

https://i-blog.csdnimg.cn/direct/6113db34863d4dd1b272d87798520598.png

‌    进入【新建任务】页面,输入名称选择【构建一个自由风格的软件项目】,保存。保存之后配置先不用配,进入下一步

https://i-blog.csdnimg.cn/direct/f943852b39a648a6b2a5baac9449778f.png

‌    生成令牌 — 路径:在gitee个人页面->【设置】->【私人令牌】->【生成新令牌】即可。生成完成后记得及时保存

‌   在Jenkins面板点击【添加】,选择下图选项:成功之后记得保存

https://i-blog.csdnimg.cn/direct/5ef7f9e135684532a3a489402789c162.png

https://i-blog.csdnimg.cn/direct/bb20fbeb233041ffa239fd9fae490fd0.png

‌    进入【我的视图】,找到刚新建的任务,进入配置页面, 对这个任务的构建进行配置

https://i-blog.csdnimg.cn/direct/4be8636fe9e74d14802a26eeadbcd143.png

https://i-blog.csdnimg.cn/direct/8168d6a58072426682ad298d15004ebb.png

https://i-blog.csdnimg.cn/direct/b02c9835a8e045c49a85b6c06b3a409c.png

https://i-blog.csdnimg.cn/direct/1ddc91e1feca497ea1f05aa11d6a7e63.png

进入我们的gitee要部署的仓库项目的页面,把地址复制下来

https://i-blog.csdnimg.cn/direct/ddb0e1b6d83e420792fcef8db68b7d2b.png

https://i-blog.csdnimg.cn/direct/95fa691f3163449cb13bb4850fc7cb0b.png

https://i-blog.csdnimg.cn/direct/bdb4afff5e78428191faaed1b1fd340b.png

https://i-blog.csdnimg.cn/direct/d03051a8f61545f1a95044d62e059a40.png

https://i-blog.csdnimg.cn/direct/4eb9cd099a1b4d939a60d794e52b076f.png

配置远程服务器连接: 我们要用 Pushlish over SSH: 用来连接远程服务器,作为仓库服务器。下面开始配置

首先进入【系统管理】-> 【系统配置】,往下滑找到【Publish over SSH】,然后点击新增

https://i-blog.csdnimg.cn/direct/5ed93c1bb16b40559efb4a3ba3eee46f.png

https://i-blog.csdnimg.cn/direct/75d38beb8bf341358fdf58050665ca5f.png

成功之后,连接服务器的配置就完成了

配置邮箱通知信息

选择要通知的邮箱,开启smtp服务,我用的QQ邮箱,点击生成授权码保存下来。

https://i-blog.csdnimg.cn/direct/e49a19dabe704841b09cdef732e68a66.png

到【系统管理】->【系统配置】配置我们的邮箱信息,共有3个地方需要填写

https://i-blog.csdnimg.cn/direct/5a775242aab74635bcbde0be859b6acf.png

https://i-blog.csdnimg.cn/direct/58f0ff4b5f9144d282f34160b8744627.png

https://i-blog.csdnimg.cn/direct/63e36662b28a4ed6a4d768aa07acfe25.png

https://i-blog.csdnimg.cn/direct/2d7eb77ccfba4a4694e6a8e0eee3200a.png

https://i-blog.csdnimg.cn/direct/c7b1eef9af114b8d819f611e50311ce1.png

需要填写的信息

SMTP服务器:	smtp.qq.com
用户默认邮件后缀	@qq.com
勾选使用SSL协议
SMTP端口 465

邮箱整合项目

首先呢先在具体任务的【构建后操作】去配置

https://i-blog.csdnimg.cn/direct/92d1f7a9e6d64993a1fdd777b0d9404a.png

https://i-blog.csdnimg.cn/direct/d3bbb7d357c241c4b879ffe7e9954585.png

https://i-blog.csdnimg.cn/direct/a9394f2da99f4c4a82bfe710ee06a955.png

构建模板

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
    <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sansserif">
        <tr>
            <td>(本邮件是程序自动下发的请勿回复)</td>
        </tr>
        <tr>
            <td>
                <h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2>
            </td>
        </tr>
        <tr>
            <td><br />
                <b><font color="#0B610B">构建信息</font></b>
                <hr size="2" width="100%" align="center" />
            </td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称&nbsp;&nbsp;${PROJECT_NAME}</li>
                    <li>构建编号&nbsp;&nbsp;第${BUILD_NUMBER}次构建</li>
                    <li>Git版本&nbsp;&nbsp;${GIT_REVISION}</li>
                    <li>触发原因&nbsp;${CAUSE}</li>
                    <li>构建日志&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>构建&nbsp;&nbsp;Url&nbsp;&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目录&nbsp;&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>项目&nbsp;&nbsp;Url&nbsp;&nbsp;<a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><br />
                <b><font color="#0B610B">构建之后的变化</font></b>
                <hr size="2" width="100%" align="center" />
            </td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true,format="Changes for Build #%n\n%c\n",showPaths=true,changesFormat="%a%m",pathFormat="\\t%p\\n"}
            </td>
        </tr>
        <tr>
            <td>
                <br />
                <b><font color="#0B610B">失败的测试结果</font></b></b>
                <hr size="2" width="100%" align="center" />
            </td>
        </tr>
        <tr>
            <td><pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica,
                    sans-serif">${FAILED_TESTS}</pre>
                <br /></td>
        </tr>
        <tr>
            <td><br />
                <b><font color="#0B610B">构建日志</font></b>
                <hr size="2" width="100%" align="center" />
            </td>
        </tr>
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG}</textarea>
            </td>
        </tr>
    </table>
</body>

</html>

修改【系统配置】中默认的邮箱设置可以达到复用效果

https://i-blog.csdnimg.cn/direct/e4a7b77d51c84d27a7480d0881b31417.png

Jenkins的所有数据文件都存在文件中,Jenkins备份就是备份JENKINS_HOME目录。其中 workspace, builds 和 fingerprints目录是不需要备份的。

https://i-blog.csdnimg.cn/direct/b4dee0ba26814132aa2d7f48e301029d.png

安装插件,在【系统管理】下方有【thinbackup】选项

https://i-blog.csdnimg.cn/direct/1ad584b1a7f34a059adbe59881c530e3.png

内容从至下为备份、恢复、设置。需要设置的地方:

https://i-blog.csdnimg.cn/direct/8e6be21256a14111b9a623c6f444d591.png

设定完成后点击save,保存,回到上一界面点击Backup Now。需要的时候点击还原备份,点击restore

部署web前端项目

传统web项目 : 新建我们的任务,步骤和上面介绍的一样,这里不再重复。然后把html文件拷贝到目标服务器

https://i-blog.csdnimg.cn/direct/60e5a0686d474519b04b82f93c36440d.png

https://i-blog.csdnimg.cn/direct/4adec70c9ae645e6b5d494a9c97f8a57.png

开启Nginx或者Tomcat服务,就可以运行了

部署Vue项目

需安装插件,所有用到的插件上面已经介绍过了

然后在【全局工具配置】配置node版本

https://i-blog.csdnimg.cn/direct/6c788760aae24c298ae1dad693c30b13.png

接下来也需要配置SSH连接远程服务器, 配置完毕后,开始新建我们的任务,同样上面也介绍了怎样配置服务器和新建任务的步骤,这里不再重复

https://i-blog.csdnimg.cn/direct/3cfe44a96497427887f40e586bbf7458.png

https://i-blog.csdnimg.cn/direct/0a82b87113924bf18871cf9be9a69eab.png

cd /var/jenkins_home/workspace/文件目录  #进入test项目目录
npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
npm install
npm run build
cd dist
rm -rf 文件名.tar.gz #删除上次打包生成的压缩文件
tar -zcvf 文件名.tar.gz * #把生成的项目打包成test方便传输到远程服务器
cd ../

最后一步,把文件发到远程服务器上,在【构建】或者【构建后操作】选择【send * over ssh】(因为效果是一样的,二者都可以),类似于部署传统web项目

https://i-blog.csdnimg.cn/direct/6473d3234819424b9e887b1580e24943.png

SSH相关配置

dist/*.tar.gz
dist
usr/local/nginx/html/

## shell脚本
cd /usr/local/nginx/html   # 打开目标文件地址
rm -rf 文件夹名    # 删除包含目标文件的文件夹
mkdir 文件夹名 # 新建同名文件夹
tar -zxvf 文件名.tar.gz -C 文件夹名/   # 解压文件到这个文件夹的目录下
rm -rf 文件名.tar.gz  # 删除压缩文件

部署SpringBoot项目 : 因为是java项目,所以我们首先要配置java环境,且用maven打包还要配置maven环境,当然你用其他的打包也可以

安装JDK

点击【系统管理】-> 【全局工具配置】即可进入配置面板

https://i-blog.csdnimg.cn/direct/15837336217e41ddbbfe0ea5d0f937e9.png

新增Maven

https://i-blog.csdnimg.cn/direct/1ab8022968684094be0d0aec3a90435c.png

修改maven镜像源,改成阿里云镜像

<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

完成后点击保存即可,这样我们的jdk与maven就构建完成

部署服务

设置maven相关配置,然后保存

https://i-blog.csdnimg.cn/direct/2776753d71db466f9b9d2d62a137c213.png

需要输入的命令

clean package
pom.xml

增加shell命令,自动部署运行

https://i-blog.csdnimg.cn/direct/bd2a34002e614b398840e2de44d132bc.png

填入命令 注意这分为直接运行jar包与运行Docker容器运行两种类型,分别说明一下

jar包运行方式的脚本

sudo fuser -k -n tcp 项目端口号
cd 生成的jar包目录
nohup java -jar 文件名 > 日志目录文件地址 &

https://i-blog.csdnimg.cn/direct/42c401cda92f4dbeb744ed4b68190015.png

Docker容器运行的脚本

使用Docker运行首先需要制作Docker容器,在项目根目录编写Dockerfile文件,然后上传到代码仓库

#FROM openjdk:8-jdk-alpine
FROM hub.c.163.com/dwyane/openjdk:8
MAINTAINER qinadu<邮箱地址>
EXPOSE 8080   # 对外暴露的端口
CMD ["--server.port:8080"]  # 映射端口
CMD echo "---Docker容器环境配置成功,即将运行---"
copy *.jar /app.jar  
ENTRYPOINT ["java","-jar","/app.jar"]
CMD echo "---服务开启成功,访问端口:8080---"

https://i-blog.csdnimg.cn/direct/22bebdb826a04eada446e1417c80e93c.png

clean install -Dmaven.test.skip=true

最后在构建项目中执行shell脚本,保存

https://i-blog.csdnimg.cn/direct/684cfb6d241f4a8e8e8aac42725e6be9.png

mvn docker:build -t 镜像别名
echo "当前docker 镜像:"
docker images | grep 镜像别名
echo "启动容器----->"
docker run -d -p --name 容器名  镜像别名
echo "启动服务成功!"

然后开始构建我们的项目,返回上一步,进入如下页面开始构建 (Build with Parameters)

改造shell脚本,如果下次构建该项目的时候,docker镜像和服务已存在,需要先删除镜像和服务

# 先删除之前的容器
echo "移除之前的容器>>>"
docker ps -a | grep 容器名 | awk '{print $1}'| xargs docker rm -f
# 删除之前的镜像
echo "移除之前的镜像>>>"
docker rmi 镜像别名
# 构建镜像
mvn docker:build -t 镜像别名
# 打印当前镜像
echo "当前镜像>>>"
docker images | grep 镜像别名
# 启动容器
echo "容器启动中>>>"
docker run -d -p --name 容器名  镜像别名
# 打印当前容器
echo "当前容器>>>"
docker images | grep 容器名
echo "启动服务成功!"

配置镜像容器服务

创建镜像仓库

https://i-blog.csdnimg.cn/direct/518d3d089a9a41cbbc442a72e5ed8d9b.png

https://i-blog.csdnimg.cn/direct/57bdae422f5b4c7a86a0d771660d3df0.png

https://i-blog.csdnimg.cn/direct/737fa97e455040cb84c9325b7c3493f7.png

使用jenkins构建

https://i-blog.csdnimg.cn/direct/eb4cd7d12831438eb912d7e1049e5e30.png

IMAGE_NAME='registry.cn-beijing.aliyuncs.com/{命名空间}/{仓库名称}:web-demo-0.0.1-SNAPSHOT'
echo IMAGE_NAME=$IMAGE_NAME
echo '================当前docker版本=============='
echo `docker -v`
 
echo '================开始创建镜像================'
docker build -t $IMAGE_NAME .
 
echo '================开始推送镜像================'
docker login --username={阿里云Registry登录名} --password={阿里云Registry登录密码} registry.cn-beijing.aliyuncs.com 
docker push $IMAGE_NAME
echo '====================OK!================'

提取镜像

IMAGE_NAME='registry.cn-beijing.aliyuncs.com/{命名空间}/{仓库名称}:web-demo-0.0.1-SNAPSHOT'
docker pull $IMAGE_NAME
echo '====================OK!================'