当前位置:   article > 正文

[小团队自动化] (一) Drone CI For Github —— 打造自己的CI/CD工作流

drone转github

(一) Drone CI For Github —— 打造自己的CI/CD工作流


了解Drone

Drone是一种基于容器技术的持续交付系统。Drone使用简单的YAML配置文件(docker-compose的超集)来定义和执行Docker容器中的Pipelines。

Drone与流行的源代码管理系统无缝集成,包括GitHub,GitHub Enterprise,Bitbucket等。


Drone CI For Github

让我们一起开始实践 Drone 的部署和使用

准备工作

在这里,我为 Drone Server 使用的域名是 dronetest.yiranzai.top

了解Docker-compose

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

写了一个小Demo帮助你更快了解Docker-compose

申请一个Github OAuth Application

Github OAuth Application是为了授权 Drone Server 读取你的 Github 信息。

参照我之前写的Demo 一张图搞定 Github Create an OAuth Application

记下生成的 Client IDClient Secret

编写docker-compose.yml

我们需要

  • drone-server(中央Drone服务器)
  • drone-agent (接收来自中央Drone服务器的指令以执行构建管道)
  • mysqldrone 默认的数据存储是sqllite3,这里我们使用MySQL)
  • nginx (使用 nginx 来做对外的服务代理,不要让 drone-server 直接对外提供服务)

参考:

  1. version: "3.7"
  2. services:
  3. nginx:
  4. image: nginx:alpine
  5. container_name: drone_nginx
  6. ports:
  7. - "80:80"
  8. restart: always
  9. networks:
  10. - dronenet
  11. mysql:
  12. image: mysql:5.7
  13. restart: always
  14. container_name: drone_mysql
  15. environment:
  16. - MYSQL_ROOT_PASSWORD=root_password
  17. - MYSQL_DATABASE=drone
  18. - MYSQL_USER=drone
  19. - MYSQL_PASSWORD=drone_password
  20. networks:
  21. - dronenet
  22. volumes:
  23. - /path/to/conf/my.cnf:/etc/mysql/my.cnf:rw
  24. - /path/to/data:/var/lib/mysql/:rw
  25. - /path/to/logs:/var/log/mysql/:rw
  26. drone-server:
  27. image: drone/drone:1.0.0-rc.5 #不要用latest,latest并非稳定版本
  28. container_name: dronetest_server
  29. networks:
  30. - dronenet
  31. volumes:
  32. - ${DRONE_DATA}:/var/lib/drone/:rw
  33. - /var/run/docker.sock:/var/run/docker.sock:rw
  34. restart: always
  35. environment:
  36. - DRONE_DEBUG=true
  37. - DRONE_DATABASE_DATASOURCE=drone:drone_password@tcp(drone_mysql:3306)/drone?parseTime=true #mysql配置,要与上边mysql容器中的配置一致
  38. - DRONE_DATABASE_DRIVER=mysql
  39. - DRONE_GITHUB_SERVER=https://github.com
  40. - DRONE_GITHUB_CLIENT_ID=${Your-Github-Client-Id} #Github Client ID
  41. - DRONE_GITHUB_CLIENT_SECRET=${Your-Github-Client-Secret} #Github Client Secret
  42. - DRONE_RUNNER_CAPACITY=2
  43. - DRONE_RPC_SECRET=YOU_KEY_ALQU2M0KdptXUdTPKcEw #RPC秘钥
  44. - DRONE_SERVER_PROTO=http #这个配置决定了你激活时仓库中的webhook地址的proto
  45. - DRONE_SERVER_HOST=dronetest.yiranzai.top
  46. - DRONE_USER_CREATE=username:yiranzai,admin:true #管理员账号,一般是你github用户名
  47. drone-agent:
  48. image: drone/agent:1.0.0-rc.5
  49. container_name: dronetest_agent
  50. restart: always
  51. networks:
  52. - dronenet
  53. depends_on:
  54. - drone-server #依赖drone_server,并在其后启动
  55. volumes:
  56. - /var/run/docker.sock:/var/run/docker.sock:rw
  57. environment:
  58. - DRONE_RPC_SERVER=http://drone_server #drone用的http请求包,url一定要写上协议才能支持
  59. - DRONE_RPC_SECRET=YOU_KEY_ALQU2M0KdptXUdTPKcEw #RPC秘钥,要与drone_server中的一致
  60. - DRONE_DEBUG=true
  61. networks:
  62. dronenet:
  63. 复制代码

运行服务

创建容器和网络

  1. $ docker-compose up -d
  2. Creating drone_mysql ... done
  3. Creating dronetest_server ... done
  4. Creating drone_nginx ... done
  5. Creating dronetest_agent ... done
  6. $ docker-compose ps
  7. Name Command State Ports
  8. ----------------------------------------------------------------------------
  9. drone_mysql docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
  10. drone_nginx nginx -g daemon off; Up 0.0.0.0:80->80/tcp
  11. dronetest_agent /bin/drone-agent Up
  12. dronetest_server /bin/drone-server Up 443/tcp, 80/tcp
  13. 复制代码

编写 nginx 配置文件

  1. $ docker-compose exec nginx ash
  2. # vim /etc/nginx/conf.d/drone.conf
  3. server {
  4. listen 80;
  5. server_name dronetest.yiranzai.top;
  6. location / {
  7. proxy_pass http://dronetest_server;
  8. proxy_set_header Host $host;
  9. proxy_set_header X-Real-IP $remote_addr;
  10. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11. }
  12. }
  13. # nginx -s reload
  14. 复制代码

访问服务

先有一个OAuth验证,然后会开始同步你所有的仓库。

写到这里,Drone CI for Github 就已经搭建成功了,是不是很开心,是不是很满足?结束了吗?并没有!

我们还要测试一下 Drone Server ,测试服务的可用性。

说干就干,开搞。

验证服务

没有经过实践的项目不是可用的项目

创建空仓库,并同步到 Drone 激活

仓库怎么创建就不再赘述,在这里,我创建一个名为 dronetest 的仓库,并回到 Drone 同步仓库

  1. 同步仓库

  1. 激活仓库

激活以后,检查一下GIthub仓库的Webhooks

  1. 添加 Secrets

    在这里我创建了两个Secret name: yiranzai word: Hello World!

编写 .drone.yml

这里由于服务器配置是敏感信息,我们需要用到Secret来存储

事先创建好登陆部署服务器所需要的 host username rsa port 以及要部署的路径deploy_path

参考

  1. ---
  2. kind: pipeline
  3. name: drone
  4. workspace:
  5. base: /app
  6. path: git/drone
  7. steps:
  8. - name: build
  9. image: node:alpine
  10. volumes:
  11. - name: webroot
  12. path: /wwwroot
  13. commands:
  14. - /bin/sh bash.sh
  15. environment:
  16. host:
  17. from_secret: host
  18. port:
  19. from_secret: port
  20. abc: abctest
  21. - name: deploy
  22. image: appleboy/drone-scp
  23. when:
  24. status:
  25. - success
  26. settings:
  27. host:
  28. from_secret: host
  29. port:
  30. from_secret: port
  31. key:
  32. from_secret: rsa
  33. username:
  34. from_secret: username
  35. target:
  36. from_secret: deploy_path
  37. source: ./*
  38. volumes:
  39. - name: webroot
  40. host:
  41. path: /opt
  42. - name: cache
  43. host:
  44. path: /tmp/cache
  45. trigger:
  46. branch:
  47. - master
  48. event:
  49. - push
  50. 复制代码

编写 bash.sh 打印变量

  1. echo $host
  2. echo $abc
  3. echo $port
  4. 复制代码

推到仓库,查看效果

  1. push to repo
  1. git init
  2. git add .;git commit -m 'init test'
  3. git remote add origin git@github.com:yiranzai/dronetest.git
  4. git push -u origin master
  5. 复制代码
  1. 查看 DroneACTIVITY FEED

如果成功就会如下图所示

如果失败,会有错误信息

这里是由于我用的 node 镜像是 node:alpine ,没有 bash

  1. 去服务器检查一下

    看到 bash.sh.drone.yml 都被上传到这里(只是测试,不是真的让你这么干)

  1. $ pwd
  2. /home/www
  3. $ ll -a
  4. total 40
  5. drwx------ 4 www www 4096 Feb 20 04:23 .
  6. drwxr-xr-x. 4 root root 4096 Feb 20 03:55 ..
  7. -rw------- 1 www www 61 Feb 19 03:00 .bash_history
  8. -rw-r--r-- 1 www www 18 Oct 30 13:07 .bash_logout
  9. -rw-r--r-- 1 www www 193 Oct 30 13:07 .bash_profile
  10. -rw-r--r-- 1 www www 231 Oct 30 13:07 .bashrc
  11. -rw-r--r-- 1 www www 35 Feb 20 04:23 bash.sh
  12. -rw-r--r-- 1 www www 812 Feb 20 04:23 .drone.yml
  13. drwxr-xr-x 8 www www 4096 Feb 20 04:23 .git
  14. drwxr-xr-x 2 www www 4096 Feb 19 02:40 .ssh
  15. 复制代码

总结

Drone CI for Github的部署到此就真的结束了,一路走来,踩了不少坑,Drone的文档你慢慢看了以后就会发现有多烂,烂到心累想哭,许多在Demo中出现的变量在参考手册中找不到,完全不知道什么含义,只能靠瞎猜和摸索。

总结犯过的错误和坑

  • yaml 格式的文件后缀是 yml (我智障)
  • drone-server 一定要设置一个管理员
  • drone-server 中的变量 DRONE_SERVER_PROTODRONE_SERVER_HOST 决定了你仓库中 webhook 的地址,如果你的域名做了 http to https ,而且你的DRONE_SERVER_PROTOhttp,将会产生301重定向,methodpost 转成 get,会发生error 405
  • drone 是用GO语言开发的,drone 使用的http 包,不支持没写协议的 url,例如 dronetest.yiranzai.top 不能被识别,要写成 http(s)://dronetest.yiranzai.top
  • 建议测试阶段打开debug,方便部署和调试

系列文章

END

不说了,我去调整心态了并生产BUG了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/832541
推荐阅读
相关标签
  

闽ICP备14008679号