文章目录

  • 在CentOS7上安装Drone搭建CI持续集成环境
    • 前言
    • 安装前规划
    • 安装过程
      • 配置域名解析
      • 安装Docker
      • 拉取Drone Server镜像
      • 添加GitHub OAuth Application
      • 生成Drone RPC secret
      • 启动Drone Server
      • 配置Nginx反向代理到Drone Server
      • 为Drone站点配置HTTPS
      • 测试Drone Server
      • 安装和运行Drone Runner
      • 激活项目
      • 测试Drone Pipeline
      • 测试Drone Pipeline for Java
    • 在生产上安装Drone
      • 使用Docker Compose来安装Drone
      • 使用PostgresSQL替换默认内置的sqllite
      • 让Drone运行在集群中,可以支持多个Job同时构建
      • 让Drone构建时使用Maven local repo加快构建
      • 集成消息通知插件
    • Drone特色功能
      • 在代码库中显示构建状态
      • 方便地支持多分支构建
    • Drone限制
      • 不能手工触发构建,只能自动触发构建
    • Troubleshooting
      • Active repository validation failure
      • 代码变更后,没有自动触发Drone构建
      • untrusted repositories cannot mount host volumes
    • 参考文档

在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 fastsudo yum install -y docker-ce docker-ce-cli containerd.io# Step 4: 开启Docker服务
sudo systemctl enable docker
sudo systemctl start docker

参见:

  • CentOS7用阿里云Docker Yum源在线安装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 bashdocker 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://www.ssllabs.com/ssltest/analyze.html?d=drone.xdevops.cn

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

参见:

  • 在CentOS7上使用Letsencrypt为Nginx站点配置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 bashdocker 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: defaultsteps:- name: greetingimage: alpinecommands:- echo Hello, Drone!- echo Happy Sunday!

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

测试Drone Pipeline for Java

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

kind: pipeline
type: docker
name: ci-java8steps:- name: buildimage: maven:3-jdk-8commands:- 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-java8volumes:- name: maven_local_repohost:path: /mnt/data/maven_local_reposteps:- name: buildimage: maven:3-jdk-8volumes:- name: maven_local_repopath: /root/.m2commands:- 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)已有的构建。

参见:

  • https://discourse.drone.io/t/builds-are-not-being-triggered/340

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账号。

参见:

  • https://docs.drone.io/server/reference/drone-user-create/
  • https://docs.drone.io/server/user/admin/

参考文档

  • https://docs.drone.io/server/provider/github/
  • https://docs.drone.io/quickstart/docker/
  • https://docs.drone.io/pipeline/docker/overview/
  • https://0-8-0.docs.drone.io/setup-with-nginx/
  • 在Ubuntu上安装Drone持续集成环境
  • How To Install and Configure Drone on Ubuntu 16.04

在CentOS7上安装Drone搭建CI持续集成环境相关推荐

  1. centos下搭建Jenkins持续集成环境(安装jenkins)

    centos下搭建Jenkins持续集成环境(安装jenkins) 1.安装JDK yum install -y java 2.安装jenkins 添加Jenkins库到yum库,Jenkins将从这 ...

  2. Jenkins 搭建C++持续集成环境

    简介 本文主要介绍如何通过 Jenkins 搭建 C++的持续集成环境.最后达到的效果是每天00:00 - 08:00之间构建.测试和打包一次工程. 开发环境为 VS2015,测试工具为 CppUni ...

  3. CI持续集成环境搭建(3)--git的安装与搭建

    https://blog.51cto.com/superleedo/2057841 1. 安装git *Note:不要用yum安装git, yum源安装git最新版本是1.8.3,该版本太老,之后用g ...

  4. windows下使用Jenkins搭建CI持续集成平台(版本源码管理使用SVN)

    首先从官网http://jenkins-ci.org/下载 Java Web Archive (.war) 例如我保存到 D:\jenkins\jenkins.war 运行Jenkins需要JRE的支 ...

  5. 搭建Jenkins持续集成环境

    目录 Jenkins介绍 Jenkins使用场景 安装Jenkins,以war包安装为例 1. 下载Jenkins 2. 启动Jenkins,初始化Jenkins Jenkins介绍 Jenkins提 ...

  6. jenkins下搭建c++持续集成环境

    运行环境为centos 5.8 1.下载tomcat,并解压 2.下载jenkins,把jenkins.war放到tomcat的webapp目录下 3.在tomcat的bin目录下执行./startu ...

  7. 在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境

    本文以部署 Spring boot + Maven 项目为例,使用码云作为代码托管仓库,在 CentOS 7 上搭建 Jenkins 持续集成环境. 1. 准备工作 1.1 安装 Java 环境 Je ...

  8. Jenkins+Maven+SVN快速搭建持续集成环境

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面看看我们是如何几分钟就快速搭建一个持续集成环境吧. 假设我们目前已经有2个maven项目:entities(J ...

  9. GitLab 与 Jenkins 结合构建持续集成环境

    持续集成概述及运行流程 CI/CD介绍 把开发工作流程分为以下几个阶段: 编码 → 构建 → 集成 → 测试 → 交付 → 部署 正如你在上图中看到,持续集成(Continuous Integrati ...

最新文章

  1. 中国百万美元富翁财富
  2. 喜报!清华社《晓肚知肠:肠菌的小心思》荣获“2018年度中国好书”奖
  3. 用Eclipse 开发Dynamic Web Project应用程序
  4. Mybatis解析动态sql原理分析
  5. java 获取操作系统临时目录_获取当前操作系统的临时目录对象或者地址
  6. celery java_Celery详解
  7. ps ico插件_Photoshop 2020特别版 内置多款实用插件
  8. python字典和集合对象可以进行索引操作_python字典和列表的高级应用
  9. 东方财富代码选股_东方证券APP评测:智能选股方面优秀 投顾服务缺失
  10. MySQL/MariaDB Tips
  11. excelexportentity中设置null不显示的方法_如何在 Creator3D 中切换模型贴图,超级简单!...
  12. 服务器系统安装蓝牙驱动,win2008蓝牙驱动的装配教程详解
  13. linux系统用虚拟光驱装win7,用虚拟光驱加载win7或者xp iso镜像文件安装系统的图解步骤...
  14. hprose php用户手册,Laravel Hprose RPC 服务
  15. 奈奎斯特采样定理—以二维图像为例
  16. 7-6 输出大写英文字母分数 (15分)
  17. 自动钉木箱机器人_一种全自动木箱钉装机的制作方法
  18. cad线段总和lisp_求一个线段长度总和与生成文本 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  19. JUC-II CPU的微程序设计 计算机组成原理课程设计 微指令编码
  20. [转]读懂美国大使馆发布的空气质量指数

热门文章

  1. 删除N天前的log4j日志
  2. Markdown标记语法Typora编辑器零基础入门新手学习使用总结教程
  3. matlab极性电容叫什么,什么是无极电容和有极电容,它们在应用上有什么区别? , 无极性电容和有极性电容各自常用在什么电路上?...
  4. 屏蔽博客园背景动态线条
  5. 模拟丢包、慢网速的测试工具
  6. 【2017年】阿里巴巴算法笔试第二题
  7. SEO快排真的有效吗?什么样的快排才靠谱?
  8. 小小白学习c语言分享
  9. Qt完成简易闹钟与画板
  10. hexo 博客创建、部署、美化过程记录