jenkins+docker+vue项目的自动部署环境(案例)

最近也是在准备为练手的 flutter项目 写个后台和接口,准备先部署到线上。因此抽空研究了下jenkins 和 docker 的持续性部署。目前这种技术也是被广大公司所使用吧。也感谢你们给个starhtml

亮点

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

准备工做

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

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

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

安装 Docker

参考文档nginx

卸载旧版本

$ sudo apt-get remove docker docker-engine docker.io
复制代码

使用APT安装

因为 apt 源使用 HTTPS 以确保软件下载过程当中不被篡改。所以,咱们首先须要添加使用 HTTPS 传输的软件包以及 CA 证书。git

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

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

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

$ 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 软件源shell

$ 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。npm

安装 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
复制代码

而后咱们滑到最下方

开始建立项目部署

官方参考

一、首先在项目根目录建立一个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;
    }
  }
}

复制代码

二、在项目根目录建立一个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 
复制代码

三、在项目根目录建立一个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

复制代码

四、最后咱们须要在jenkins上建立项目

最后咱们就能够愉快的 Build Now

文采很差 因此大部分采用了截图的方式 但愿你们多多包涵,后续会出一篇node的部署方式,文章就到此结束了,有赞的给个赞 O(∩_∩)O哈哈~

相关文章
相关标签/搜索