前文已經實作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: [email protected]
recipients: [[email protected]]
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任務