使用Drone搭建CICD服务

简介: Drone是Go语言编写的,基于容器技术的CI/CD系统。它具有以下几个关键特性。 1、Everything is a Docker Container 2、One Server, Multiple Agents 3、Configuration as a code 4、丰富的插件

概要

Drone是Go语言编写的,基于容器技术的CI/CD系统。它具有以下几个关键特性:

Everything is a Docker Container

对Docker原生支持使的: drone无需在构建脚本中额外增加 docker 相关的命令就能:
1. 使用Docker化的集成环境方便的实现对多语言编译
2. 利用集成Docker环境的优势: 环境隔离、标准化镜像
利益于: 对原生 Docker 支持
Any Source Code Manager
Any Platform
Any Language


One Server, Multiple Agents

Server与git平台交互, 提供web服务
Agents具体负责相关的编译、部署等操作
当使用用户多、load高时可以扩展Agents来实现水平扩容
在 1.0 版本之后,只需要一个 drone 服务
  里面面就内建了 server 及 agent,这很适合用非常小团队快速安装 drone

Configuration as a code

使用.drone.yml文件来设定测试及部署流程
Pipelines被配置成你提交到git仓库的简单、易读的文件
Pipeline的每一步骤都自动运行在独立的Docker容器中

丰富的插件:

构建后发送消息: DingTalk, Wechat, Gtalk, Email
构建成功后发布: npm, docker, github release, google container...
构建成功后部署: Kubernetes, rsync, scp, ftp...

调研其他CI/CD系统

需求

  1. 开源软件。可用于商业相关服务的自动化部署
  2. 尽量少一些运维部署操作。我们团队都是开发人员,没有专门的运维,开发人员主要工作是编码而不是其它
  3. 较好的支持k8s微服务。目前使用了比较多服务使用了k8s
  4. 尽量简单,适合小团队使用。服务部署完成后,项目组其他成员可以快速掌握使用
  5. 可以与我们搭建的gitlab私有仓库配合使用

常用的CI/CD系统

CI/CD已经形成了一套标准流程,有多个开源不开源的工具可以实现。常用的CI/CD工具有:

CI系统 是否开源 授权协议 开发语言
Jenkins MIT Java
gitlab-ci MIT Golang
prow Apache-2.0 Golang
Strider MIT JavaScript
Travis 商业软件 Ruby
teamcity 商业软件 Java .NET
Codeship 商业软件 未知

这其中:

1. Travis、Codeship、teamcity使用商用协议
2. Strider不适用k8s环境的自动化部署
3. prow是专用于k8s项目,是Kubernetes测试框架test-infra的一部分,而且目前好像只适用于github平台

只剩下Jenkins和gitlab-ci适合我们目前开发团队的使用

Jenkins

优点:

  功能完善、插件丰富: 有1000多个插件可供选择
  权限控制粒度高: 可以精确控制每个用户的权限
  稳定性高、文档丰富、使用人数多: 出现问题好解决

缺点:

  复杂: 1000多个插件, 不下大功夫, 如何知道应该用哪个插件
  权限控制复杂: 精确控制每个用户的权限, 但需要花大量时间配置
  需要对配置文件单独进行版本控制(实现还比较麻烦)

gitlab-ci

优点:

  执行步骤在没有大的中, 自带版本控制
  与gitlab高度整合

缺点:

  配置复杂
  与gitlab耦合紧密
  开发语言ruby

drone安装

说明

drone支持各git仓库平台, 如github, gitlab, gogs, gitea等。使用不同的仓库平台,安装方式稍有不同。本文以gitlab为例进行说明,其他仓库平台请看文档

在Gitlab上创建OAuth应用

打开Application页面:

右上角头像 -> 设置(setting) -> 应用(Application)
输入框输入下面2个参数:
  1. Application名: 这个可以随便输入为可识别的名字
  2. Redirect URI: 回调地址, 注意这个地址与后面启动服务的地址+/login
如下图所示:

Application页面

创建成功页面如下图所示:

注意需要记住下面两个值:
Application ID和Secret的值, 后面会用到

Application创建成功页面

创建共享密钥

共享密钥用于在Drone Server与各Drone Runner间通信认证时使用, 本篇使用内建的Server, 此值暂时用处不大, 不明白的可以先记住有这么一个事。
可用如下命令生成:

$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6

服务启动

服务启动命令如下:

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GIT_ALWAYS_AUTH=false \
  --env=DRONE_GITLAB_SERVER=http://gitlab.com \
  --env=DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID} \
  --env=DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET} \
  --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \
  --env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST} \
  --env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} \
  --env=DRONE_TLS_AUTOCERT=false \
  --env=DRONE_USER_CREATE=username:zhaoweiguo,admin:true \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

环境变量参数说明

DRONE_GITLAB_SERVER:

gitlab服务地址

DRONE_GIT_ALWAYS_AUTH:

可选bool型
用于在clone公共项目时认证
此项只有在自托管的Gitlab且启用私有模式时才启用

DRONE_GITLAB_CLIENT_ID:

前面生成Application时得到的Application ID

DRONE_GITLAB_CLIENT_SECRET:

前面生成Application时得到的Secret

DRONE_RPC_SECRET:

Drone Server与各Drone Runner间通信所需要的认证密钥, 即前面使用openssl命令得到的那串32字串

DRONE_SERVER_HOST:

Drone Server服务的启动地址

DRONE_SERVER_PROTO

Drone Server服务的协议

DRONE_TLS_AUTOCERT:

Drone服务默认

DRONE_USER_CREATE:

设置 Drone 的管理员,格式为:username:<username>,admin:true
本实例中:
  <username> 的值 zhaoweiguo 就是我在gitlab上的用户名
  admin: 指定此用户名的用户为管理员用户

说明

docker run启动成功后, 一个单节点的Drone就算是部署完成...

参考

轻量快速的 CI 工具 Drone
官网

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
域名解析 Cloud Native jenkins
【Drone+Gitlab】一条龙服务,直接起飞 — 从介绍->部署->配置->写.drone.yml流水线+常见的报错解决
gitlab+drone部署安装,编写.drone.yml流水线 drone是一个持续集成化工具,gitlab是一个代码仓库,.drone.yml流水线编写 fatal: unable to access,could not resolve host 克隆地址连接不上(修改默认clone克隆),没有Trusted选项,启动drone-server时添加(--env=DRONE_USER_CREATE=username:root,admin:true) .drone.yml文件中sed命令报错
2099 0
【Drone+Gitlab】一条龙服务,直接起飞 — 从介绍->部署->配置->写.drone.yml流水线+常见的报错解决
|
jenkins Java 持续交付
实战:Docker+Jenkins+Gitee构建CICD流水线
实战:Docker+Jenkins+Gitee构建CICD流水线
|
Kubernetes 监控 jenkins
出神入化!Jenkins+Docker+SpringCloud+K8s构建持续集成平台
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
出神入化!Jenkins+Docker+SpringCloud+K8s构建持续集成平台
|
小程序 IDE JavaScript
小程序结合Jenkins实现CICD
小程序结合Jenkins实现CICD
697 0
|
域名解析 Cloud Native jenkins
【Drone-初识篇】Drone借助GitLab构建CICD环境、以及编写 .drone.yaml 流水线
【Drone-初识篇】Drone借助GitLab构建CICD环境、以及编写 .drone.yaml 流水线
1012 0
|
Cloud Native jenkins 应用服务中间件
云原生下的CICD-3件套快速搭建合集:jenkins+harbor+gitlab
云原生下的CICD-3件套快速搭建合集:jenkins+harbor+gitlab
156 0
|
Kubernetes jenkins Java
jenkins-CICD系列之-jenkins使用pipeline流水线k8s发布
jenkins使用pipeline流水线k8s一键发布
1120 1
|
Kubernetes Docker 容器
|
存储 运维 Kubernetes
在k8s安装CICD-devtron
在k8s安装CICD-devtron
243 0
|
jenkins 应用服务中间件 Shell
自动化部署之旅 - 当我放弃了Jenkins而选择了Drone CI
一直以来对于项目的部署管理我都是采用Jenkins,但其实我使用到的也只是它接收webhook的功能,然后触发对应的项目预设shell脚本来运行部署,最近突然心血来潮,想尝试下不同的集成构建方案,在简单调研后选择了Drone,其轻量、高颜值的特点立刻吸引了我。