在CentOS7上安装Drone搭建CI持续集成环境

在CentOS7上安装Drone搭建CI持续集成环境

前言

在玩过GitLab + Jenkins后,最近准备来学习Drone CI/CD,看这个云原生的CI Server能给我们带来什么惊喜。

安装前规划

  1. 测试服务器:CentOS7 64位,有互联网访问权限,有root权限;
  2. 代码仓库:考虑到已经非常熟悉GitLab和测试服务器资源有限,这次直接采用GitHub;
  3. CI Server:本次的主角 Drone CI/CD,采用最简单的Docker安装方式;
  4. 域名:在我个人网站上规划一个二级域名drone.xdevops.cn
  5. HTTPS:因为要使用GitHub OAuth,必须使用HTTPS;
  6. Nginx:使用Nginx来做二级域名的反向代理;
  7. Pipeline:使用最简单的Drone Docker Pipeline;
  8. 测试项目:使用我GitHub上的一个Java示例项目,主要测试Spring Boot的REST API功能;

安装过程

配置域名解析

增加一条域名解析的A记录,将drone.xdevops.cn 解析到服务器的公网IP。

安装Docker

使用阿里云Docker Yum源在线安装Docker:

#!/usr/bin/env bash

# remove docker
sudo yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast

sudo yum install -y docker-ce docker-ce-cli containerd.io

# Step 4: 开启Docker服务
sudo systemctl enable docker
sudo systemctl start docker

参见:

拉取Drone Server镜像

docker pull drone/drone:1

添加GitHub OAuth Application

  1. 登录GitHub;

  2. 打开用户设置(Settings),打开Developer settings / OAuth Apps;

  3. 新建一个OAuth App,输入相关信息,比如:

    # Application name
    xdevops-drone
    
    # Homepage URL
    https://drone.xdevops.cn
    
    # Authorization callback URL
    https://drone.xdevops.cn/login
    
  4. 复制Client ID和Client Secret,后面启动Drone Server时需要用到。

生成Drone RPC secret

生成Drone Server和Drone Runner的RPC通信用的secret:

openssl rand -hex 16

启动Drone Server

创建一个start_drone_github_server.sh 脚本用来启动Drone Server for GitHub:

#!/usr/bin/env bash

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITHUB_CLIENT_ID={{DRONE_GITHUB_CLIENT_ID}} \
  --env=DRONE_GITHUB_CLIENT_SECRET={{DRONE_GITHUB_CLIENT_SECRET}} \
  --env=DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
  --env=DRONE_SERVER_HOST=drone.xdevops.cn \
  --env=DRONE_SERVER_PROTO=https \
  --env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
  --publish=9080:80 \
  --publish=9443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

说明:

  • {{DRONE_GITHUB_CLIENT_ID}}{{DRONE_GITHUB_CLIENT_SECRET}}为GitHub OAuth App的Client ID和Client Secret;
  • {{DRONE_RPC_SECRET}}为上面生成的Drone RPC secret;
  • DRONE_SERVER_HOST为Drone Server的域名或IP,这里使用域名,注意域名前面不要写http://https://
  • {{DRONE_ADMIN}}为Drone系统管理员的账号,在这个例子中为GitHub账号;
  • --publish=9080:80--publish=9443:443将容器内的80和443端口映射为服务器的9080和9443端口。

运行bash start_drone_github_server.sh 来启动Drone Server。

配置Nginx反向代理到Drone Server

/etc/nginx/conf.d下创建drone.xdevops.cn.conf配置文件:

upstream drone_server {
    server 127.0.0.1:9080;
}

server {

    listen 80;
    listen [::]:80;

    server_name drone.xdevops.cn;

    location / {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;

        proxy_pass http://drone_server;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_buffering off;

        chunked_transfer_encoding off;
    }
}

重新加载Nginx配置:

nginx -t
nginx -s reload

在浏览器中访问http://drone.xdevops.cn,验证是否可以正常访问。

为Drone站点配置HTTPS

因为GitHub OAuth需要HTTPS,因此还需要为Drone站点配置HTTPS。

如果已经安装了certbot并且之前已经为Nginx的其它站点配置过HTTPS,只需要运行下面的命令来为Drone站点配置HTTPS:

sudo certbot --nginx -d drone.xdevops.cn

再验证站点的HTTPS证书:

再在浏览器中打开https://drone.xdevops.cn来验证是否可以正常访问,以及浏览器是否正常识别HTTPS证书。

参见:

测试Drone Server

  1. 在浏览器中打开https://drone.xdevops.cn;

  2. 首次打开,需要登录GitHub账号来同意授权Drone访问你的GitHub;

安装和运行Drone Runner

采用Docker方式来运行Drone Runner。

拉取Drone Runner的Docker镜像:

docker pull drone/drone-runner-docker:1

创建start_drone_docker_runner.sh脚本来运行Drone Runner:

#!/usr/bin/env bash

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=https \
  -e DRONE_RPC_HOST=drone.xdevops.cn \
  -e DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=runner1 \
  -p 3000:3000 \
  --restart always \
  --name drone-runner \
  drone/drone-runner-docker:1

说明:

  • {{DRONE_RPC_SECRET}}为上面生成的Drone RPC secret;
  • DRONE_SERVER_HOST为Drone Server的域名或IP,这里使用域名,注意域名前面不要写http://https://

运行bash start_drone_docker_runner.sh 来启动Drone Runner。

激活项目

  1. 在Drone中激活需要构建的GitHub项目;
  2. 在Drone中,打开项目的Settings,设置Project visibility为Private。

测试Drone Pipeline

在项目的根目录下创建.drone.yml,并push到GitHub。

kind: pipeline
type: docker
name: default


steps:
  - name: greeting
    image: alpine
    commands:
      - echo Hello, Drone!
      - echo Happy Sunday!

在Drone中查看是否会自动触发构建,并查看构建结果和日志。

测试Drone Pipeline for Java

修改项目根目录下的.drone.yml,并push到GitHub。

kind: pipeline
type: docker
name: ci-java8


steps:
  - name: build
    image: maven:3-jdk-8
    commands:
      - mvn install -s settings.xml -B -U

在Drone中查看是否会自动触发构建,并查看构建结果和日志。

测试项目的根目录有一个settings.xml,用来指向阿里云Maven repo来拉取Maven依赖。

在生产上安装Drone

和上面的安装过程相似,但是需要考虑Drone的性能和高可用。

使用Docker Compose来安装Drone

TODO

使用PostgresSQL替换默认内置的sqllite

TODO

让Drone运行在集群中,可以支持多个Job同时构建

TODO

让Drone构建时使用Maven local repo加快构建

  1. 使用Drone系统管理员账号(参见Drone Server中的DRONE_USER_CREATE参数配置)登录Drone;
  2. 打开Repository的Settings,在Project Settings中勾选“Trusted” (没有看到Trusted选项,说明Drone Server中没有配置正确的DRONE_USER_CREATE参数和指定正确的Drone系统管理员账号);
  3. .drone.yml中定义服务器上的持久卷目录(比如/mnt/data/maven_local_repo),将容器内的Maven local repo (默认为/root/.m2) 挂载到服务器上的该目录,示例:
kind: pipeline
type: docker
name: ci-java8

volumes:
  - name: maven_local_repo
    host:
      path: /mnt/data/maven_local_repo

steps:
  - name: build
    image: maven:3-jdk-8
    volumes:
      - name: maven_local_repo
        path: /root/.m2
    commands:
      - mvn install -s settings.xml -B -U

集成消息通知插件

Drone通过插件可以在流水线中集成消息通知,比如邮件通知、钉钉通知、微信通知和企业微信通知,另外也可以支持Slack通知和RocketChat通知。

参见:

用Mailgun方式在Drone pipeline中集成SMTP邮件通知

Drone特色功能

在代码库中显示构建状态

将Drone提供的一段Markdown代码段放在项目的README.md中,就可以在代码库中显示代码构建状态:

[![Build Status](https://drone.xdevops.cn/api/badges/cookcodeblog/gs-rest-service-maven/status.svg)](https://drone.xdevops.cn/cookcodeblog/gs-rest-service-maven)

方便地支持多分支构建

与Jenkins相比,Drone可以更方便地支持多分支构建,只要将.drone.yml文件放在该分支下,对该分支的改动会自动触发使用该分支下的.drone.yml来构建。

Drone限制

不能手工触发构建,只能自动触发构建

Drone不支持手工触发构建,只能自动触发构建(发生变更时,代码库通过Webhook通知Drone)。

但是可以在Drone中重跑(Restart)已有的构建。

参见:

Troubleshooting

Active repository validation failure

问题:在Drone中激活项目失败

原因:浏览器F12调试时,发现HTTP 500错误,并且Remote Address为127.0.0.1:10808。

解决方法:

  1. 修改Drone Server的启动参数,指定正确的DRONE_SERVER_HOST和DRONE_SERVER_PROTO,比如:
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
  1. 重启Drone Server。

代码变更后,没有自动触发Drone构建

  1. 确保已经在代码库中编写了.drone.yml (注意不是.drone.yaml);

  2. 确保已经安装和运行了Drone Runner;

  3. 打开GitHub上的项目,打开Settings / Webhooks,检查是否有Webhook触发失败的记录,并手工更正Webhook的配置错误;

  4. Drone不支持手工触发,如果修改配置后,需要再次push代码才能触发构建。

untrusted repositories cannot mount host volumes

  1. 确保Drone的Repository Settings的Project settings中已经勾选了“Trusted”;
  2. 如果没有看到“Trusted”选项,检查Drone Server的启动配置参数中有没有配置了正确的DRONE_USER_CREATE参数,并指定了正确的Drone系统管理员账号:
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \

如果Drone连接GitHub,则{{DRONE_ADMIN}}为GitHub账号。

参见:

参考文档

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章