个人博客和项目使用了两年多jenkins去完成 ci/cd,确实解放了双手。但是最近 jenkns 的安全漏洞越来越频繁,前段时间publish over ssh
因为安全漏洞被禁用了很久。也尝试用 go 去实现一款 ci/cd 工具,最近偶然发现drone这么一款好用的工具,果断全部迁移过去
也许你需要的 jenkins 部署教程
也许有人会问,为啥不用 Github action、CircleCI、TravisCI、TeamCity
- 有运行时长限制(虽然个人项目应该用不完,但是强迫症不能忍受)
- 也有用github action,比如npm 自动发包就用的github action。deploy到国内服务器网速问题
几个优点
- 开源,强大的社区支持
- 基础
docker
,一切都在docker
上运行 - 支持跟市场上绝大部分git仓库集成
- 基于
yaml
配置 - 编写插件即编写一个docker镜像,可使用你喜欢的语言(还是
go
好用
drone start
我们使用docker-compose 安装 drone server和和runner
- 首先创建网络
docker network create drone
- 创建
docker-compose.yml
Drone 的部署分为 Server(Drone-Server) 和 Agent(Drone-agent):
- Server端:负责后台管理界面以及调度
- Agent端:负责具体的任务执行
为了便于管理容器,采用docker-compose.yml
去部署
yamlversion: '3.9' networks: drone: name: drone driver: bridge services: db: image: postgres:latest container_name: drone_db restart: always networks: - drone ports: - '5432:5432' environment: - POSTGRES_USER=drone - POSTGRES_PASSWORD=drone - POSTGRES_DB=drone volumes: - /volumes/drone/db:/var/lib/postgresql/data server: image: drone/drone:2 container_name: drone_server restart: always networks: - drone ports: - '80:80' - '443:443' environment: - DRONE_TLS_AUTOCERT=true - DRONE_SERVER_PROTO=https - DRONE_SERVER_HOST=https://drone.your-domain.com - DRONE_RPC_SECRET=DRONE_RPC_SECRET - DRONE_WEBHOOK_ENDPOINT=http://webhook:3000 - DRONE_WEBHOOK_SECRET=add8b88f1a7ff15cbcb5bdb6bd081b70 - DRONE_DATABASE_DRIVER=postgres - DRONE_WEBHOOK_EVENTS=build:created,build:updated - DRONE_DATABASE_DATASOURCE=postgres://drone:drone@db/drone?sslmode=disable - DRONE_USER_CREATE=username:zzfn,admin:true - DRONE_USER_CREATE=username:prometheus,admin:true,machine:true,token:c576f2bd2d218d1ffd583c2db868d8c7 - DRONE_GITHUB_CLIENT_ID=DRONE_GITHUB_CLIENT_ID - DRONE_USER_FILTER=zzfn,prometheus - DRONE_GITHUB_CLIENT_SECRET=DRONE_GITHUB_CLIENT_SECRET volumes: - /var/lib/drone:/data depends_on: - db runner: image: drone/drone-runner-docker:1 container_name: drone_runner restart: always networks: - drone ports: - '3000:3000' environment: - DRONE_RUNNER_NAME=docker-runner - DRONE_RUNNER_CAPACITY=2 - DRONE_RPC_PROTO=http - DRONE_RPC_HOST=server - DRONE_RPC_SECRET=DRONE_RPC_SECRET volumes: - /var/run/docker.sock:/var/run/docker.sock depends_on: - server webhook: image: registry.cn-shanghai.aliyuncs.com/zzf2001/drone-webhook:latest container_name: drone_webhook restart: always networks: - drone ports: - '6000:3000' environment: - DRONE_SECRET=DRONE_SECRET - PLUGIN_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx - PLUGIN_SECRET=PLUGIN_SECRET - PLUGIN_BASE=https://drone.your-domain.com/
- 替换
DRONE_RPC_SECRET
DRONE_GITHUB_CLIENT_ID
DRONE_GITHUB_CLIENT_SECRET
- 运行容器
docker compose up -d
F&Q
- 在迁移数据库后自增id会冲突
sqlSELECT setval('orgsecrets_secret_id_seq', 100); //找出最大值设置 SELECT setval('orgsecrets_secret_id_seq', COALESCE((SELECT MAX(secret_id)+1 FROM orgsecrets), 1), false);
插件系统
插件其实就是一个个的docker容器,使用插件也很简单
yamlkind: pipeline type: docker name: default steps: - name: webhook image: zzfn/webhook settings: url: http://hook.zzfn.com method: post body: | hello world
如果官方插件市场没有我们需要的插件我们可以自己去实现一个插件,我已经实现了4个插件,大家可以使用
- https://github.com/drone-plugin
- 环境变量
- 自定义插件最好使用go实现