持續內建傳遞部署是什麼意思,它給我們帶來什麼好處?
先貼一張圖

- 持續內建強調開發人員送出了新代碼之後,立刻進行建構、(單元)測試(這個要看情況了是否需要)
持續傳遞(Continuous Delivery)
- 持續傳遞在持續內建的基礎上,将內建後的代碼部署到更貼近真實運作環境的「類生産環境」(production-like environments)中。比如,我們完成單元測試後,可以把代碼部署到連接配接資料庫的 Staging 環境中更多的測試。如果代碼沒有問題,可以繼續手動部署到生産環境中。
持續部署(Continuous Deployment)
- 持續部署則是在持續傳遞的基礎上,把部署到生産環境的過程自動化。
更多概念請參考
https://link.zhihu.com/?target=http%3A//www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/減少重複勞動 提高效率
jenkins大家都知道吧,但今天我們用微軟的vsts來定制個性化定制持續內建傳遞(個人或者小團隊我建議用vsts 也不用自己安裝jenkins環境了 直接用vsts線上系統很友善)
用到的資源有:
- 騰訊雲伺服器ubuntu一台(自己先安裝好docker哈)
- vsts建立一個git(有微軟賬号就能免費建立,<=5人團隊是免費使用的,對于靈活團隊綽綽有餘啦) https://www.visualstudio.com/zh-hans/team-services/
一步步看圖
第一步 在vsts建立一個工程
建立git使用者
然後用git工具clone到本地 我習慣用Sourcetree 大家可以用自己習慣的方式
如果提示輸入密碼就輸入上面建立的使用者名和密碼
第二步建立一個實驗工程
這裡我們建立一個非常簡單的console webapplication
安裝nuget包
這裡注意一點:我這裡寫死了 用 5001端口 注意我用的是 *:5001 沒有用 localhost:5001 如果用這個方式的話 部署docker上會通路不了
确認可以跑起來
然後git送出代碼到master分支
第三步我們來配置vsts
先配置第一部分 一有代碼送出到master分支 就自動編譯 打包 【CI部分】
選擇 ASP.NET Core 會預設有以下Task
一定要注意選擇linux環境編譯
Test我們暫時不需要就Remove掉
由于我們不是web project
配置觸發器 (意思就是一有代碼送出打master分支[可以指定特定分支]就會觸發CI)
嘗試跑一下
CI正常完成
到此CI配置工作已完成
接下來我想要完成自動 釋出到我的騰訊雲伺服器 在伺服器上把釋出的檔案打包并生成一個image 然後用這個image生成一個Container 并啟動
第四部我們配置Release
Sourece alias 這個大家可以修改成名字短一點
執行Release釋出的時候會把之前CI public的東西download然後放在命名為 Source alisa檔案夾内
我改成 _test_netcore-docker
接下來來配置環境
大家可以根據實際情況配置多個環境 比如 內建測試環境 和 prod環境
我這裡就隻配置一個prod環境
由于我們是釋出到騰訊雲伺服器 是以在這裡選擇 Empt process 且命名為prod
接下來要配置 Release 操作的 Task
我們添加SSH 目的是用SSH 連結到 騰訊雲伺服器 然後 把釋出的檔案通過SSH傳輸到我的伺服器
得先配置SSH無密碼登入
按照提示進行配置
配置好後
Source folder 輸入我們之前配置的别名 _test_netcore-docker
最終如下
然後再添加SSH執行指令工具
unzip -q site/drop/TestDotnetcore.zip -d site/drop/ 釋出的檔案是zip的 通過這個指令解壓zip <TestDotnetcore.zip是我檢視釋出的日志找到的這個名字目前我還沒有找到變量可以代替>
sudo rm -rf site/drop/*.zip 解壓完成後删除掉
touch site/drop/Dockerfile 生成一個dockerfile
echo "FROM microsoft/aspnetcore:2.0" >> site/drop/Dockerfile echo指令是往建立的dockerfile裡面寫入内容
echo "COPY . /publish" >> site/drop/Dockerfile
echo "WORKDIR /publish" >> site/drop/Dockerfile
echo "EXPOSE 5001" >> site/drop/Dockerfile
echo "CMD [\"dotnet\", \"TestDotnetcore.dll\"]" >> site/drop/Dockerfile
sudo docker build --rm -t test_image -f site/drop/Dockerfile site/drop/ 建立一個image 名字叫 test_image
sudo docker ps -q --filter "name=test_netcore" | grep -q . && sudo docker rm -f test_netcore || true 檢視是否有沒有叫 test_netcore的容器有沒有在runing 如果有就幹掉它
sudo docker run --name test_netcore -d -p 5001:5001 test_image:latest 根據test_image啟動一個名字叫test_netcore的容器
if sudo docker images -f "dangling=true" | grep ago --quiet; then sudo docker rmi -f $(sudo docker images -f "dangling=true" -q); fi 檢視是否有<none>的image 把它删掉 因為我們建立image的時候每次都會覆寫是以會産生一些沒有的image
sudo docker images -f "dangling=true" | grep -q . && sudo docker rmi -f $(sudo docker images -f "dangling=true" -q)
sudo rm -rf site/drop 都ok了就删掉drop目錄
以上一切準備好 送出一個commit到master試試
會自動觸發CI 進行 編譯 釋出
接下來Release釋出
釋出打包的成果物在這裡檢視
釋出成功 檢視下docker image
已經成功建立了test_image這個鏡像
容器是也跑成功了
驗證一下
完美!!!不管你用的是騰訊雲還是阿裡雲還是其他雲都是可以的!
遺留問題:
TestDotnetcore.zip是我檢視釋出的日志找到的這個名字目前我還沒有找到變量可以代替
有誰知道幫忙教育下!
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”将是我最大的寫作動力!歡迎各位轉載,轉載文章之後須在文章頁面明顯位置給出作者和原文連接配接,謝謝。