首先,咱們要有個Jenkins咯,下載連接:https://jenkins.io/download/html
咱們安裝官網教程安裝好jenkins,安裝教程略....java
嗯?不是說好手把手麼?你妹的.git
好好好,咱們仍是來手把手教程好了.github
添加安裝源以後直接apt-get install就好,下面是ubuntu的安裝命令,其餘系統本身玩一下就好.web
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
下載連接: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.瀏覽器
以下圖:
接着留意一下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跑起來了,也有了一些經常使用的插件.
咱們先去把dotnet core docker 編譯發佈相關的東西弄好以後再回來繼續作jenkins任務.
在項目目錄下新建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
以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首頁,左側選擇"新建任務"(newJob),以下圖:
給新的job取個名字,而後選擇"構建自由風格的軟件項目",如圖:
確認以後進入Job配置頁面,源碼管理裏面選擇git,如圖:
若是git倉庫是須要權限的話須要配置一下權限,我通常簡單粗暴直接把jenkins主機的公鑰添加到git倉庫裏面,因此這裏直接配置成'From the Jenkins master ~/.ssh',也能夠用帳號密碼訪問等等的.
"Branch Specifier (blank for 'any') "默認master分支,根據本身的需求填入不一樣的分支.
構建觸發器和構建環境先跳過,咱們無論,待會弄.
點擊"添加構建步驟",選擇"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免登錄
構建觸發器就是咱們選擇何時來觸發構建任務,有幾種方案能夠作.
我這裏選擇第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在源碼中的路徑,而後保存
接着咱們進入管理平臺看一下.
點擊一下"當即構建",而後查看一下日誌.
這個時候,咱們用docker pull registry-internal.cn-hangzhou.aliyuncs.com/你的命名空間/你的鏡像名稱 就能夠拉到這個阿里雲build成功的鏡像了.
鏡像build的問題解決了,那麼咱們怎麼自動把鏡像發佈到咱們的運行主機呢?
這時候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-添加記錄"
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名稱 你的阿里雲鏡像地址;