【DevOps相关】通过Jenkins从git上拉取并push到远程服务器

关于Jenkins以及相关插件的安装,看之前的文章:https://www.jianshu.com/p/173e109449ff


【本文内容】

  1. 本地先创建一个可用的项目(只有1、2个可用的REST APIs即可)。
  2. 把本地source code通过git push到远程git仓库(可以是gitlab,gitee或github)。
  3. 使用Jenkins从远程git仓库拉取source code,并通过mvn package进行构建:SpringBootDockerTest.jar。
  4. Jenkins构建好的项目通过插件Publish over SSH,将SpringBootDockerTest.jar推送至目标服务器。
  5. 编写Dockerfile, shell脚本在远程服务器上build docker image并run。

1. 本地准备一个项目

我准备了一个简单的Spring Boot项目,复用了之前文章【Docker学习】布署Spring Boot项目到docker中用过的demo项目:

image.png

本地先测试下有没有问题,使用curl连接8081端口的hello api,能成功返回:

curl http://localhost:8081/hello

api works

2. 把代码提交到git上去

有多种git仓库可供选择:gitlab、gitee或github。确保本地已经安装git。

这里需要做的步骤大致有:
2.1 在本地先创建证书
可参考https://blog.csdn.net/alexliu0725/article/details/111240786
创建好的证书在用户home目录/.ssh下:

image.png

2.2 把id_rsa.pub复制到git仓库的ssh中
一般是点击个人头像旁边的下拉框,有个【Settings】,一般会有功能类似:【SSH and GPG keys】--> New SSH Key:

image.png

**2.3 **本地项目需要git init
可参考:https://blog.csdn.net/m0_55788506/article/details/120035706
在#1的项目地址下:

git init

然后需要建立连接:
在选程git仓库中建立repositores,并复制ssh地址:


image.png

在本地:

git remote add origin [email protected]:xx/xxxxxxx.git

2.4 提交代码到git仓库中
使用命令git add, git commit, git push,把代码提交到远程git仓库。
注,也可使用IDEA的插件Git integration来管理git:

image.png

git push后,远程仓库中就会有代码了:

image.png

3. 在Jenkins上新建项目并配置git远程仓库

3.1 左侧:【新建Item】:

image.png

输入一个名称,点击【Freestyle project】,确定。

什么是Freestyle project?参考:https://www.guru99.com/create-builds-jenkins-freestyle-project.html
Freestyle project允许创建可重复执行的job, script脚本或是pipeline,包含一系列的steps和actions。

3.2 在Jenkins上配置git远程仓库地址
【源码管理】,选择Git,在Repository URL中填入SSH地址,然后选择【添加】:

image.png

点击【添加】后再选择类型为【SSH Username with private key】,把本地~/.ssh中的id_rsa私钥拷贝进去即可。


image.png

4. 开始Build,并验证能成功拉取源代码

在配置好Jenkins项目后,左侧点击【开始构建】:

image.png

点击具体的build history后,可以通过【控制台输出】查看日志。
可以看到从远程开始init, fetch等操作:

Cloning the remote Git repository
...
First time build. Skipping changelog.
Finished: SUCCESS

也可进入Jenkins目录查看:

docker exec -it jenkins bash

进入jenkins的bash后,再跳到目录:/var/jenkins_home,在这个下面有个目录叫:workspace,在这个里面就是Jenkins从git远程仓库拉取的代码:

image.png

至此,我们已经完成了:从本地push代码到git仓库 --> Jenkins再从git仓库中拉取代码到它的workspace中了。
接下来要做的事情是Jenkins需要把source code打包成一个jar

5. Jenkins中添加打包行为并build

5.1 在项目的左侧,点击【配置】,进入项目配置页面,往下拉来到构建tab,【增加构建步骤】,选择:【调用顶层Maven目标】,如果是全英文版本,应该叫:Invoke top-level Maven targets:

image.png

选择maven版本,就是我们之前复制进去的maven。
目标,是maven的打包命令,-DskipTests表示跳过测试,也可不写(即不跳过测试)。

image.png

5.2 再次运行build,来验证是否成功使用maven进行打包
查看日志,发现已经build成功:

image.png

在jenkins workspace目录下查看,项目的target下已经有了打包好的jar:

image.png

6. 通过Jenkins把jar推送到目标服务器并使用docker run

6.1 通过publish over ssh把jar从jenkins中push到目标服务器上

在项目详情左侧点击【配置】,有个tab叫【构建后操作】:

image.png

下拉框中选择【Send build artifacts over SSH】:

image.png

SSH Server在之前的文章中已经创建,在这边选择下即可,Source files只选择target目录下的以jar为后缀的文件:

image.png

看下publish ssh over的配置:配置的目标机器是本机,目录是docker下的test目录:

image.png

【build验证下先】,可以看到在maven build成功后,立马进行publish over ssh的步骤了:

image.png

验证下/docker下的test目录中已经有了从jenkins push过来的jar:

image.png

6.2 编写Dockerfile文件
本章内容:

  • 通过Dockerfile文件定义docker image。
  • 通过run_docker.sh文件构建docker image以及run docker image。

6.2.1在项目中新建Dockerfile文件:

image.png

注:在ide中可以下载插件,它可以帮助识别dockerfile文件:

image.png

Dockerfile内容:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=SpringBootDockerTest.jar
COPY ${JAR_FILE} jenkinsTest.jar
ENTRYPOINT ["java", "-jar", "jenkinsTest.jar"]

6.2.2 run_docker.sh内容:
注:后面才发现,这个docker tag jenkens-test拼错了,应该是jenkins-test。

mv ../target/*.jar ./
/usr/local/bin/docker rm $(docker stop $(docker ps -aq --filter="ancestor=jenkens-test"))
/usr/local/bin/docker build -t jenkens-test .
/usr/local/bin/docker run -d -p 8081:8081 -t jenkens-test

6.2.3 把docker目录推送到远程git仓库

image.png

6.3 重新配置SSH Publishers
追加把/docker目录也一并推送到远程服务器并编写Execute command命令:

image.png

命令主要是运行run_docker.sh。

【重新run jenkins项目】
注:如果遇到publish over ssh错误,在log中却没有具体的错误信息,可以尝试先把console打开:
点击【高级】,勾上【Verbose output in console】:


image.png
image.png

可以看到build成功了:

image.png

docker ps

image.png

【测试】通过jenkins布署jar到本地,docker启动成功:

image.png

你可能感兴趣的:(【DevOps相关】通过Jenkins从git上拉取并push到远程服务器)