使用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 表示第二列就是 pidecho '删除原来的文件' && rm -rf *.jar && kill -9 `ps -ef|grep app |awk 'NR==1{print $2}'` && sh /data/build.sh