构建高效的Jenkins + Docker + Vue项目自动部署环境

8,350 阅读3分钟

亮点

  • 采用shell自定义脚本,控制集成部署环境更加方便灵活
  • 如果服务器更换,重新部署的工作量会比较小

准备工作

首先我们得有一台服务器。我这里用的是阿里云ECS,华东节点。具体的购买操作的话百度会有教程。购买完成以后你会有一个公网的ip,以及一个通过ssh登录服务器的密码。

关于Docker的话,如果不了解的可以先去看文档。Docker的Container(容器)就像轮船上的集装箱。集装箱各自装着各自的货物,互不影响。比如一个Redis服务,一个Mongodb服务,都可以放到一个单独的Container(集装箱)里面。而这些容器,又依赖一个执行环境。这个执行环境就是Docker所说的Image(镜像)。每一个Container管理着自己的生命周期。

Jenkins是一款由Java开发的开源软件项目,主要是用来持续集成的。相当于就是预先写好脚本,调试成功之后,下一次如果再需要部署的时候就会自动执行上一次存储的脚本,无需再修改。

安装 Docker

参考文档

卸载旧版本

$ sudo apt-get remove docker docker-engine docker.io

使用APT安装

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

$ sudo apt-get update
$ sudo apt-get install 
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker 软件源

$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

# 官方源
# $ sudo add-apt-repository \
    # "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    # $(lsb_release -cs) \
    # stable"

以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要测试或每日构建版本的 Docker CE 请将 stable 改为 test 或者 nightly。

安装 Docker CE

更新 apt 软件包缓存,并安装 docker-ce:

$ sudo apt-get update

$ sudo apt-get install docker-ce

使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:

$ curl -fsSL get.docker.com -o get-docker.sh

$ sudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中

启动 Docker CE

$ sudo systemctl enable docker

$ sudo systemctl start docker

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

$ sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。

测试 Docker 是否安装正确

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

若能正常输出以上信息,则说明安装成功。

镜像加速

如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速。

阿里云镜像加速

安装 docker-compose

参考文档

运行此命令以下载Docker Compose的当前稳定版本

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

对二进制文件应用可执行权限

$ sudo chmod +x /usr/local/bin/docker-compose

查看版本

$ docker-compose --version

安装 jenkins

在安装jenkins我选择了使用docker-compose
docker-compose 是一个用来把 docker 自动化的东西
有了 docker-compose 你可以把所有繁复的 docker 操作全都一条命令,自动化的完成。

首先我们需要在服务器上创建一个目录机构 (我只是做个演示)

/home/jenkins
     - docker-compose.yml
     - jenkins-home

接下来我们来编写 docker-compose.yml 安装jenkins

version: '3'    # 指定 docker-compose.yml 文件的写法格式
services:       # 多个容器集合
  docker_jenkins: 
    user: root  # 为了避免一些权限问题 在这我使用了root
    restart: always # 重启方式
    image: jenkins/jenkins:lts  # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
    container_name: jenkins # 容器名称
    ports:      # 对外暴露的端口定义
      - '8080:8080'
      - '50000:50000'
    volumes:    # 卷挂载路径
      - /home/jenkins/jenkins_home/:/var/jenkins_home  # 这是我们一开始创建的目录挂载到容器内的jenkins_home目录
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker     # 这是为了我们可以在容器内使用docker命令
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose # 同样的这是为了使用docker-compose命令

我们需要进入到 jenkins 目录下执行:

$ docker-compose up -d

这个命令会帮我们自动拉取镜像并配置

不出意外你现在可以打开你的服务器地址 http://xxxxxxx:端口号 就能看到这个界面:

打开你所创建的jenkins目录进入到jenkins-home
/home/jenkins/jenkins-home

进入 secrets 目录

$ cat initialAdminPassword

然后把里面的文本复制出来填到管理员密码中

接下来需要安装两个插件

NodeJS Plugin
Publish Over SSH

然后我们滑到最下方

开始创建项目部署

官方参考

1、首先在项目根目录创建一个nginx.conf文件

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
  worker_connections  1024;
}
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;
  sendfile        on;
  keepalive_timeout  65;
  server {
    listen       80;
    server_name  www.lovelp.xin;  # 域名
    location / {
      root   /app;  # 指向目录
      index  index.html;
      try_files $uri $uri/ /index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   /usr/share/nginx/html;
    }
  }
}

2、在项目根目录创建一个Dockerfile文件

FROM node
WORKDIR /app

COPY package*.json ./
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN cnpm install
COPY ./ /app
RUN npm run build:prod

FROM nginx
RUN mkdir /app
COPY --from=0 /app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf

3、在项目根目录创建一个setup.sh来帮助我们执行脚本

#!/usr/bin/env bash
image_version=`date +%Y%m%d%H%M`;
# 关闭shop_admin容器
docker stop shop_admin || true;
# 删除shop_admin容器
docker rm shop_admin || true;
# 删除shop/admin镜像
docker rmi --force $(docker images | grep shop/admin | awk '{print $3}')
# 构建shop/admin:$image_version镜像
docker build . -t shop/admin:$image_version;
# 查看镜像列表
docker images;
# 基于shop/admin 镜像 构建一个容器 shop_admin
docker run -p 9527:80 -d --name shop_admin shop/admin:$image_version;
# 查看日志
docker logs shop_admin;
#删除build过程中产生的镜像    #docker image prune -a -f
docker rmi $(docker images -f "dangling=true" -q)
# 对空间进行自动清理
docker system prune -a -f

4、最后我们需要在jenkins上创建项目

最后我们就可以愉快的 Build Now