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哈哈~

相關文章
相關標籤/搜索