1、Docker镜像拉取 Jenkins 环境命令
docker pull jenkins/jenkins:lts
查看下拉取的镜像
docker images
2、通过容器编排方式构建 Jenkins 容器
创建对应目录
# 创建对应目录
mkdir -p /data/jenkins/jenkins_home/
chown -R 1000:1000 /data/jenkins/jenkins_home/
+ data
- docker-compose.yml // docker-compose执行文件
+ /data/jenkins
- jenkins_home // Jenkins挂载卷
docker-compose.yml文件配置
version: "3"
services:
jenkins:
user: root
restart: "always"
image: jenkins/jenkins:lts
container_name: jenkins
privileged: true
ports:
- 8080:8080
- 50000:50000
environment:
JAVA_OPTS: -Duser.timezone=Asia/Shanghai
volumes:
- /data/jenkins/jenkins\_home/:/var/jenkins\_home
- /data/jenkins/workspace/:/root/.jenkins/workspace \
- /usr/local/apache-maven-3.6.0:/usr/local/maven
- /usr/local/maven/maven-3.6.0/repository:/usr/local/maven/repository
- /usr/local/jdk1.8.0_211:/usr/local/jdk
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/localtime:/etc/localtime
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
- /usr/lib/x86\_64-linux-gnu/libltdl.so.7:/usr/lib/x86\_64-linux-gnu/libltdl.so.7
- /root/.ssh:/root/.ssh # (可选)免密配置时,公钥可以直接在本地配置
3、启动容器环境
需要进入 compose 目录下面输入以下命令,进行环境的启动
docker-compose up -d
4、docker-compose 其它操作
镜像内容器进行操作后可以保存成新的镜像,比如容器内安装了jdk、配置了环境变量可以保存为新的镜像
# 找出当前运行的容器ID
docker ps
# 根据containerId,创建新镜像
docker commit 5d81d56b18b6 jenkins/jenkins:centos.v1
修改 docker-compose 可以对创建的容器根据新镜像进行修改
version: "3"
services:
jenkins:
user: root
image: jenkins/jenkins:lts
ports:
- 8080:8080
- 50000:50000
restart: "always"
container_name: jenkins
environment:
JAVA_OPTS: -Duser.timezone=Asia/Shanghai
#比如新增环境变量
java_home = xxx 仅做举例
volumes:
- /home/jenkins/jenkins\_home/:/var/jenkins\_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
privileged: true
删除之前的容器
docker-compose down
重启成新的容器
docker-compose up -d
5、配置 Jenkins
前提,Jenkins 部署应用到远程服务器上,必须要实现 Jenkins 服务器免密登录到远程服务器上,同时远程服务器也要免密登录到 Jenkins 服务器上拷贝对应的jar包。所以,配置 Jenkins 前保证两台服务器互相免密登录。这块配置,可以查看我之前写的文字 [ Linux系统两台机器互免密登录 ],很简单。
5.1首先配置 ssh 插件
1、安装 ssh 相关的插件,直接在插件中心搜索 ssh 然后按装如下两个插件
①插件,主要用于链接远程服务器全局配置(公共配置);
②插件,主要用于链接远程服务器传文件配置,在项目里配置。
2、全局配置 Publish over SSH,系统管理->系统配置,下拉找到即可
第1个标注的地方,如果生成私钥的时候,没设置密码,不用填写任何内容留空即可;
第2个标注的地方,远程服务器的别名,随意起;
第3个标注的地方,远程服务器的地址;
第4个标注的地方,远程服务器的账号名称(登录名);
第5个标注的地方,远程服务器上要放置应用的目录,这里需要注意,后期项目配置的时候填写的目录跟这个是拼接的。
第6个标注的地方,点击高级后,展开下面的填入项。
第1个标注的地方,远程服务器的密码
第2个标注的地方,远程服务器的私钥。
3、项目(job)配置 ssh 插件相关的内容-前端VUE
新建一个job,输入名称,选择流水线项目,点击确定。
这里只演示,构建这个步骤的配置,其它配置很简单,自己网上一搜就可以。
上面的截图①,对应截图下面①、②两个步骤。
构建配置第一步,Jenkins 打包项目前端应用:
上图第1个标注地方,shell脚本如下。
#!/bin/bash
cd /data/jenkins/jenkins_home/workspace/data/xxx-all/xxx-admin
#这个目录也可写成如下这样,不同Jenkins版本可能有所不同,相对与打包工程的下一级目录开始。
./dev-xxx
npm install
npm run build
cd dist
tar -cvf dev-xxx.tar *
脚本,
第2行表示,Jenkins 服务期切换目录到 Jenkins 配置的 workspace 目录下的项目工程目录下。
第5、6行,前端应用打包命令。
第7行,切换到 dist 目录,(Jenkins打包前端应用后自动生成这个目录,打包的结果都在这个目录下)
第8行,将 dist 目录下的所有内容打包(*很重要),方便传输到远程服务器(部署服务器)。
构建配置第二步,将打包结果上传到远程服务器;
上面5个配置,逐一解释如下,这里如果配置不好,项目根本无法部署到远程服务器上。
①,远程服务器的名称(别名),前面全局配置的时候已经设置过了,这里下拉选择。
②,打包结果(源文件)的目录地址,即,Jenkins 上打包后产生的内容放置的地方,这个目录很容易填错,会把你搞死。该目录是Jenkins主目录下的工程目录开始的,即工程目录下一级开始填写。
③,删除前缀,要不然你的远程服务器又会创建dist这个目录。
④,远端目录,这里需要注意,我上面配置全局(公共配置)ssh的时候,已经填写了应用部署的远端目录,https://www.yuque.com/u21187464/cf/bo7lzr#GsmxQ 这里的第5个标记,此处是基于全局公共配置的目录的拼接。
⑤,将远程服务器执行的命令,如果是前端VUE项目,就是解压上面打包的项目,脚本如下。
脚本写法一:
# cd /data/xxx-all/xxx-admin/dev-xx.tar
# tar -zxvf dev-xx.tar
脚本写二(理论上面的写法没问题,我验证Jenkins会报错):
tar -xvf /data/xxx-all/xxx-admin/dev-xx.tar -C /data/xxx-all/xxx-admin/
脚本说明,
第一行,切换目录到远程服务器部署应用的目录,
第二行,解压应用包。
这里总结下上面配置的源文件(Sourec files)这个目录,很多坑。
Jenkins 构建后会在其工作空间 workspace 目录下产生对应项目的文件夹(这个文件夹名字是创建项目时命名的项目名,如下图),此时 workspace 目录下就会有api-dev这样的文件夹,
所以,源文件目录里填写的是这个文件夹之后的目录,不要把这个文件夹也填写。
4、项目(job)配置 ssh 插件相关的内容-java-jar包
因为上面讲过了,这里直接截图展示下,
Jenkins 构建后其工作目录产生的 api 项目目录如下。
①标识的地方,意思是先构建运行完成后,再传输jar包到远程服务器,我这里构建指 maven 构建后在传输。
②标识的地方,源文件目录,上面讲过了,api项目名称后面的目录开始填写。
③标识的地方,删除前缀,jar包前面的目录都删除,要不然远程服务器上会创建这个目录。
6、总结
1、Jenkins 编译构建后,需要将应用包(jar包、war包等)部署到远程服务器上,所以,必须保证 Jenkins 服务器和远程服务器互相免密访问,配置上面已经说过了。
2、如果你的 Jenkins 服务器和应用服务器部署在 docker 容器里的话,需要保证两个容器互相免密登录,具体配置跟上面提到的配置一样,只是需要在容器里操作而已。
3、上面 Jenkins 打包配置我举例的是前端 vue 打包的结果,压缩成压缩包和上传部署到远程服务器的过程,如果api部署的话,流程大概一样,只是不需要压缩和解压而已。
读后感
来这里找我交流
-
QQ群:330374464
-
公众号:软件测试资源站(ID:testpu)
-
CSDN:https://blog.csdn.net/mcfnhm
-
语雀:https://www.yuque.com/testpu/pro