一.前言 (Jenkins、Docker、Git/Svn組建一套簡單的自動化發佈流程) 文章中用到的相關伺服器角色 二.安裝jenkins 1.Windows下安裝jenkins 各環境下安裝教程 https://jenkins.io/zh/doc/book/installing/ Windows下 ...
一.前言
(Jenkins、Docker、Git/Svn組建一套簡單的自動化發佈流程)
文章中用到的相關伺服器角色
角色 | 環境 | 功能 |
開發機 | Win10、Docker(Linux OS) | 編碼、調試 |
發佈機(與開發機共用) | Win10、Docker(Linux OS)、Jenkins | 自動化部署 |
測試伺服器 | Ubuntu、Docker | 測試環境 |
二.安裝jenkins
1.Windows下安裝jenkins
各環境下安裝教程 https://jenkins.io/zh/doc/book/installing/
Windows下載地址:https://jenkins.io/zh/download/thank-you-downloading-windows-installer-stable
建議jinkens還是安裝在docker的宿主機上,不論是windows還是linux,容器形式安裝雖然很方便!但是後續很多坑,比如jenkins容器內共用宿主機docker和容器內運行docker-compose
下麵是docker下安裝的一些筆記(沒走通),最終選擇了宿主機下安裝jinkens
PS C:\Users\Administrator> docker run -u root -d -p 8080:8080 -p 50000:50000 -v /e/DockerData:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
c8222a3716a327ce82770aa729fe80169cbcc28c4d2ada8891cf49ed0b38f3e3
PS C:\Users\Administrator> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8222a3716a3 jenkinsci/blueocean "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp serene_feistel
66ff08eda2ae c42e9f575fc4 "dotnet HelloWorld.d…" 2 days ago Up 2 days 0.0.0.0:81->80/tcp netcore_helloworld
5357b641a7b1 9c18561d7ab3 "nginx -g 'daemon of…" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp mynginx
-v /e/DockerData:/var/jenkins_home,把jenkins_home目錄(包含插件、配置、工作數據)掛載到宿主機。
這裡宿主機是windows,/e/DockerData相當於"e:\DockerData",前提是e盤必須被設置為Shared Drives,如果未設置會彈出提示。
/var/run/docker.sock:/var/run/docker.sock,映射宿主機的docker到jenkins容器。
進入jenkins容器內,查看宿主機docker信息
PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash
bash-4.4# docker version
Client:
Version: 18.09.1-ce
API version: 1.39
Go version: go1.11.4
Git commit: 4c52b901c6cb019f7552cd93055f9688c6538be4
Built: Fri Jan 11 15:41:33 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
還需要安裝docker-compose,否則shell腳本通過compose來構建鏡像時會報docker-compose not found。
docker-compose安裝教程 https://docs.docker.com/compose/install/
這裡跟宿主機不同的是,要選擇在容器內的安裝方式“INSTALL AS A CONTAINER”
PS C:\Users\Administrator> docker-compose -v #查看宿主機docker-compose版本
docker-compose version 1.23.2, build 1110ad01
PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash #進入jenkins容器
bash-4.4# curl -L --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose #bash腳本安裝compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 596 0 596 0 0 587 0 --:--:-- 0:00:01 --:--:-- 587
100 1666 100 1666 0 0 831 0 0:00:02 0:00:02 --:--:-- 2127
bash-4.4# chmod +x /usr/local/bin/docker-compose
bash-4.4#
Unable to find image 'docker/compose:1.23.2' locally
1.23.2: Pulling from docker/compose
4fe2ade4980c: Pull complete 658ccff8d4f1: Pull complete 71166c3c8d42: Pull complete c246ed86dd59: Pull complete Digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860
Status: Downloaded newer image for docker/compose:1.23.2
bash-4.4# docker-compose -v #查看jenkins容器內compose版本
docker-compose version 1.23.2, build 1110ad01
2.登入jenkins
瀏覽器打開localhost:8080
根據提示找到initialAdminPassword文件中的初始密碼
接下來根據導航依次執行“安裝預設插件” ,“創建jenkins賬號”,“登入jenkins”
三.創建jenkins發佈項目
1.新建Item
2.源碼設置
如果是私有倉庫需要加憑據Credentials
Failed to connect to repository:Error performing command:git.exe,如果有安裝git,那就是“Global Tool Configuration”配置的git路徑不對。
Manage Jenkins - Global Tool Configuration
設置正確的git.exe路徑
設置好保存後再進入helloworld項目的配置頁面。
3.構建觸發器和構建環境
構建觸發器,就是設置如何進行自動構建。如其他項目構建完後觸發該項目的構建、定時構建(不論有沒有代碼變更)、輪詢代碼構建(jenkins輪詢遠程倉庫有代碼變更則進行構建)。
這裡都不選,則需要在工作台使用手動(點擊按鈕)構建。
4.添加PowerShell腳本
linux選擇shell,windows下建議用powershell,batch command對docker命令的支持不是很友好。
安裝powershell插件
切換到“可選插件”選項卡,搜索powershell安裝
添加構建命令
#定義變數 $IMAGE_VERSION='latest' $REGISTRY_USER='鏡像倉庫賬號' $REGISTRY_PWD='鏡像倉庫密碼' $REGISTRY_HOST='ccr.ccs.tencentyun.com' $REGISTRY_NAMESPACE='鏡像倉庫namespace' $SERVICE_HELLOWORLD='helloworld' $SERVICE_MYNGINX='mynginx' #jenkins拉取的項目預設路徑 “安裝路徑根目錄/workspace/jenkins裡面建的項目名” $COMPOSE_PATH='D:\Program Files (x86)\Jenkins\workspace\helloworld\docker-compose.yml' echo "------------------------------ 構建鏡像 ------------------------------" docker-compose -f "${COMPOSE_PATH}" build echo "------------------------------ 登錄遠程倉庫 ------------------------------" docker login --username=${REGISTRY_USER} --password=${REGISTRY_PWD} ${REGISTRY_HOST} echo "------------------------------ 標記鏡像 ------------------------------" docker tag ${SERVICE_HELLOWORLD}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION} docker tag ${SERVICE_MYNGINX}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNGINX}:${IMAGE_VERSION} echo "------------------------------ 推送到遠程倉庫 ------------------------------" docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION} docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNGINX}:${IMAGE_VERSION} echo "------------------------------ 清理None ------------------------------" docker rmi $(docker images -f "dangling=true" -q)
5.遠程SSH
安裝”Publish Over SSH“插件,安裝完之後,進入到”Manage Jenkins“ - "Configure System"中配置遠程伺服器
Passphrase:SSH密碼
Path to key:SSH私鑰的文件路徑
Key:私鑰串,如果“Key”和“Path to key”都設置,則“Key”的優先順序較高
Disable exec:禁止在目標機上執行命令
SSH Server 配置(指定遠程伺服器的ip,可以配置多個ssh server )
Name:SSH節點配置的名稱,在Job中使用Publish over SSH插件時,此名稱將出現在“SSH Server”中“Name”的下拉列表中,如下圖:
Hostname:通過SSH連接到的遠程主機名或IP
Username:SSH服務使用的用戶名,使用key進行連接時為key指定的用戶名
詳見插件官方介紹頁 https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin
添加一個docker-compose.staging.yml提交到git倉庫,用於測試環境。
version: '3.4' services: helloworld: image: ccr.ccs.tencentyun.com/wuuu/helloworld:latest environment: #環境變數 - ASPNETCORE_ENVIRONMENT=Development ports: #埠映射 - "81:80" container_name: netcore_helloworld deploy: restart_policy: #重啟策略 condition: on-failure delay: 5s max_attempts: 3 networks: #指定network - newbridge mynginx: image: ccr.ccs.tencentyun.com/wuuu/mynginx:latest ports: - "80:80" - "801:801" container_name: mynginx deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 networks: - newbridge networks: newbridge: #新的network #name: newbridge #compose版本3.5開始才支持自定義名稱
繼續之前的構建,“增加構建步驟“ - ”Send files or execute commands over SSH“
Name:選擇剛剛配置的遠程伺服器”Staging_Server“
Source files:要上傳的文件的相對路徑,多個文件以逗號分隔。相對workspace的路徑(其實是相對workspace下項目的路徑),也支持表達式,如上圖中的“**/*.war”。
如:我的項目通過jenkins git插件拉取下來,所在的目錄是D:\Program Files (x86)\Jenkins\workspace\helloworld,docker-compose.staging.yml剛好在hellworld目錄下,所以此處直接填文件名
如果yml文件在hellowrold/mycompose/目錄下,則需要填寫mycompose/docker-compose.staging.yml
Remove prefix:文件複製時要過濾的文件夾。
Remote directory:遠程伺服器上的文件夾,此文件夾路徑是相對於“SSH Server”中的“Remote directory”。如果該文件夾不存在將會自動創建。
由於配置Staging_Server時Remote directory沒有設置,並且時直接使用root賬戶登錄Staging_Server的,所以Remote directory路徑預設為root/
此處填/mydokcercompose,則文件會被覆制到伺服器的/root/mydokcercompose/docker-compose.staging.yml
Exec command:shell命令
#!/bin/bash #定義變數 REGISTRY_USER='鏡像倉庫賬號' REGISTRY_PWD='鏡像倉庫密碼' REGISTRY_HOST='ccr.ccs.tencentyun.com' COMPOSE_PATH='mydockercompose/docker-compose.staging.yml' echo ------------------------------ 登錄遠程倉庫 ------------------------------ docker login --username=$REGISTRY_USER --password=$REGISTRY_PWD $REGISTRY_HOST echo ------------------------------ 卸載服務 ------------------------------ docker-compose -f $COMPOSE_PATH down echo ------------------------------ 拉取鏡像 ------------------------------ docker-compose -f $COMPOSE_PATH pull echo ------------------------------ 啟動服務 ------------------------------ docker-compose -f mydockercompose/docker-compose.staging.yml up -d echo ------------------------------ 清除None ------------------------------ docker rmi $(docker images -f "dangling=true" -q)
6.手動構建
7.完成
構建完成之後,查看構建日誌是否有異常
查看jenkins伺服器上構建的image
PS C:\Users\Administrator> docker images REPOSITORY TAG IMAGE ID CREATED SIZE ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc About an hour ago 265MB helloworld latest 4024cdbb87dc About an hour ago 265MB ccr.ccs.tencentyun.com/wuuu/mynginx latest daca457eb2a9 7 hours ago 109MB mynginx latest daca457eb2a9 7 hours ago 109MB mcr.microsoft.com/dotnet/core/sdk 2.2-stretch e4747ec2aaff 4 weeks ago 1.74GB mcr.microsoft.com/dotnet/core/aspnet 2.2-stretch-slim f6d51449c477 4 weeks ago 260MB
查看演示伺服器的image和container
root@VM-16-9-ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc About an hour ago 265MB ccr.ccs.tencentyun.com/wuuu/mynginx latest daca457eb2a9 7 hours ago 109MB root@VM-16-9-ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1dc94a1886b ccr.ccs.tencentyun.com/wuuu/mynginx:latest "nginx -g 'daemon of…" 8 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp mynginx 3ad3db4fbd94 ccr.ccs.tencentyun.com/wuuu/helloworld:latest "dotnet HelloWorld.d…" 8 minutes ago Up 8 minutes 0.0.0.0:81->80/tcp netcore_helloworld
瀏覽器打開演示伺服器IP:801
示例代碼Github地址:https://github.com/wwwu/AspNetCore_Docker
- AspNetCore容器化(Docker)部署(一) —— 入門
- AspNetCore容器化(Docker)部署(二) —— 多容器通信
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器編排
- AspNetCore容器化(Docker)部署(四) —— Jenkins自動化部署