整個基於k8s的pass平臺,關鍵的一部分就是CICD。CICD又是devops的關鍵部分。以前主流的工具是Jenkins。今天主要介紹的是drone。drone用go語言實現的,drone是前google員工2013年開源的一個CI/CD工具,如今已經拉了投資商業化了。企業版是付費的,咱們用的是免費版本。drone更新比較快,以前穩定版本是0.7,今天部署的時候已經更新到0.8了。不過相關的文檔不完善,不少都是coming soon。python
drone引入pipline的概念,整個build過程由多個stage組成,每個stage都是docker。mysql
drone的部署及其簡單,採用docker-compose的方式,相似於gogs。
具體docker-compose.yml以下:git
version: '2' services: drone-server: image: drone/drone:0.8 ports: - 80:8000 - 9000 volumes: - /var/lib/drone:/var/lib/drone/ restart: always environment: - DRONE_OPEN=true - DRONE_HOST=127.0.0.1 - DRONE_GOGS=true - DRONE_GOGS_URL=http://gogs.xxx.com - DRONE_GOGS_PRIVATE_MODE=true - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec drone-agent: image: drone/agent:0.8 restart: always depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_SERVER=drone-server:9000 - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec - DOCKER_API_VERSION=1.24
此處須要注意的是在agent處的 DOCKER_API_VERSION=1.24。在執行pipline的時候,直接報錯github
client is newer than server (client API version: 1.26, server API version: 1.24)golang
這實際上是docker1.12版本的一個issue。解決方案就是在agent裏增長環境變量DOCKER_API_VERSION=1.24。web
基本上就一句命令sql
docker-compose up -d
不熟悉docker-compose命令的能夠具體查看。
至於docker-compose的安裝,我這裏使用pip安裝的。docker
yum install python-pip -y
pip install docker-compose -y
此處輸入的用戶名和密碼是gogs的。drone拿着用戶名和密碼能夠獲取gogs的項目和創建webhook。數據庫
登陸成功之後選擇你想要進行cicd的項目便可。能夠設置各類gogs鉤子的觸發條件,好比push或是merge,tag等。下面是我實際測試的一個項目截圖。緩存
固然必須如今項目根目錄下添加.drone.yml文件。增長本身實際的構建邏輯。
因爲我這邊是一個go項目做爲測試。具體的內容以下:
pipeline: build: image: golang:latest commands: - go get - go build
而後基本上工做就完成了。
看到上面的貼圖其實有報錯信息的,具體的錯誤
fatal: could not read Username for 'http://gogs.xxx.com': No such device or address
exit status 128
其實在實際應用場景中,幾乎全部單位的gogs都是私有倉庫,因此纔會出現這個問題。這個坑我也是查了不少信息都沒有解決,最後是這個issue以及看了drone-git的源碼之後找到了解決方案。實際上在drone0.4以前,是不支持gogs私有倉庫的。而在以後的版本已經解決了這個問題,須要在docker-compose文件中增長 以下配置項:
# Set to true if Gogs is running in private mode. DRONE_GOGS_PRIVATE_MODE=true
以前的docker-compose文件默認啓用的是內部的sqlite數據庫,在生產環境中,咱們須要持久化到生產數據庫。drone支持mysql和pgsql兩個數據庫。這裏我用的是mysql。
新的配置文件以下:
version: '2' services: drone-server: image: drone/drone:0.8 ports: - 80:8000 - 9000 volumes: - /var/lib/drone:/var/lib/drone/ restart: always environment: - DRONE_OPEN=true - DRONE_HOST=127.0.0.1 - DRONE_GOGS=true - DRONE_GOGS_URL=http://gogs.xx.com - DRONE_GOGS_PRIVATE_MODE=true - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec - DRONE_DATABASE_DRIVER=mysql - DRONE_DATABASE_DATASOURCE=root:123456@tcp(xx.205.xx.126:3306)/drone?parseTime=true drone-agent: image: drone/agent:0.8 restart: always depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_SERVER=drone-server:9000 - DRONE_SECRET=f5b8122b5e1cf51da10d3be6e25bf6ec - DOCKER_API_VERSION=1.24
仔細查看drone關於mysql的文檔,須要咱們手動建立drone數據庫。