01.29 敏捷與DevOps與Drone CI

CI/CD對開發團隊的重要性

  • 軟件開發是是一個複雜的工業化流程,編碼只是其中的一部分,CI/CD 使得開發流程更加標準化、專業化、自動化和更加穩定,可以在開發過程中提早發現問題,從而提高開發效率,節省大量時間,一個好的CI/CD流程可以大大提高了軟件的價值。CI/CD尤其對追求持續快速響應變化,持續迭代的敏捷開發中流程尤為重要。

CI/CD的技術選型

  • 技術選型對於一個產品一個團隊來說至關重要。對於敏捷團隊的技術選型,往往不需要大而全的方案,更看重輕量高效,易於快速掌握,Drone剛好滿足以上要求,輕量級易於掌握,又能滿足各種需求。Drone原生於docker技術的,充分利用了docker的優勢(如環境隔離、標準化鏡像),輕量高效,非常適合docker技術棧(docker docker-compose swarm k8s),當然也可以用於傳統的scp ssh拷貝源代碼的方式。
  • 如果你本身是一個開發人員,沒有太多CI/CD工具經驗,想快速構建一個CI/CD流程,那麼Drone就是你不二的選擇。如果你之前用過Travis CI,對docker技術有一定的瞭解,那麼就能飛快入門。

Drone優勢

流程定義簡單

配置即為代碼,用配置的方式簡單明瞭定義流程,告別複雜的shell腳本。

  1. Drone採用主流的基於pipline的方式進行流程定義,易於理解
  2. Drone主要採用yaml作為流程描述方式(語言),簡單明瞭易於閱讀。對於複雜的配置可以採用另一種類似json的jsonent 配置方式來定義,好處是可以定義方法函數,易於複用。

部署簡單

  • Drone 部署簡單,可以採用Docker部署的方式,只需要將官網提供的docker啟動命令改幾個參數,直接運行就啟動起來了,整個配置過程只需要幾分鐘。

支持多環境

  • 支持多硬件環境

Drone適合在各種平臺運行,如Linux x64、ARM、ARM64 Windows x64。同時 Drone 文件很小,對系統要求特別低,可以選擇一個很便宜樹莓派機子當服務器,甚至可以拿一臺小米6來作為Drone服務器。

  • 支持多種源代碼管理系統

Drone支持各種多種主流的git源代碼管理系統如 Github, Bitbucket, GitLab GitTea, Drone對各種源代碼管理系統實現基本是一致的, 所以可以很容易的在各種源代碼管理系統之間無痛遷移。

  • 支持各種編程語言編程環境

Drone可以用於任何編程語言、任何數據,任何服務,只要能在docker裡跑的程序都能用Drone。

擴展性好

  • Drone有大量的插件,雖然沒法和 jienkens比但是絕對能滿足你各種需求,最厲害的是他自定義插件非常容易,你可以快速構建自己的插件,一個插件實際就是一個docker鏡像,並且構建插件並不依賴於開發語言,甚至可以用簡單的shell腳本。

提供隔離的運行環境:

這個實際上是利用了docker的特性,在pipline的每一步都是運行在docker中的獨立應用,給你完全的控制,不用考慮各種依賴。

支持分佈式擴展:

  • 可以在多臺機子中部署Drone-agent,實現一個Drone群集,實行Drone的橫向擴展,可以實現多build 多stage的併發執行。Drone同時和k8s實現了深入定製化集成,採用k8s的方式部署,利用k8s的特性實現彈性分佈式擴展。

易於調試

  • 可以實時的以ssh進入container進行調試
  • 可以用Drone exec方法在本地調試,解析執行Drone.yaml
  • 可以直接加斷點在本地debug(後續文章將介紹如何本地debug)。

方便靈活的build流程定義(併發、順序、依賴)

  • Drone可以通過配置 multiple pipeline 和 depends_on來定義各個step stage的依賴關係,執行先後順序,是否同時併發執行。

Drone 敏捷開發 DevOps

  • 敏捷開發打破了需求分析、測試、開發運維之間的一些孤島。敏捷開發使得團隊中各種角色的融合,開發承擔測試的工作,運維的工作,設計工作。
  • 關於什麼是DevOps,有各種的理解,有各種的文章,本人的理解就是,開發過程和運維過程緊密結合,開發更深入的參與運維過程,dev和Ops兩者角色的融合,兩者更好的合作。
  • CI/CD就是從技術層面、工具層面來實現了敏捷開發的理念,實現開發、測試、運維緊密結合。

Drone作為新一代的CI/CD,從工具角度更好的實現了DevOps得理念,從設計和實現上,就原生的支持這種思想。

  1. Drone上手容易,可以使即使沒有CI/CD運維經驗的開發人員快速上手,開發人員就可以快速融入運維過程。
  2. Drone原生於docker實際執行步驟都是在容器中執行,在Drone流程定義中由開發人員執行鏡像製作、定義容器執行相關命令,實際是開發人員實現了基礎運行環境的構建(如數據庫依賴,緩存依賴,代碼依賴),開發人員想對運維人員更瞭解軟件系統,對各種依賴關係更加了解,這項工作由開發人員做,減少了和運維人員的溝通成本,減少了出錯的可能性。
  3. 運維人員作為技術專家角色對開發人員進行運維技術指導,解決擅長的運維配置問題。
  4. 相對傳統的完全由運維人員構建CI/CD,運維人員就不需要了解軟件的各種運行細節,不停的和開發人員各種溝通了,從何提高了工作效率,減少不必要的依賴,開發和運維各自專注於自己擅長的領域,兩者就能更好的合作更好的融合。

安裝

Drone 是採用webhook的觸發方式來執行的,實際就是scm註冊Drone的webhook api,然後當scm事件發生(用戶commit 並push)調用Drone web hook方法 觸發整個流程,Drone必須能被源代碼管理系統發現,Drone服務能被源代碼管理系訪問到,所以如果用github Drone 服務必須是公網可以訪問,如果用gitlab gittea要在同一個內網, 推薦搭建內網的gitlab 或者 gittea方便本地調試。

https://docs.Drone.io/installation 官方安裝文檔

再提供一個 採用非80端口(800端口)的例子,在gitlab中配置的地址也記得寫端口(http://xxxxxxxx:8080/login)

<code>docker run \\
--volume=/var/run/docker.sock:/var/run/docker.sock \\
--volume=/var/lib/Drone:/data \\
--env=Drone_GIT_ALWAYS_AUTH=false \\
--env=Drone_GITLAB_SERVER=https://xxxx.com \\
--env=Drone_GITLAB_CLIENT_ID=df59396ko0992e545e7c3100f854c20bb3e629b6883a95095c27bebd4549f9a2c0 \\
--env=Drone_GITLAB_CLIENT_SECRET=e85747;kiuhc341868285f7fd1f138d585c841d9db93b6e9616r650601bc6l;kb98bd \\
--env=Drone_RUNNER_CAPACITY=2 \\
--env=Drone_SERVER_HOST=docker_scm-01w.dev.activenetwork.com:8000\\
--env=Drone_SERVER_PROTO=http \\
--env=Drone_TLS_AUTOCERT=false \\
--env=Drone_USER_CREATE=username:mwan5,admin:true\\
--publish=8000:80 \\
--publish=443:443 \\
--restart=always \\
--detach=true \\
--name=Drone10 \\
Drone/Drone:1

/<code>

採用golang源代碼,編譯代碼的安裝方式。

go install github.com/Drone/Drone/cmd/Drone-servergo install github.com/Drone/Drone/cmd/Drone-agent或者手動將編譯好的Drone二進制文件 拷貝到的bin目錄下運行 cmd/bin/Drone-server

Cron job

Drone 內置了cron job功能,可以實現定時任務的執行,在特定時間跑build。

提供加密管理服務

Drone提供了完善的密碼管理服務,方便賬戶密碼秘鑰進行管理,可以調用第三方的秘鑰管理服務。

pipeline 簡單例子

<code>kind: pipeline
name: linux-arm

platform:
os: linux
arch: arm

steps:
- name: test
image: golang:1.11
commands:
- go test -v ./...
volumes:
- name:
path: /go
- name: build
image: golang:1.11
commands:
- "go build -ldflags \"-extldflags \\\\\\\\\"-static\\\\\\\\\"\" -o release/linux/arm/Drone-server github.com/Drone/Drone/cmd/Drone-server"
volumes:
- name:
path: /go
when:
event:
- push
- tag
- name: publish_server
image: plugins/docker
settings:
auto_tag: true
auto_tag_suffix: linux-arm
dockerfile: docker/Dockerfile.server.linux.arm
password:
from_secret: docker_password
repo: drone/drone
username:
from_secret: docker_username
when:
event:
- push
- tag
volumes:
- name:
temp: {}
/<code>

測試-> 打包 -> 製作鏡像併發布到鏡像倉庫最後一步可以用scp ssh方式release代碼

或者Drone Helm plugin插件直接發佈到k8s上


分享到:


相關文章: