经过几天的摸索之后,开始动手搭建一下 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:

1
2
$ docker pull drone/server:0.8.6
$ docker pull drone/agent:0.8.6

Bitbucket:

1
2
$ docker pull atlassian/bitbucket-server:5.10.2
$ docker pull postgres:9.6

实践步骤

  • 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。

部署 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
3
4
5
$ tree cicd-project
cicd-project/
|-- .drone.yml
|-- go.mod
`-- main.go