DevOps | CI/CD 实践: Drone + Docker + Bitbucket Server 服务部署
Contents
经过几天的摸索之后,开始动手搭建一下 CI/CD 的环境吧!实践内容涉及:
- 怎么用 Docker 搭建 Bitbucket Server
- 怎么启动 Drone Service
- 实践过程中踩过那些坑
- ……
说明
开始之前先了解一下实践环境及需要的一些准备工作
实践环境
实践环境下,Bitbucket Server 采用 Docker 自行搭建,避免影响内网开发。
- OS: CentOS Linux release 7.5.1804 (Core)
- Docker:18.06.0-ce
- Drone: Docker image
- drone/server:0.8.6
- drone/agent:0.8.6
- Bitbucket: Docker image
- atlassian/bitbucket-server:5.10.2 (与内网 Bitbucket Server 版本保持一致)
- postgres:9.6 (Bitbucket Server 的数据库)
拉取镜像
提前
pull
好相关镜像(假设 Docker 已安装 OK),加快构建过程:
Drone:
|
|
Bitbucket:
|
|
实践步骤
- Step1: 部署 Bitbucket Server
- Step2: 创建
Application Link(OAuth App)
with Bitbucket Server - Step3: 部署 Drone CI Service
- Step4: 创建 Demo-Project(Golang App) for testing Drone CI
部署 Bitbucket Server
创建 Application Links(OAuth App) with Bitbucket Server
从 官方文档 可知, 开启支持 Bitbucket Server 的 Drone CI Service 需要设置如下环境变量:
Configuration:
ENV Name Description DRONE_STASH_URL bitbucket server address DRONE_STASH_CONSUMER_KEY oauth1 consumer key DRONE_STASH_CONSUMER_RSA oauth1 private key file path DRONE_STASH_GIT_USERNAME service account username DRONE_STASH_GIT_PASSWORD service account password
Note:
但是
, 在配置的过程中发现我们现在使用的 Bitbucket Server(5.10.2) 并不支持创建 OAuth App, 官方文档也没给出详细的说明… 所以呢,只能去找找看有没有可代替的解决方案了 ==> Google。
Google 过程:
找找 Drone 的 Issues & Docs,看看有没有相似的问题提出
找找 Atlassian 的开发文档, 看看相关说明
最终,了解到 Bitbucket Server 中可以通过创建 Application Links 来替代 OAuth,但是这个整合过程中也踩了很多的坑… 故,新写了一篇文章总结创建 Application Links with Bitbucket Server 的过程.
部署 Drone CI Service
在上面两部分已经搭建好了 Bitbucket Server 和 Application Links, 并取得了配置 Drone Server 的必要参数,接下来就可以部署 Drone CI Service 了。
Note: 建议先通读以下文档内容,然后再去配置启动文件。 这样会避免踩坑哇。
Drone 本身分为了 Server 和 Agent 两个服务:
- drone-server:Drone 服务器端,用来处理任务分发。可以通过 environment 指定环境变量来使用不同的版本控制系统。
- drone-agent:Drone 代理客户端,用来执行自动化构建任务。
为了方便测试这里将 Agent 与 Server 端都放在一个 docker compose 中启动。
创建部署 Drone Server 的数据目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$ mkdir -p /home/docker/drone && cd /home/docker/drone # 创建需要挂载的 Volumes 数据目录 $ mkdir drone-server-data # 创建密钥文件存放目录 $ mkdir bitbucket # 把上面生成的 key.pem、key.pub 文件拷贝到该目录下 $ tree bitbucket bitbucket |-- key.pem |-- key.pub 0 directories, 2 files
- 创建 docker-compose.yml
1
$ touch docker-compose.yml
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
version: '3' services: drone-server: image: drone/drone:0.8.6 container_name: drone-server ports: - 8000:8000 - 9000:9000 volumes: - ./bitbucket/key.pem:/home/drone/bitbucket/key.pem # 需自己配置 - ./drone-server-data:/var/lib/drone # 需自己配置 restart: always environment: - DRONE_OPEN=true - DRONE_HOST=<http://your-domain.com> # 需自己配置 - DRONE_STASH=true - DRONE_STASH_GIT_USERNAME=<set_by_yourself> # 需自己配置 - DRONE_STASH_GIT_PASSWORD=<set_by_yourself> # 需自己配置 - DRONE_STASH_CONSUMER_KEY=<set_by_yourself> # 需自己配置(注意:和设置 Bitbucket Server's Application Links 时的 Consumer Key 字段一致) - DRONE_STASH_CONSUMER_RSA=/home/drone/bitbucket/key.pem # 需自己配置 - DRONE_STASH_URL=http://<bitbucket_host>:7990 # 需自己配置 - DRONE_SECRET=<set_by_yourself> # 需自己配置(注意:drone-server & drone-agent 需一致) drone-agent: image: drone/agent:0.8.6 container_name: drone-agent command: agent restart: always depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_SERVER=drone-server:9000 - DRONE_SECRET=<set_by_yourself> # 需自己配置(注意:drone-server & drone-agent 需一致) volumes: drone-server-data:
Note:
- DRONE_HOST 的格式一定要注意:
<scheme>://<host>
, scheme: http | https
- 启动 Drone 服务
这里启动时加
--verbose
参数从前台启动,可获取更多的日志信息,方便测试1
$ docker-compose --verbose up
访问
http(s)://<_drone_host_>:8000
,进入到 Drone 的管理系统- 在 Drone 的控制面板中开启需要执行构建(构建按钮开启)的项目, 如果没有项目,需要现在 Bitbucket Server 创建,然后同步过来即可。
- 然后跳转到该项目的设置页面,配置一下构建选项
至此,所有的服务部署 OK。接下来就通过一个简单的 Demo Project 测试一下工作流能否正常触发执行。 😄
创建 Demo-Project(Golang)
这里通过 Golang 编写一个简单的测试项目
- 目录结构
|
|
源码内容
1 2
# 进入项目根目录,初始化 Go Modules $ go mod init cicd
1 2 3 4 5 6
// main.go package main func main() { println("CI/CD Test Project") }
创建
.drone.yml
文件- Drone CI 对一个项目进行 CI 构建取决于两个因素,第一必须保证该项目在 Drone 控制面板中开启了构建(构建按钮开启),第二保证项目根目录下存在
.drone.yml
;满足这两点后每次提交 Drone 就会根据 .drone.yml 中配置进行按步骤构建;本示例中 .drone.yml 配置如下
1 2 3 4 5 6 7
pipeline: backend: image: golang commands: - go get - go build . - go test
Note: 关于 .drone.yml 的说明随后会单独写一篇总结文档,这里先走通整个流程,体验一下。
- 提交代码
将此项目推送到 Bitbucket Server 就会触发 Drone CI 自动构建
❓ ❓ ❓ 但是,我在这里遇到了问题,项目
push
成功后,Drone CI 并没有触发自动构建,是什么原因呢? 结果如下图:看来是没触发自动构建,猜测应该问题处在 Webhook 上了,即 Bitbucket Server 接收完
push
请求后并没有发送回调请求给 Drone Server, 所以它当然不会做什么呀! 嗯,Google 一下。Note: 问题的原因和解决办法在下面的 FAQ 中。
- Drone CI 执行结果
至此,完。
FAQ
- 提交代码到 Bitbucket Server 时,Drone CI 没有出发自动构建
Google 到的与该问题相关的链接:
- Bitbucket Server requires webhooks addon installed/enabled
- repository not building when connected to bitbucker server on drone
- [SOLVED] Bitbucket Server: no webhooks are created and no builds are starting
- Drone does not support Bitbucket Server (Stash) Pull Requests
- (solved) Drone fails to add webhook to bitbucket server
- Does not create web hooks with Bitbucket Server v4.13.0
问题原因:Bitbucket Server 接收到 Push 等请求后,并没有发送 webhook 请求到 Drone Server,所以没有触发自动构建;需要安装 Web Post Hooks for Bitbucket Server 插件解决。
安装插件步骤:下载插件 => 转到 Bitbucket Server Settings => 找到 Manage add-ons => 选择 Upload add-ons (Note: 安装成功后需要在:Repository settings => Hooks => Post receive 栏启用该插件),启用步骤如下:
插件安装成功后,需要从 Drone Server 的管理界面
注销
重新登陆。Drone 通过 OAuth 认证或账号密码登陆代码仓库后,获得完整的控制权。在 Drone 的 web 后台管理页面激活 Repo 后,Drone 调用代码仓库的 API 给 Repository 增加一个 webhook, 即设置Post-Receive WebHooks
的 URL (http://your_domain:8000/hook?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0IjoiU09GL2NpY2QtcHJvamVjdCIsInR5cGUiOiJob29rIn0.ijkTBJo8dmNvQTYUju2MmjBgQcJrHW6qy878shLtaM8)(Note: 设置 webhooks 需要管理员权限)图示如下:
-
Push 代码测试,如果仍然失败,尝试重启 Bitbucket Server & Drone Service, 重启 Drone Service 时记得清除下容器的数据卷数据(删除 drone.sqlite)
See Also
Thanks to the authors 🙂
- Drone CI 对一个项目进行 CI 构建取决于两个因素,第一必须保证该项目在 Drone 控制面板中开启了构建(构建按钮开启),第二保证项目根目录下存在