起因:入职后公司需要的技能,全部项目都使用的Jenkins+Docker部署
Jenkins详细教程:知乎大佬写的文章
Docker详细教程:一个大佬的博客
SVN使用教程:一个大佬的博客
深入了解Jenkins、Docker、SVN,去上面三个大佬的文章里看,我只总结使用步骤:
部署需求:父子依赖关系的SpringBoot项目,子系统依赖父工程中的内容,要求部署子系统,父子系统均放在SVN同级目录中(下图所示)
一. Jenkins新建任务:
- 进入Jenkins主界面,选择一个视图(如果没有视图新建一个视图,视图包含多个任务,建立视图的过程很简单,可无脑操作 不多说),点击左侧的 ”新建任务‘
- 选择"流水线",填写任务的名称,可随意,最好是能区分项目是干什么的,填完后往下滑,还有很多要填的,不说的内容即默认无需修改。
第2步有需要注意的地方,就是这个SVN的路径,不可以只写一个子工程的路径,需要其上级路径,也就是同时包含父子工程的那层路径。 - 翻到 “流水线” 这一步,首先选择使用 Pipeline script from SCM 类型的脚本,下面选择 Subversion 作为代码拉取的平台类型,即SVN。下面填写项目的SVN路径,以及拉取代码所使用的 SVN的账户,没有就添加一个,都是无脑选项 不多说。
- 接着往下翻,这里自定义脚本所在的路径,待会儿新建一个名字叫 Jenkinsfile 的文件放在这个目录下,这个Jenkinsfile就是脚本。
第4条这里,脚本路径是相对于SVN拉取代码的路径而言的相对路径。举个例子,比如说,我代码拉取的SVN路径是 http://192.168.110.56/scm/ADMIN-BACK,ADMIN-BACK 是项目的根路径,ADMIN-BACK 内有两个父子依赖关系的项目 xxx-base 和 xxx-scm,并且是同级路径,(上面 项目结构带文件夹的那个图所示的结构),现在我在子工程 xxx-scm 下面新建个文件夹,叫 nmsl,nmsl文件夹下面我放两个文件,一个叫 Dockerfile,一个叫 Jenkinsfile,现在那个脚本路径就写成 xxx-scm/nmsl/Jenkinsfile - 下面就是 去编写脚本文件 Jenkinsfile 和 Dockerfile
---- Jenkinsfile // 这句就不用写上了
pipeline {
agent none
environment {
VERSION = 'V1.0.0'
}
stages {
stage('build') {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
steps {
sh 'cd xxx-base; mvn clean install'
sh 'cd xxx-scm; mvn clean package -U'
}
}
stage('docker') {
agent any
steps {
sh 'cd xxx-scm; docker build -f xxx-scm/Dockerfile -t reg.xxx.com/dev/xxx-scm:${SVN_REVISION} xxx-scm-system/target'
sh 'docker push reg.xxx.com/dev/xxx-scm:${SVN_REVISION}'
}
}
}
}
主要解释下面两句,上面两句比较死:
sh 'cd xxx-scm; docker build -f xxx-scm/Dockerfile -t reg.xxx.com/dev/xxx-scm:${SVN_REVISION} xxx-scm-system/target'
这句说的是,切换到子工程所在的路径,然后在子工程的 xxx-scm-system/target 目录下,根据Dockerfile构建一个容器,并取名为 reg.xxx.com/dev/xxx-scm,并设置tag为${SVN_REVISION},这里的 xxx-scm-system 即为项目启动类所在的模块,子工程打包后的jar包存放路径即为 xxx-scm-system/target。
sh 'docker push reg.xxx.com/dev/xxx-scm:${SVN_REVISION}'
这句是,推送镜像到远程仓库,远程仓库可能是自己公司搭建的
---- Dockerfile // 这句就不用写上了
FROM reg.xxx.com/dev/xxx-jre:8.1
WORKDIR /xxx
VOLUME /xxx-log
COPY xxx-scm-system-*-SNAPSHOT.jar xxx-scm.jar
EXPOSE 8877
ENTRYPOINT java $JAVA_OPTS -jar xxx-scm.jar
6. 把Dockerfile和Jenkinsfile上传到SVN路径下,进入Jenkins,点击“立即构建”打包项目并上传到远程仓库。绿了就对了,没绿就是错。
7. 下载镜像:打包完成后,鼠标放到 docker列上,选择 logs,选择上方的最后一行。
这里是点击进入后的界面,复制镜像名,下图所示
登录装有Docker镜像的服务器,把镜像拉取下来:执行docker pull reg.xxx.com/dev/xxx-scm:45469
,查看拉取状况 docker images
如果要下载镜像到windows,可以这样,执行 docker save -o xxx-scm:45469.tar reg.xxx.com/dev/xxx-scm:45469
,将镜像保存到了当前目录下,然后使用ftp工具down到window就行了
8. 运行容器,docker run -p 8877:8877 -v /root/SCM/config:/xxx/config -v /opt:/opt -d --name xxx-scm reg.xxx.com/dev/xxx-scm:45469
这句是说,映射容器的8877端口到物理机的8877端口,将容器的 /xxx/config 路径挂载到物理机的 /root/SCM/config 路径,将容器的 /opt 挂载到物理机的 /opt 路径,-d 表示以守护进程的模式运行容器,容器的名字叫 xxx-scm,建立容器 使用的镜像是 reg.xxx.com/dev/xxx-scm:45469。至于挂载哪个容器哪个目录,这里有句话要说,在 Dockerfile里有个配置项,叫WORKDIR /xxx
,这里的 /xxx,就是下图的 /xxx。