关于Jenkins以及相关插件的安装,看之前的文章:https://www.jianshu.com/p/173e109449ff
【本文内容】
- 本地先创建一个可用的项目(只有1、2个可用的REST APIs即可)。
- 把本地source code通过git push到远程git仓库(可以是gitlab,gitee或github)。
- 使用Jenkins从远程git仓库拉取source code,并通过mvn package进行构建:SpringBootDockerTest.jar。
- Jenkins构建好的项目通过插件Publish over SSH,将SpringBootDockerTest.jar推送至目标服务器。
- 编写Dockerfile, shell脚本在远程服务器上build docker image并run。
1. 本地准备一个项目
我准备了一个简单的Spring Boot项目,复用了之前文章【Docker学习】布署Spring Boot项目到docker中用过的demo项目:
本地先测试下有没有问题,使用curl连接8081端口的hello api,能成功返回:
curl http://localhost:8081/hello
2. 把代码提交到git上去
有多种git仓库可供选择:gitlab、gitee或github。确保本地已经安装git。
这里需要做的步骤大致有:
2.1 在本地先创建证书
可参考https://blog.csdn.net/alexliu0725/article/details/111240786
创建好的证书在用户home目录/.ssh下:
2.2 把id_rsa.pub复制到git仓库的ssh中
一般是点击个人头像旁边的下拉框,有个【Settings】,一般会有功能类似:【SSH and GPG keys】--> New SSH Key:
**2.3 **本地项目需要git init
可参考:https://blog.csdn.net/m0_55788506/article/details/120035706
在#1的项目地址下:
git init
然后需要建立连接:
在选程git仓库中建立repositores,并复制ssh地址:
在本地:
git remote add origin [email protected]:xx/xxxxxxx.git
2.4 提交代码到git仓库中
使用命令git add, git commit, git push,把代码提交到远程git仓库。
注,也可使用IDEA的插件Git integration来管理git:
git push后,远程仓库中就会有代码了:
3. 在Jenkins上新建项目并配置git远程仓库
3.1 左侧:【新建Item】:
输入一个名称,点击【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地址,然后选择【添加】:
点击【添加】后再选择类型为【SSH Username with private key】,把本地~/.ssh中的id_rsa私钥拷贝进去即可。
4. 开始Build,并验证能成功拉取源代码
在配置好Jenkins项目后,左侧点击【开始构建】:
点击具体的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远程仓库拉取的代码:
至此,我们已经完成了:从本地push代码到git仓库 --> Jenkins再从git仓库中拉取代码到它的workspace中了。
接下来要做的事情是Jenkins需要把source code打包成一个jar
5. Jenkins中添加打包行为并build
5.1 在项目的左侧,点击【配置】,进入项目配置页面,往下拉来到构建tab,【增加构建步骤】,选择:【调用顶层Maven目标】,如果是全英文版本,应该叫:Invoke top-level Maven targets:
选择maven版本,就是我们之前复制进去的maven。
目标,是maven的打包命令,-DskipTests表示跳过测试,也可不写(即不跳过测试)。
5.2 再次运行build,来验证是否成功使用maven进行打包
查看日志,发现已经build成功:
在jenkins workspace目录下查看,项目的target下已经有了打包好的jar:
6. 通过Jenkins把jar推送到目标服务器并使用docker run
6.1 通过publish over ssh把jar从jenkins中push到目标服务器上
在项目详情左侧点击【配置】,有个tab叫【构建后操作】:
下拉框中选择【Send build artifacts over SSH】:
SSH Server在之前的文章中已经创建,在这边选择下即可,Source files只选择target目录下的以jar为后缀的文件:
看下publish ssh over的配置:配置的目标机器是本机,目录是docker下的test目录:
【build验证下先】,可以看到在maven build成功后,立马进行publish over ssh的步骤了:
验证下/docker下的test目录中已经有了从jenkins push过来的jar:
6.2 编写Dockerfile文件
本章内容:
- 通过Dockerfile文件定义docker image。
- 通过run_docker.sh文件构建docker image以及run docker image。
6.2.1在项目中新建Dockerfile文件:
注:在ide中可以下载插件,它可以帮助识别dockerfile文件:
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仓库
6.3 重新配置SSH Publishers
追加把/docker目录也一并推送到远程服务器并编写Execute command命令:
命令主要是运行run_docker.sh。
【重新run jenkins项目】
注:如果遇到publish over ssh错误,在log中却没有具体的错误信息,可以尝试先把console打开:
点击【高级】,勾上【Verbose output in console】:
可以看到build成功了:
docker ps
【测试】通过jenkins布署jar到本地,docker启动成功: