配置docker cd
1.1 什么是cd
cd 持续交付 ,持续部署
持续交付 : 将代码交付给专业的测试团队进行测试
持续部署 :将测试通过的代码,部署到生产环境
![](https://raw.githubusercontent.com/hanbeikai/my_pic_repository/master/image_repository/20200905092653.png)
1.2 安装jenkins
1.2.1 jenkins 的作用
在整个自动化集成中,jenkins的作用是拉取gitlab中的代码,打包好发送到目标服务器上
我们提交代码 -> gitlab -> jenkins 拉取、编译、打包 -> 发送到目标服务器
1.2.2 使用docker-compose 安装
1.2.3 创建目录
# 目录的结构是
mkdir /usr/local/jenkins
mkdir /usr/local/jenkins/jenkins01
mkdir /usr/local/jenkins/jenkins01/data
# 给data文件赋予权限
chmod 777 data
jenkins01/
├── data
└── docker-compose.yml
1.2.4 创建docker-compose.yml文件
# 创建docker-compose.yml文件
vi docker-compose.yml
version:"3.1"
services:
jenkins:
image: jenkins/jenkins
restart: always
container_name: jenkins
ports:
- 8888:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home
# 验证是否启动成功
docker-compose logs -f
# 出现以下,说明启动成功
jenkins | *************************************************************
jenkins | *************************************************************
jenkins | *************************************************************
jenkins |
jenkins | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins | Please use the following password to proceed to installation:
jenkins |
jenkins | 3b01bc3108********5dcc7069335
jenkins |
jenkins | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins |
jenkins | *************************************************************
jenkins | *************************************************************
jenkins | *************************************************************
1.2.5 在浏览器输入地址,172.16.195.134:8888
1.2.6 首次登录,会提示输入管理员密码,就是上面这个打印的值 3b01bc3108********5dcc7069335
1.2.7 选择插件安装,我们点击选择插件安装
1.2.8 选择安装两个软件,Git Parameter和 Publish Over SSH
1.2.9 安装的过程很慢,这个是正常现象
1.2.10 安装完成后,开始创建账户信息,我自己设置的都是root
1.2.11 设置ip,默认就是当前网页的ip:端口,然后点击完成,就安装完成了
1.3 jenkins的使用
1.3.1 配置jenkins指定目标服务器
进入jenkins页面,点击左侧的manage jenkins -> 系统设置 -> Publish over SSH -> 点击新增 -> 分别录入 name【用于区分不同服务的名字】 、hostname【服务器ip】、username【账户】、Remote Directory【服务器上指定路径,例如:我们这里设置为/usr/local/jenkins/workspaces/jenkins01_workspaces,这个路径在服务器上必须存在的,否则会报错】
然后点击高级,勾选 Use password authentication, or use a different key -> Passphrase / Password 输入服务器密码 -> port 设置端口号,默认是22(由于我们之前设置的测试服务器端口改成了 60022 ,现在这个地方设置为 60022,否则连不上)
1.3.2 设置gitlab免密码登录
-
进入jenkins容器内部
# 查看所有容器 [root@centOS jenkins01_workspaces]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19fd402acb35 jenkins/jenkins "/sbin/tini -- /usr/…" 8 hours ago Up 8 hours 0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp jenkins # 进入容器内部 [root@centOS jenkins01_workspaces]# docker exec -it 19 bash
-
生成ssh秘钥
# 生成ssh秘钥 邮箱随便写 jenkins@19fd402acb35:/$ ssh-keygen -t rsa -C "XXXX@qq.com" Generating public/private rsa key pair. Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): Created directory '/var/jenkins_home/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /var/jenkins_home/.ssh/id_rsa. Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub. The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxx XXXX@qq.com The key's randomart image is: +---[RSA 2048]----+ | .=B.. E+. | | .+.= + .+ | | B = ..oo | | o * o o... | | . + S o.. | | o *.. + | | . =o*.o | | . +.Oo. | | ..Boo | +----[SHA256]-----+
从日志信息中就可以看出,生成的秘钥放到var/jenkins_home/.ssh/ 目录下,但是由于之前创建jenkins的时候其实指定了 数据卷
volumes: - ./data/:/var/jenkins_home
,所以这个文件实际上在宿主机的/usr/local/jenkins/jenkins01/data/.ssh
,如果在data目录下使用ls
查看,是找不到.ssh
的,因为这是个隐藏文件夹,所以可以使用ls -a
的命令进入到.ssh目录下,打开id_rsa.pub
-
把生成的秘钥配置到gitlab上
进入gitlab页面,选择设置-> ssh,添加一个key
-
jenkins 配置jdk 和 配置maven
-
本地上传jkd和maven上传到jenkins服务器上指定目录上,这里我们上传到
/usr/local/jenkins/jenkins01/data
,因为这个路径是jenkins映射到宿主机目录下的 -
分别解压这两个压缩包到当前目录下
tar -zxvf jdk-8u221-linux-x64.tar.gz tar -zxvf apache-maven-3.6.3-bin.tar.gz
-
到jenkins页面,系统管理 -> 全局工具配置 -> 分别选择jdk安装和maven安装(注意,因为我们已经把jdk和maven上传到服务器上了,所以不用勾选自动安装),
-
设置别名
-
设置安装路径
安装路径的设置要注意不能使用宿主机的地址,而是要使用jenkins容器内部的地址,例如:
jdk在宿主机的路径是 : /usr/local/jenkins/jenkins01/data/jdk1.8.0_221,其实对应的jenkins路径是 /var/jenkins_home/jdk1.8.0_221
mavne在宿主机的路径是: /usr/local/jenkins/jenkins01/data/apache-maven-3.6.3, 对应的jenkins容器路径是
/var/jenkins_home/apache-maven-3.6.3
-
-
最后点击保存即可
-
-
通过jenkins手动拉取gitlab中的项目
-
服务器上第一次拉取项目的时候需要一个手动确认
-
进入jenkins容器内部
# 查看容器 [root@centOS apache-maven-3.6.3]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19fd402acb35 jenkins/jenkins "/sbin/tini -- /usr/…" 10 hours ago Up 10 hours 0.0.0.0:50000->50000/tcp, 0.0.0.0:8888->8080/tcp jenkins # 进入容器内部 [root@centOS apache-maven-3.6.3]# docker exec -it 19 bash jenkins@19fd402acb35:/$ # 进入/var/目录下 jenkins@19fd402acb35:/$ cd /var/ # 拉取代码 注意 这里由于已经设置了ssh无密码连接,所以clone 使用的地址是 gitlab 项目页面下的 ssh 地址,而不是 http 地址 jenkins@19fd402acb35:~$ git clone git@172.16.195.134:root/testci.git Cloning into 'testci'... The authenticity of host '172.16.195.134 (172.16.195.134)' can't be established. ECDSA key fingerprint is SHA256:3fDPexPrQSbb3qL958cWyECJ+XhWcTMBx3NJwUPUa8E. Warning: Permanently added '172.16.195.134' (ECDSA) to the list of known hosts. remote: Counting objects: 87, done. remote: Compressing objects: 100% (39/39), done. remote: Total 87 (delta 42), reused 80 (delta 35) Receiving objects: 100% (87/87), 7.54 KiB | 0 bytes/s, done. Resolving deltas: 100% (42/42), done.
-
拉取成功后就可以删除这个项目了,因为我们的目的就是要第一次拉取的时候的那个手动确认
-
-
-
在jenkins中配置maven任务
在jenkins中配置maven任务,让jenkins从gitlab中拉取代码,并且用maven打成一个war包
-
创建一个maven项目,我们起名testcd(步骤参考创建testci),并推送到gitlab中
-
在jenkins 页面中,创建一个任务
- 首页-创建任务-输入任务名-点击创建一个自由风格的任务,点击确定
- 勾选丢弃旧的构建,并设置保留的最近的任务数,我们设置的是10(不用设置保留的天数)【可配置可不配置】
- 源码管理部分勾选-git ,并设置gitlab中ssh 类型的路径,设置分支(默认是master分支)
- 构建部分,选择 调用顶层maven目标,并选择maven 版本,并设置目标(maven命令),我们使用的是package命令
- 点击保存
-
执行创建的任务,使用jenkins构建一个项目
-
点击进入创建的任务中
-
点击左侧的立即构建,会出现一个带有进度条的窗口,就会开始构建
-
点击进度条,可以跳转到一个页面,点击左侧的控制台输出,可以看到构建的日志信息(第一次构建会很慢,因为要下载一些包)
Downloaded from central: https://repo.maven.apache.org/maven2/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar (431 kB at 10 kB/s) [INFO] Packaging webapp [INFO] Assembling webapp [testcd] in [/var/jenkins_home/workspace/testcd/target/testcd-1.0-SNAPSHOT] [INFO] Processing war project [INFO] Copying webapp resources [/var/jenkins_home/workspace/testcd/src/main/webapp] [INFO] Webapp assembled in [42 msecs] [INFO] Building war: /var/jenkins_home/workspace/testcd/target/testcd-1.0-SNAPSHOT.war [INFO] WEB-INF/web.xml already added, skipping [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 04:11 min [INFO] Finished at: 2020-08-31T02:22:32Z [INFO] ------------------------------------------------------------------------ Finished: SUCCESS
-
从上面的打印信息可以看出,已经构建完成了,并且放到 /var/jenkins_home/workspace目录下,聪明的你想到了什么? 对,数据卷,所以,这个构建好的项目也应该在 我们配置好的数据卷目录下,即 /usr/local/jenkins/jenkins01/data/下
[root@centOS target]# pwd /usr/local/jenkins/jenkins01/data/workspace/testcd/target [root@centOS target]# ll 总用量 4 drwxr-xr-x. 2 ordinary-01 ordinary-01 28 8月 31 10:22 maven-archiver drwxr-xr-x. 4 ordinary-01 ordinary-01 55 8月 31 10:22 testcd-1.0-SNAPSHOT -rw-r--r--. 1 ordinary-01 ordinary-01 2099 8月 31 10:22 testcd-1.0-SNAPSHOT.war
-
-
1.4 实现持续交付,持续部署
注意,ci 与 cd的不同点之一是部署的频率问题,ci是每次提交都部署,但是cd是提交到达一定版本后才部署,频率相对于ci要低很多
1. jenkins 安装git parameter插件
Git parameter 插件跟版本有关系的,如果不能使用,我们就需要使用另个 插件 Persistent Parameter,为了以防万一,直接在jenkins中安装这个插件吧。
系统管理-> 插件管理-> 可选插件 -> 搜索 Persistent Parameter -> 勾选 构建参数 -> 点击下面的 立即安装,安装完成后重启jenkins即可
2. 重新制定构建项目的方式
-
勾选丢弃旧的构建,并设置保留的最近的任务数,我们设置的是10(不用设置保留的天数)【可配置可不配置】
-
在安装Persistent Parameter后会在任务详情里出现一个勾选项
参数化构建过程
,通过这个来实现手动控制版本部署的目的- 勾选后,添加参数选择 git 参数
- 依次录入 名称 、 描述、参数类型 、默认值
- 名称: 可以随便起,下面要引用的,所以用英文 ,例如 Tag
- 描述: 可以填可不填
- 参数类型:选择标签
- 默认值:master
-
构建部分
-
由于要实现生产环境的持续交付和持续部署,因此简单的maven已经不能实现了,所以这里选择
执行shell
【如果之前设置了maven,需删除】 -
源码管理部分勾选-git ,并设置gitlab中ssh 类型的路径,设置分支(默认是master分支)
-
使用shell命令执行操作,命令如下:
# 打印上面配置的tag命令 echo $Tag # 切换到容器内存放项目的位置 cd /var/jenkins_home/workspace/testcd # git 切换分支 git checkout $Tag # 从分支下拉取代码 git pull origin $Tag # 使用maven命令打包 因为是容器内,所以需要使用绝对路径来执行mvn 命令 /var/jenkins_home/apache-maven-3.6.3/bin/mvn clean package
-
-
构建后操作部分
-
项目构建成功后,就要开始执行构建后的操作了,在任务详情页面,下拉到构建后操作部分,选择
send build artifacts over ssh
,这是我们之前安装的Publish over SSH
插件 -
配置一些ssh信息
-
name : 选择我们之前配置好的目标服务器地址
-
transfers :
-
source files :配置要把当前工程下的那些内容添加到目标服务器
**/*.war,docker-compose.yml,docker/**
** 代表全部路径
-
remote directory : 配置目标服务器用来放当前工程下的文件的文件夹名
testcd
jenkins会默认把工程文件放到容器的 我们在构建jenkins的时候用来放 docker-compose.yml文件的路径下,也就是/usr/local/jenkins/jenkins01/ 下,但是为了更好的jenkins 构建的项目,通过上面指定的路径,实际这个构建工程就放到了 /usr/local/jenkins/jenkins01/testcd/ 路径下了
-
exec command :执行的命令
# 跳转到放工程的目录下 cd /usr/local/jenkins/jenkins01/data/workspace/testcd # 把 target 文件夹下的.war包放到 docker 文件夹下 cp target/testcd-1.0-SNAPSHOT.war docker # 关闭 dcoker-composer 构建的容器 docker-compose down # 重新构建 docker-compose up -d --build # 删除镜像名为null的镜像 docker image prune -f
-
-
点击保存
-
-
3. 修改程序代码,添加dockerfile和compose文件
项目与pom.xml文件同一目录下创建docker文件夹,并在其中添加一个Dockerfile文件,内容如下
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testcd-1.0-SNAPSHOT.war /usr/local/tomcat/webapps
项目与pom.xml同一路径下创建一个docker-compose.yml文件,配置内容如下
version: "3.1"
services:
testcd:
build: docker
restart: always
container_name: testcd
ports:
- 8081:8080
4. 构建工程
我们上面的设置是想要交付部署指定版本的工程,但是到底哪些版本可以部署呢? 是怎么设置的呢?
- 我们可以给我们想要部署的项目设置标签
- 进入gitlab页面,进入我们的项目,找到我们想要部署的代码的版本,点击
标签
按钮,点击创建一个标签,在tag name 下输入标签名,点击完成 - 进入jenkins页面,进入任务,点击左侧的 build with parameters ,会看到一个 用以下参数构建项目,这个就是在任务配置中配置的Tag,里面的参数就是 gitlab中的 标签
- 点击构建项目
- 点击构建项目的进度条,点击进去后点击控制台输出,可以看到输出信息
- 进入gitlab页面,进入我们的项目,找到我们想要部署的代码的版本,点击
5.测试
- 按照上面构建工程的步骤,可以实现版本1的部署
- 接着在项目中index.html页面添加新的代码,提交到gitlab上,在最新的版本上设置标签
- 刷新jenkins 任务页面,点击构建项目(build with parameters),选择新创建的标签,点击构建
- 点击进度条,点击控制台输出,查看打印日志
- 构建完成后,在浏览器输入
http://172.16.195.134:8081/testcd-1.0-SNAPSHOT/
,就可以看到更新后的信息