若是尚未搭建好可使用 Docker 的 Jenkins,請先移步到這篇文章進行搭建html
經過 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 文件
項目很簡單,就是一個靜態網頁
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Jenkins demo</title> </head> <body> <h1>Jenkins demo</h1> </body> </html>
鏡像以 nginx 爲基礎鏡像,而後複製 index.html 進容器
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;"]
設置了 8081 端口和部署失敗重試
version: '3.4' services: jenkins_demo: image: IMAGE_LATEST deploy: restart_policy: condition: on-failure expose: - "80" ports: - 8081:80
#!/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 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 的自動部署原本比較複雜,可是後來有了 Pipeline,一切都簡單了,Pipeline 是 Jenkins 的一個插件,初始化 Jenkins 的時候會推薦安裝,若是沒有請自行安裝
項目中若是有 Jenkinsfile 文件, Jenkins 檢測到就會自動按 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 的 Webhooks 中填寫下面的 URL 就能夠實現推送代碼後主動通知 Jenkins 自動部署,其餘基於 Git 的倉庫設置同樣
http://127.0.0.1:8080/gogs-webhook/?job=jenkins_demo