持續集成交付部署是什麼意思,它給咱們帶來什麼好處?
先貼一張圖
持續集成(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是我查看發佈的日誌找到的這個名字目前我尚未找到變量能夠代替
有誰知道幫忙教育下!