4

DevOps | CI/CD 实践: Drone + Docker + Bitbucket Server 服务部署

 2 years ago
source link: https://ijayer.github.io/post/tech/devops/cicd/20180926-cicd-03-drone-02-practices/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

DevOps | CI/CD 实践: Drone + Docker + Bitbucket Server 服务部署

2018-09-26 2819 words 6 mins read spinner.svg times read

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

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

Bitbucket:

$ 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 的数据目录

    $ 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
    $ touch docker-compose.yml

    内容如下:

    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 参数从前台启动,可获取更多的日志信息,方便测试

    $ docker-compose --verbose up
  • 访问 http(s)://<_drone_host_>:8000,进入到 Drone 的管理系统

    • 在 Drone 的控制面板中开启需要执行构建(构建按钮开启)的项目, 如果没有项目,需要现在 Bitbucket Server 创建,然后同步过来即可。
    • 然后跳转到该项目的设置页面,配置一下构建选项

至此,所有的服务部署 OK。接下来就通过一个简单的 Demo Project 测试一下工作流能否正常触发执行。 😄

创建 Demo-Project(Golang)

这里通过 Golang 编写一个简单的测试项目

$ tree cicd-project
cicd-project/
|-- .drone.yml
|-- go.mod
`-- main.go
  • # 进入项目根目录,初始化 Go Modules
    $ go mod init cicd
    // main.go
    package main
    
    func main() {
        println("CI/CD Test Project")
    }
  • 创建 .drone.yml 文件

    • Drone CI 对一个项目进行 CI 构建取决于两个因素,第一必须保证该项目在 Drone 控制面板中开启了构建(构建按钮开启),第二保证项目根目录下存在 .drone.yml;满足这两点后每次提交 Drone 就会根据 .drone.yml 中配置进行按步骤构建;本示例中 .drone.yml 配置如下
    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 执行结果

    至此,完。

    1. 提交代码到 Bitbucket Server 时,Drone CI 没有出发自动构建
    • Google 到的与该问题相关的链接:

    • 问题原因: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 栏启用该插件),启用步骤如下:

    • Push 代码测试,如果仍然失败,尝试重启 Bitbucket Server & Drone Service, 重启 Drone Service 时记得清除下容器的数据卷数据(删除 drone.sqlite)

    See Also

    Thanks to the authors 🙂

Author zher

LastMod 2018-11-02

License CC BY-NC-ND 4.0

DevOps | Dockerizing Bitbucket Server & Jira & Confluence DevOps | Drone 的基本概念

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK