使用Jenkins从gitlab拉取代码部署以及gitlab更新代码后自动构建

1,122 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


使用Jenkins从gitlab上拉取代码,使用ssh。

  • 创建Jenkins服务器的SSH密钥对;
  • 为相应的Gitlab用户添加密钥对的公钥,相当于Jenkins拉取代码时,使用的是该Gitlab用户,拥有其相应的代码克隆权限;
  • Jenkins添加密钥对的私钥,实现基于key的连接;
  • 将Gitlab项目的SSH克隆地址配置到相应的Jenkins任务中,在构建时将代码拉取到Jenkins服务器的相应目录,为接下来的测试、部署等操作做好准备。

首先进入Jenkins 容器中

docker exec -it jenkins bash
# 使用 -m PEM ,后面Jenkins使用插件Publish over SSH 不会报错
ssh-keygen -m PEM -t rsa -b 4096
cd ~/.ssh
cat id_rsa.pub
cat id_rsa

将 id_rsa.pub 复制到gitlab中 在这里插入图片描述 将 id_rsa 私钥添加到 Jenkins全局凭证中 在这里插入图片描述 在这里插入图片描述

测试

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 保存

在这里插入图片描述 这时已经将代码成功拉取到jenkins本地了,这样就可以做后续的编译部署操作等等。 在这里插入图片描述 但是如果拉取代码失败! 如下: 在这里插入图片描述 在Jenkins容器中输入:

git  ls-remote -h git@192.168.150.128:xiuyuandashen/hello_world.git HEAD

在这里插入图片描述测试拉取代码 在这里插入图片描述

在这里插入图片描述

实在不行的话,在.ssh目录下添加config User 为gitlab用户名称,Host gitlab的ip IDentityFile 为私钥地址 在这里插入图片描述

部署

这时代码已经在jenkins的工作目录下了,我们需要将其编译打包发布到其他服务器上。 首先我们要解决jenkins免密ssh登录部署服务器的问题。 假设我们在 192.168.150.128这台服务器上部署项目。

将Jenkins这台机子的公钥,拷贝到部署服务器上
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.150.128

然后我们需要将私钥放在Jenkins上,这样Jenkins才能访问控制部署服务器。

在Jenkins中安装 插件Publish over SSH

在这里插入图片描述

安装后,去系统管理=》系统配置中配置它 在这里插入图片描述 在这里插入图片描述 测试一下是否联通 在这里插入图片描述

进入项目的配置 在这里插入图片描述 执行 shell

echo '当前 WORKSPACE 工作目录'
pwd
#'在构建时,默认会直接切换到 workspace 目录,所以可以直接将当前目录中的内容复制给被部署的服务器
# 使用maven 打包
/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/Maven3.8.5/bin/mvn  clean package
# 将打包后的文件拷贝到部署服务器
scp -r ./target/*.jar  root@192.168.150.128:/data/

#echo '登录'
echo '部署'
# 打包运行

下面就是在远程服务器上运行打包后的jar包

在这里插入图片描述

在这里插入图片描述

这个build.sh 脚本是在部署服务器上的

#!/bin/bash
mv /data/*.jar /data/app.jar
echo '部署'
java -jar /data/app.jar --server.port=9099 &

配置完这些后,进行保存。进行构建

在这里插入图片描述

在这里插入图片描述

部署成功! 在这里插入图片描述

构建触发器,当gitlab代码改变后自动部署

首先需要下载 gitlab 插件,下载后就可以在构建触发器看到下面的选项。 在项目设置中构建触发器,这边我们默认 push时进行触发构建。 在这里插入图片描述 在这里插入图片描述 然后去gitlab进行设置

在这里插入图片描述

当报 Urlis blocked: Requests to localhost are not allowed错误时,去下面这边设置即可 在这里插入图片描述 在这里插入图片描述 测试 在这里插入图片描述 在这里插入图片描述

在部署项目时删除原来的文件以及原有的进程再部署

在这里插入图片描述

# 用 && 连接起来,这样不会出现实际上项目已经部署成功,但是Jenkins的构建不会结束的问题,最终会导致构建超时
# NR==1 表示第一行 $2 表示第二列就是 pid

echo '删除原来的文件' && rm -rf *.jar && kill -9  `ps -ef|grep app |awk 'NR==1{print $2}'` && sh /data/build.sh