前文已經實現CI部分,本文繼續以Asp.Net Core實現CD部分。
創建gogs倉庫
首先在gogs創建一個空項目drone-ci-demo,本地新建一個asp.net core項目,並且在與.csproj同級目錄中創建Dockerfile,Dockerfile內容如下:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app COPY . . EXPOSE 29029 ENTRYPOINT ["dotnet","drone-ci-demo.dll"]
編寫.drone.yml
在項目根目錄創建.drone.yml文件,內容如下:
kind: pipeline type: docker name: deployment steps: - name: build image: microsoft/dotnet commands: - dotnet restore - dotnet build -c Release - echo 項目生成成功 - name: publish 2 harbor image: plugins/docker settings: dockerfile: drone-ci-demo/Dockerfile tags: latest insecure: true registry: 192.168.1.137:8072 repo: 192.168.1.137:8072/library/drone-ci-demo username: from_secret: docker_username password: from_secret: docker_password - name: deploy image: appleboy/drone-ssh pull: true settings: host: 192.168.1.172 port: 22 username: root password: 123456 script: - echo start deploy- echo 從harbor拉取docker鏡像 - docker pull 192.168.1.137:8072/library/drone-ci-demo:latest - docker tag 192.168.1.137:8072/library/drone-ci-demo:latest falltakeman/drone-ci-demo:latest - docker run --name drone-ci-demo -p 29029:29029 falltakeman/drone-ci-demo- echo docker容器drone-ci-demo啟動成功 - name: notify image: drillster/drone-email environment: EMAIL_HOST: from_secret: notify_email_host EMAIL_PORT: from_secret: notify_email_port EMAIL_USERNAME: from_secret: notify_email_username EMAIL_PASSWORD: from_secret: notify_email_password settings: from: 888888@163.com recipients: [888888@qq.com] when: status: [failure] branch: [master]
簡單說明一下這個流水線任務。
1、build -- 因為是aspnetcore項目,所以用到dotnet鏡像;
2、publish 2 harbor -- 這個步驟是將docker鏡像推送到docker倉庫,需要用到drone的一個插件docker,這里是推送到了自己的私有docker倉庫harbor,上一篇博文已經記錄了如何使用harbor;
3、deploy -- 用到了另一個插件,appleboy的drone-ssh,首先登陸web server,然后從harbor中拉取鏡像並運行,注意web server需開放對應的端口。關於這個插件的用法可以在drone插件市場查看;
4、通知 -- drone-email的用法也可以在drone插件市場查看,按照需要的參數配置就行了。
寫好.drone.yml之后先不要急於提交,在drone項目倉庫中啟用drone-ci-demo,在settings中添加一些secrets,secret name就是上述.drone.yml中的from_secret。

項目部署
由於web server在另一台服務器,私有鏡像倉庫harbor沒有設置https,從harbor拉取代碼需要配置docker daemon,添加harbor地址並重啟docker。
sudo vi /etc/docker/daemon.json
{ "insecure-registries":[ "192.168.1.137:8072" ] }
sudo systemctl restart docker
都准備好之后就可以提交代碼了,代碼提交之后drone立即就開始干活了。第一次build需要很長時間,因為用到了microsoft/dotnet這個鏡像,build階段可以用更小一點的鏡像替換掉。
build成功之后,打包docker鏡像並推送到harbor階段失敗了,拋出了兩行warning:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解決辦法:
vi /etc/sysctl.conf
添加如下兩行內容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
重新加載配置
sysctl -p
重新運行一下pipeline任務



