持續集成交付部署是什么意思,它給我們帶來什么好處?
先貼一張圖

持續集成(Continuous Integration)
- 持續集成強調開發人員提交了新代碼之后,立刻進行構建、(單元)測試(這個要看情況了是否需要)
持續交付(Continuous Delivery)
- 持續交付在持續集成的基礎上,將集成后的代碼部署到更貼近真實運行環境的「類生產環境」(production-like environments)中。比如,我們完成單元測試后,可以把代碼部署到連接數據庫的 Staging 環境中更多的測試。如果代碼沒有問題,可以繼續手動部署到生產環境中。
持續部署(Continuous Deployment)
- 持續部署則是在持續交付的基礎上,把部署到生產環境的過程自動化。
減少重復勞動 提高效率
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是我查看發布的日志找到的這個名字目前我還沒有找到變量可以代替
有誰知道幫忙教育下!