使用 Jenkins 自動部署 Docker 服務(2、構建部署篇)

若是尚未搭建好可使用 Docker 的 Jenkins,請先移步到這篇文章進行搭建html

使用 Jenkins 自動部署 Docker 服務(1、Jenkins 搭建篇)

目標

經過 Jenkins 實現推送代碼後自動部署基於 Docker 的服務

準備工做

獲取示例項目或者直接複製如下文件內容
# 獲取示例項目
git clone https://github.com/kwkwc/jenkins_demo.git

# 項目文件
├── index.html              # 頁面文件
├── Dockerfile              # 鏡像文件
├── docker-compose.src.yml  # Docker 部署文件
├── deploy_jenkins.sh       # 部署腳本
├── Jenkinsfile             # Jenkins Pipeline 文件

頁面文件

項目很簡單,就是一個靜態網頁

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Jenkins demo</title>
    </head>
    <body>
        <h1>Jenkins demo</h1>
    </body>
</html>

鏡像文件

鏡像以 nginx 爲基礎鏡像,而後複製 index.html 進容器

Dockerfile

FROM nginx:1.15.2
ENV REFRESHED_AT 2018-08-09

COPY ./index.html /usr/share/nginx/html/index.html

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]

Docker 部署文件

設置了 8081 端口和部署失敗重試

docker-compose.src.yml

version: '3.4'
services:
  jenkins_demo:
    image: IMAGE_LATEST
    deploy:
      restart_policy:
        condition: on-failure
    expose:
      - "80"
    ports:
      - 8081:80

部署腳本

deploy_jenkins.sh

#!/bin/bash

# 容器名稱
CONTAINER="jenkins_demo"
# 鏡像名稱(以日期時間爲鏡像標籤,防止重複)
IMAGE=$CONTAINER":"$(date -d "today" +"%Y%m%d_%H%M%S")

# 刪除滾動更新殘留的容器
docker rm `docker ps -a | grep -w $CONTAINER"_"$CONTAINER | awk '{print $1}'`
# 強制刪除滾動更新殘留的鏡像
docker rmi --force `docker images | grep -w $CONTAINER | awk '{print $3}'`

# 建立新鏡像
docker build -t $IMAGE . && \

# 刪除 docker-compose.jenkins.yml 文件,防止使用相同鏡像
rm -rf docker-compose.jenkins.yml && \

# 複製 docker-compose.src.yml 文件,防止污染原文件
cp docker-compose.src.yml docker-compose.jenkins.yml && \

# 替換鏡像名標誌位爲最新鏡像
sed -i s%IMAGE_LATEST%$IMAGE%g docker-compose.jenkins.yml && \

# 使用 docker stack 啓動服務
docker stack deploy -c docker-compose.jenkins.yml $CONTAINER

實現無工具自動部署

咱們暫時忘記 Jenkins,先看看無工具自動部署是怎麼實現的

初始化 Docker Swarm 集羣網絡

因爲咱們使用了 Docker Stack,他可用於實現滾動更新,分佈式集羣,但依賴於 Docker Swarm 集羣網絡,直接使用會報錯,因此須要先初始化 Docker Swarm 集羣網絡
# 初始化 Docker Swarm 集羣網絡
docker swarm init

運行部署腳本

./deploy_jenkins.sh

查看鏡像

docker images

圖片描述

查看容器

docker ps

圖片描述

瀏覽器打開

http://127.0.0.1:8081

成功自動部署

圖片描述

更改內容

嘗試修改 index.html 內容再運行部署腳本 ./deploy_jenkins.sh

效果

圖片描述

實現 Jenkins 自動部署

Jenkins 的自動部署原本比較複雜,可是後來有了 Pipeline,一切都簡單了,Pipeline 是 Jenkins 的一個插件,初始化 Jenkins 的時候會推薦安裝,若是沒有請自行安裝

Jenkins Pipeline 文件

項目中若是有 Jenkinsfile 文件, Jenkins 檢測到就會自動按 Jenkinsfile 寫的流程運行命令,例如這個 Jenkinsfile 文件裏面寫的就是自動幫咱們運行剛纔的部署腳本

Jenkinsfile

pipeline {
  agent none
  stages {
    stage('Deploy') {
      agent any
      steps {
        echo 'Deploying'
        sh './deploy_jenkins.sh'
      }
    }
  }
}

新建任務

輸入任務名稱,選擇流水線

圖片描述

填寫信息

只須要填寫流水線裏面的信息
"定義" 選擇 "Pipeline script from SCM"
"SCM" 選擇 "Git"
"Repository URL" 填寫 Git 倉庫地址
選好 Git 分支
若是是私密倉庫,在 「Credentials」 那一欄添加帳號密碼而後選擇帳號就行

圖片描述

查看任務

保存後回到主頁就能夠看到咱們新建的任務,能夠看到狀態、運行狀況等信息

圖片描述

手動構建

點擊一下界面的當即構建按鈕就能夠開始構建了

圖片描述
圖片描述

自動構建(定時查詢)

設置構建觸發器,例如每 30 分鐘查詢一次是否有更新,有則自動構建

圖片描述

自動構建(主動通知)

主動通知須要安裝插件,這裏以 Gitea 爲例子,Gitea 使用的是 Gogs 的插件
"系統管理" --> "插件管理" --> "可選插件" 搜索 Gogs,勾選直接安裝,安裝成功後在項目配置裏面會多出一個 "Gogs Webhook" 選項,不須要配置任何東西,安裝了就行

圖片描述
圖片描述

設置 Gitea 鉤子

在 Gitea 的 Webhooks 中填寫下面的 URL 就能夠實現推送代碼後主動通知 Jenkins 自動部署,其餘基於 Git 的倉庫設置同樣
http://127.0.0.1:8080/gogs-webhook/?job=jenkins_demo

圖片描述

相關文章
相關標籤/搜索