Jenkins + Nexus


上一章我们写到,如何使用 Nexus 托管我们的镜像。这一章我们就将 Nexus 和 Jenkins 结合起来构建部署。

Jenkins 登录认证制品库


想使用 Jenkins 推送镜像到制品库,必须先登录制品库。进入 Jenkins 容器,使用 docker login 登录,然后退出即可:

docker exec -it jenkins /bin/bash
docker login 制品库地址:端口
exit;
1
2
3

10.211.55.3:8082
登录login credentials会记录在/root/.docker/config.json
如果不进行docker logout 服务器ip:端口操作,则服务器重启后无需再次登录

Nginx 服务器登录认证制品库


编辑 /etc/docker/daemon.json 文件,将制品库地址写入,然后重启 docker 服务

vi /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
{
  "registry-mirrors": ["https://jzirisvt.mirror.aliyuncs.com"],
  "insecure-registries": ["10.211.55.3:8082"]
}
1
2
3
4


接着使用 docker login 命令进行登录

docker login 制品库地址:端口
1

10.211.55.3:8082

使用 DockerFile 构建前端镜像


在此之前,我们使用** 构建压缩包 => 直接上传到目标服务器 => 进行解压部署 的方式部署前端。
在这里,我们更换为部署docker镜像。既然要制作自己的镜像,那就少不了
DockerFile。

在前面我们写到过,DockerFile 是一个镜像制作过程的步骤描述。那么我们也可以简单的描述下我们自己的步骤。

我们在代码目录下,新建一个文件。叫 Dockerfile (注意,file全小写):

# FROM nginx:1.15-alpine
# COPY dist /usr/share/nginx/html
# WORKDIR /usr/share/nginx/html
FROM nginx:1.15-alpine
COPY dist /usr/share/nginx/html/jenkins-test-vue/
WORKDIR /usr/share/nginx/html
1
2
3
4
5
6

此Dockerfile声明了以下步骤:

  1. 拉取一个 nginx 1.15-alpine 版本的镜像。
  2. 将当前目录下的 dist 文件夹里的内容拷贝到镜像的 /usr/share/nginx/html 文件夹中。
  3. 声明启动容器时,在 /usr/share/nginx/html 下面执行。

.代表当前路径,即docker容器中的/var/jenkins_home/workspace/项目目录,项目是从gitlab拉取而来
当执行到docker build -t 172.16.81.150:8082/fe/nginx-fe-$timestamp .时,会将.代码的当前路径作为context上下文,并在context中寻找Dockerfile
同时docker客户端会把上下文中的所有文件发送给docker daemon
当执行COPY操作时,会在当前上下文中寻找文件,并拷贝到镜像的目标路径/usr/share/nginx/html下,如果目标路径不存在则自动创建目标路径。
不能拷贝上下文之外的文件,否则会报错。
当执行docker run时,容器会拿到镜像里对应路径/usr/share/nginx/html下的所有文件。


接着提交到代码库中。

修改 Jenkins 执行脚本


我们打开之前 Jenkins 任务的编辑页面,改为以下脚本:

# set -e
# timestamp=`date '+%Y%m%d%H%M%S'`

# node -v
# npm -v

# npm install -g cnpm --registry=https://registry.npm.taobao.org

# cnpm install

# npm run build

# # 编译docker镜像
# docker build -t 172.16.81.150:8082/fe/nginx-fe-$timestamp .

# # 推送docker镜像到制品库
# docker push 172.16.81.150:8082/fe/nginx-fe-$timestamp

# # 远程执行命令部署镜像
# ssh -o StrictHostKeyChecking=no root@172.16.81.151 "docker pull 172.# 16.81.150:8082/fe/nginx-fe-$timestamp && \
# docker stop jenkins-test && \
# docker rm jenkins-test && \
# docker run -p 80:80 -itd \
# --name jenkins-test \
# --restart always \
# 172.16.81.150:8082/fe/nginx-fe-$timestamp"

set -e
timestamp=`date '+%Y%m%d%H%M%S'`

node -v
npm -v
npm install -g cnpm --registry=https://registry.npm.taobao.org
rm -rf node_modules/
rm -rf dist/
cnpm install
npm run build

# 编译docker镜像
docker build -t 10.211.55.3:8082/fe/nginx-fe-$timestamp .

# 推送docker镜像到制品库
docker push 10.211.55.3:8082/fe/nginx-fe-$timestamp

# 远程执行命令部署镜像
ssh -o StrictHostKeyChecking=no root@10.211.55.4 "docker pull 10.211.55.3:8082/fe/nginx-fe-$timestamp && \
docker stop nginx && \
docker rm nginx && \
docker run -p 80:80 -itd \
--name nginx \
--restart always \
10.211.55.3:8082/fe/nginx-fe-$timestamp"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

set -e bash如果任何语句的执行结果不是true则应该退出
在shell脚本中,声明一个变量只需要 变量名=值 即可。在命令中用 $-变量名 进行使用。
timestamp=`date '+%Y%m%d%H%M%S'`:这个代表执行 date '+%Y%m%d%H%M%S' 这条命令,并赋值给 timestamp 这个变量。
date '+%Y%m%d%H%M%S' 代表输出当前时间的年月日时分秒。

-o StrictHostKeyChecking=no 跳过ssh公钥检查
比如: ssh root@ip -o StrictHostKeyChecking=no
比如: scp test.txt root@ip:~ -o StrictHostKeyChecking=no
StrictHostKeyChecking: https://cikeblog.com/ssh-cant-established.html

如何进入nginx容器

docker exec -it nginx /bin/sh
1

进入alpine容器


这里可以看到,我们将之前脚本后半部分的流程:

压缩打包资源 => 通过 scp 上传压缩包** => ssh 远程执行解压部署命令

替换为:

Dockerfile构建镜像 => 上传镜像到制品库 => 远程执行命令拉取镜像,停止容器,删除容器,启动新拉取的镜像

Last Updated: 8/9/2020, 9:33:22 PM