CI/CD with drone
drone是前google員工2013年開源的一個CI/CD工具,現在已經拉了投資商業化了。企業版是付費的,我們用的是免費版本。
drone引入pipline的概念,整個build過程由多個stage組成,每一個stage都是docker。
- 1.各stage間可以通過共享宿主機的磁盤目錄, 實現build階段的數據共享和緩存基礎數據, 實現加速下次build的目標
- 2.各stage也可以共享宿主機的docker環境,實現共享宿主機的docker image, 不用每次build都重新拉取base image,減少build時間
- 3.可以并發運行。多個build可以并發運行,單機并發數量由服務器cpu數決定。
由開發者負責打包image和流程控制。Docker-in-docker, 這一點非常重要,一切都在掌握之中。相比jenkins的好處是,所有的image都是開發者提供,不需要運維參與在CI服務器上部署各種語言編譯需要的環境。 是DevOps的最佳實踐!
drone可以用docker-compose的方式,單機部署。為了節省服務器成本,我們在一臺云主機上部署了兩套drone,分別是drone0.5對應gitlab的private項目,drone0.7對應github的public項目。
drone secret需要跟環境變量里面的DRONE_HOST和DRONE_TOKEN綁定,所以只能用于drone0.5和drone0.7中的一個!
drone0.5是2017年3月發布的,如果使用了drone secret的話,每次修改了drone.xml都需要在drone的host上執行drone sign重新簽名,非常麻煩。所以gitlab相關的private項目都是用drone0.5維護,drone.yml里面明文保存敏感信息(包括用戶名、密碼、主機名等),沒有用drone secret.?
drone0.7是2017年5月發布的,已經去掉了drone sign的限制。所以github的public項目因為安全考慮,加上了drone secret,drone.yml里面沒有明文保存的敏感信息.
1. drone host:
# docker ps CONTAINER ID IMAGE COMMAND PORTS NAMES 095717b1c348 drone/drone:0.7 "/drone agent" 8002->8000/tcp dronegithub_drone-agent-github_1 fccf7fa84b7c drone/drone:0.7 "/drone server" 8001->8000/tcp dronegithub_drone-server-github_1 bfd48a1032f0 drone/drone:0.5 "/drone agent" 8000/tcp dronegitlab_drone-agent_1 09e9520b8c96 drone/drone:0.5 "/drone server" 8000->8000/tcp dronegitlab_drone-server_12.?web-im的.drome.yml:
workspace:base: /data/apps/optpath: web-impipeline:restore-cache:image: drillster/drone-volume-cacherestore: truemount:- node_modules- tagvolumes:- /data/apps/opt/web-im:/cachebuild:image: node:7.8privileged: truecommands:- npm run build- mkdir -p publish/demo/javascript- cp -r demo/images publish/demo- cp -r demo/stylesheet publish/demo- cp -r demo/javascript/dist publish/demo/javascript/- cp -r demo/javascript/src publish/demo/javascript/- mkdir publish/sdk- cp -r sdk/dist publish/sdk- cp -r sdk/src publish/sdk- cp sdk/*.* publish/sdk- cp -r webrtc publish- cp favicon.ico publish/- cp index.html publish/- cp CHANGELOG.md publish/- cp package.json publish/- cp webpack.config.js publish/- cp README.md publish/- cp .babelrc publish/- cp -rf publish image/docker/webim/webim- echo 'build success'when:branch: [ dev, online ]dockerize-latest:image: plugins/dockerenvironment:- DOCKER_LAUNCH_DEBUG=truedebug: truerepo: docker-registry-cn.easemob.com/kubernetes/im/webimtags: latestregistry: docker-registry-cn.easemob.comsecrets: [ docker_username, docker_password ]dockerfile: image/docker/webim/Dockerfilecontext: image/docker/webim/when:branch: devdeploy-latest:image: docker-registry-cn.easemob.com/kubernetes/im/webim-deploy:latestpull: trueenvironment:- DOCKER_LAUNCH_DEBUG=true- TAG=latestsecrets: [ ssh_key, jumpserver_host, jumpserver_port, sandbox_host ]debug: truewhen:branch: devdockerize-online:image: plugins/dockerenvironment:- DOCKER_LAUNCH_DEBUG=truedebug: truerepo: docker-registry-cn.easemob.com/kubernetes/im/webimtags: ${DRONE_COMMIT:0:7}registry: docker-registry-cn.easemob.comsecrets: [ docker_username, docker_password ]dockerfile: image/docker/webim/Dockerfilecontext: image/docker/webim/when:branch: onlinedeploy-online:image: docker-registry-cn.easemob.com/kubernetes/im/webim-online:latestpull: trueenvironment:- DOCKER_LAUNCH_DEBUG=true- TAG=${DRONE_COMMIT:0:7}secrets: [ ssh_key, jumpserver_host, jumpserver_port, online_host ]debug: truewhen:branch: onlinerollback-online:image: docker-registry-cn.easemob.com/kubernetes/im/webim-rollback:latestpull: trueenvironment:- DOCKER_LAUNCH_DEBUG=truesecrets: [ ssh_key, jumpserver_host, jumpserver_port, online_host ]debug: truewhen:branch: rollbackrebuild-cache:image: drillster/drone-volume-cacherebuild: truemount:- node_modules- tagvolumes:- /data/apps/opt/web-im:/cachenotify:image: drillster/drone-emailport: 25secrets: [ plugin_host, plugin_from, plugin_username, plugin_password ]when:status: [ failure, success ]ev分支提交,會自動build,打包image,push到harbor倉庫,更新沙箱,發郵件通知?
online分支提交,會自動build,打包image,push到harbor倉庫,更新線上,更新image tag(線上回滾需要),發郵件通知?
rollback分支提交,會使用image tag,回滾到上一次的線上版本, 發郵件通知
drone的官方插件在實際使用中有些小問題,一個是pluglins/docker沒法緩存base image,每次build都需要重新拉取。非常浪費時間。二是官方的郵件插件有時會超時。我們都通過自定義的插件給解決了!現在我們組負責的項目,一共有5個微服務都是通過drone來控制CI/CD的,平均每天有十次左右git提交,CI/CD自動化,很快就能收到worktile的部署結果通知,非常方便!
總結
以上是生活随笔為你收集整理的CI/CD with drone的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发,Error: Fai
- 下一篇: Docker inspect 命令