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

使用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中
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第1张图片
将 id_rsa 私钥添加到 Jenkins全局凭证中
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第2张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第3张图片

测试

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第4张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第5张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第6张图片
保存

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第7张图片
这时已经将代码成功拉取到jenkins本地了,这样就可以做后续的编译部署操作等等。
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第8张图片
但是如果拉取代码失败!
如下:
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第9张图片
在Jenkins容器中输入:

git  ls-remote -h [email protected]:xiuyuandashen/hello_world.git HEAD

在这里插入图片描述测试拉取代码
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第10张图片

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第11张图片

实在不行的话,在.ssh目录下添加config
User 为gitlab用户名称,Host gitlab的ip
IDentityFile 为私钥地址
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第12张图片

部署

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

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

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

在Jenkins中安装 插件Publish over SSH

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第13张图片

安装后,去系统管理=》系统配置中配置它
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第14张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第15张图片
测试一下是否联通
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第16张图片

进入项目的配置
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第17张图片
执行 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  [email protected]:/data/

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

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

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第18张图片

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第19张图片

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

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

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

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第20张图片

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第21张图片

部署成功!
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第22张图片

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

首先需要下载 gitlab 插件,下载后就可以在构建触发器看到下面的选项。
在项目设置中构建触发器,这边我们默认 push时进行触发构建。
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第23张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第24张图片
然后去gitlab进行设置

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第25张图片

当报 Urlis blocked: Requests to localhost are not allowed错误时,去下面这边设置即可
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第26张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第27张图片
测试
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第28张图片
使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第29张图片

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

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建_第30张图片

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

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

你可能感兴趣的:(docker,运维开发)