手把手教你用Jenkins用Docker的方式自動發佈dotnet core程序

Jenkins部分

首先,咱們要有個Jenkins咯,下載連接:https://jenkins.io/download/html

咱們安裝官網教程安裝好jenkins,安裝教程略....java

嗯?不是說好手把手麼?你妹的.git

好好好,咱們仍是來手把手教程好了.github

首先安裝JDK8

添加安裝源以後直接apt-get install就好,下面是ubuntu的安裝命令,其餘系統本身玩一下就好.web

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java8-installer

下載jenkins.war + 啓動Jenkins

下載連接:http://mirrors.jenkins.io/war-stable/docker

在這裏面找最新的下載,我當前最新的應該是2.107.2shell

下載好了jenkins.war以後,在當前目錄建立一個jenkins-home文件夾,設置JENKINS_HOME環境變量爲jenkins-home(不設置也能夠,默認在~/.jenkins)json

wget http://mirrors.jenkins.io/war-stable/2.107.2/jenkins.war;
mkdir ~/jenkins-home;
export JENKINS_HOME=~/jenkins-home;
tmux;
java -jar jenkins.war

通常建議開個後臺進程來跑jenkins,省得終端退出以後jenkins就死掉了.ubuntu

因此上面我先打開了tmux以後再跑java -jar jenkins.war.瀏覽器

以下圖:
jenkins啓動

接着留意一下initialAdminPassword的輸出

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

XXXXXXXXXXXXXX

This may also be found at: /root/jenkins-home/secrets/initialAdminPassword

這個時候訪問當前主機的8080端口已經能夠看到jenkins正在啓動了,稍等片刻就能夠看到jenkins登陸頁.

這個時候把上面的XXXXXXXXXXXXXX複製出來,輸進去點擊繼續配置jenkins帳號密碼信息之類的.

配置jenkins

接着安裝默認插件.

安裝插件

這裏估計也要等幾分鐘不等,看你的機器性能和網絡速度.

安裝好了以後會進入配置登陸帳號密碼,安裝提示配置就完事.

最後進入jenkins頁面是這樣的.
jenkins

到如今咱們已經把jenkins跑起來了,也有了一些經常使用的插件.

咱們先去把dotnet core docker 編譯發佈相關的東西弄好以後再回來繼續作jenkins任務.

dotnet core docker 打包

在項目目錄下新建Dockerfile文件,內容以下:

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "你的dotnet core程序.dll"]

這個Dockerfile基本就是把當前目錄的文件拷貝到aspnetcore-build鏡像中,再裏面編譯好以後再發布到aspnetcore:2.0鏡像中,

最後指定運行你的dotnet core程序

來源:https://github.com/DaoCloud/dotnet-docker-samples

docker build + run 腳本(非必須,可使用jenkins中腳本編譯替代)

HouseCrawler.Web爲例,

#!/bin/sh
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
cd ~/code/58HouseSearch/HouseCrawler.Core/HouseCrawler.Web;
git pull --rebase origin master;
docker stop house-web;
docker rm house-web;
docker build -t house-web:$image_version .;
docker images;
docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile  --restart=always --name house-web -d house-web:$image_version;
docker logs house-web;

經過上面這個build+run腳本,咱們已經把dotnet core程序編譯好了,而且打包成了docker images,還直接跑起來了.

可是咱們想要的應該是自動化編譯部署,並且上面咱們都把jenkins跑起來了,因此....

jenkins job配置

新建Job

打開jenkins首頁,左側選擇"新建任務"(newJob),以下圖:

newJob

給新的job取個名字,而後選擇"構建自由風格的軟件項目",如圖:

構建自由風格的軟件項目

添加源碼倉庫

確認以後進入Job配置頁面,源碼管理裏面選擇git,如圖:
源碼管理

若是git倉庫是須要權限的話須要配置一下權限,我通常簡單粗暴直接把jenkins主機的公鑰添加到git倉庫裏面,因此這裏直接配置成'From the Jenkins master ~/.ssh',也能夠用帳號密碼訪問等等的.

git倉庫權限配置

"Branch Specifier (blank for 'any') "默認master分支,根據本身的需求填入不一樣的分支.

構建觸發器和構建環境先跳過,咱們無論,待會弄.

構建

點擊"添加構建步驟",選擇"Execute shell",而後能看到以下圖:
Execute shell

還記得咱們上一步的腳本麼?修改一下源碼路徑再放進去.

# 切換到源碼目錄,對應在jenkins-home的workspace下面
cd ~jenkins-home/workspace/項目名稱/Dockerfile所在目錄;
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
# 中止以前的docker container
docker stop house-web;
# 刪除這個container
docker rm house-web;
# build鏡像而且打上tag
docker build -t house-web:$image_version .;
docker images;
# 把剛剛build出來的鏡像跑起來
docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile  --restart=always --name house-web -d house-web:$image_version;
docker logs house-web;

若是jenkins主機和程序運行主機不在一臺機器上,建議直接在把上面的腳本放在運行主機上,命名成 start_XXX.sh.

上面的命令直接就是成了

ssh username@發佈主機的IP '~/start_XXX.sh'

ps:記得在jenkins主機配置ssh免登錄

構建觸發器

構建觸發器就是咱們選擇何時來觸發構建任務,有幾種方案能夠作.

  1. 使用 Build periodically,定時 or 隔N久去拉一次代碼構建
  2. Poll SCM:定時檢查源碼變動(根據SCM軟件的版本號),若是有變化就去執行構建
  3. GitHub hook trigger for GITScm polling 或者其餘Git平臺提供的webhook
  4. 安裝Generic Webhook Trigger插件以後,使用其餘平臺的webhook來觸發構建任務.

我這裏選擇第4種方案,安裝Generic Webhook Trigger插件,下面立刻回告訴你爲何這樣作的.

Generic Webhook Trigger插件在"系統管理-管理插件-可選插件"裏面直接搜"Generic Webhook Trigger"安裝就能夠.

從上一步的構建步驟裏面的腳本中咱們就知道,其實咱們如今要不就在jenkins主機上docker build,要不就在發佈目標主機上build,

build過程比較慢並且還會產生鏡像在本機or目標主機上,docker images也沒有被管理起來.

有什麼好的辦法麼?嗯,還真有.直接用阿里雲"容器鏡像服務"來構建鏡像

使用阿里雲-容器鏡像服務

首先登陸阿里雲,而後進入容器鏡像服務,地址是https://cr.console.aliyun.com/

首次進入估計須要建立一個命名空間,通常用公司名或者你的名字就完事.

接着選擇"建立鏡像倉庫".

建立鏡像倉庫

選地區-選命名空間-填倉庫名稱(就是鏡像名稱)-填摘要-設置代碼源(支持GitHub/阿里雲code/Bitbucket/私有Gitlab/本地Git等等,給個受權就完事)

選地區

構建設置選擇"代碼變動時自動構建鏡像",而後選一下構建分支爲你想要的分支,填入Dockerfile在源碼中的路徑,而後保存
構建分支

接着咱們進入管理平臺看一下.

aliyun-構建

點擊一下"當即構建",而後查看一下日誌.
build 日誌

構建成功

這個時候,咱們用docker pull registry-internal.cn-hangzhou.aliyuncs.com/你的命名空間/你的鏡像名稱 就能夠拉到這個阿里雲build成功的鏡像了.

鏡像build的問題解決了,那麼咱們怎麼自動把鏡像發佈到咱們的運行主機呢?

這時候webhook又出來了.

jenkins webhook觸發配置

咱們看阿里雲鏡像構建服務裏面,有一項是webhook的,官方介紹在這裏:阿里雲-webhook管理

阿里雲-webhook管理

這裏就須要填入咱們的webhook地址,還記得前面我無故端選擇的第四種方案,而後讓你們跟着安裝的Generic Webhook Trigger插件麼?

咱們就是用這貨來爲咱們提供webhook API.

理一下流程:

git倉庫代碼變化 ->阿里雲容器構建服務啓動 -> 構建好鏡像以後觸發webhook -> jenkins收到阿里雲的webhook以後觸發job執行部署腳本 ->部署腳本使用阿里雲鏡像run起來 ->完事.

咱們繼續配置Generic Webhook Trigger.

Generic Webhook Trigger支持的命名觸發URL格式是這樣的:

http://jenkins登陸用戶名:token受權碼@jenkins IP:8080/generic-webhook-trigger/invoke?token=觸發器名稱

jenkins登陸名和token在"帳號-設置-API Token-Show API Token..."裏面能看到,找出來以後填到上面去就能夠.

最後一個token參數其實就是"構建觸發器"中"觸發遠程構建"的參數,建議使用job名字.這裏的配置大概是這樣的:

觸發遠程構建

最後咱們還須要在jenkins全局安全設置中取消勾選「防止跨站點請求僞造(Prevent Cross Site Request Forgery exploits)"選項,這樣阿里雲webhook才能過得來.

手動在瀏覽器中訪問一下http://jenkins登陸用戶名:token受權碼@jenkins IP:8080/generic-webhook-trigger/invoke?token=觸發器名稱
若是對應的jenkins Job能正常開始執行,說明整個流程已經ok了.

最後咱們回到上面"阿里雲-容器鏡像服務-對應鏡像倉庫-webhook-添加記錄"
webhook-添加記錄

PS:webhook名稱不要帶特殊字符or "-"之類的,否則一直保存失敗並且還不會提示你是由於名字不合法,下午被這個坑了半個小時.

到這裏,咱們基本大功告成了.

最後咱們再改一下jenkins的腳本,不在本地build docker了,直接拿阿里雲鏡像服務構建出來的鏡像跑就能夠.

# 中止以前的docker container
docker stop house-web;
# 刪除這個container
docker rm house-web;
docker pull 你的阿里雲鏡像地址;
# 把剛剛build出來的鏡像跑起來
docker run --restart=always --name 你的contianer名稱 你的阿里雲鏡像地址;

總結一下咱們作了什麼

  1. 搭建jenkins
  2. 編寫Dockerfile文件,直接編譯發佈+打包成docker鏡像+部署腳本
  3. 使用阿里雲-容器構建服務構建docker鏡像,構建成功後使用webhook通知jenkins
  4. 配置jenkins webhook觸發器,觸發部署腳本
  5. 其餘項目/語言其實也基本同樣的操做,區別只在於Dockerfile的編寫
  6. 完事...
相關文章
相關標籤/搜索