01.29 敏捷与DevOps与Drone CI

CI/CD对开发团队的重要性

  • 软件开发是是一个复杂的工业化流程,编码只是其中的一部分,CI/CD 使得开发流程更加标准化、专业化、自动化和更加稳定,可以在开发过程中提早发现问题,从而提高开发效率,节省大量时间,一个好的CI/CD流程可以大大提高了软件的价值。CI/CD尤其对追求持续快速响应变化,持续迭代的敏捷开发中流程尤为重要。

CI/CD的技术选型

  • 技术选型对于一个产品一个团队来说至关重要。对于敏捷团队的技术选型,往往不需要大而全的方案,更看重轻量高效,易于快速掌握,Drone刚好满足以上要求,轻量级易于掌握,又能满足各种需求。Drone原生于docker技术的,充分利用了docker的优势(如环境隔离、标准化镜像),轻量高效,非常适合docker技术栈(docker docker-compose swarm k8s),当然也可以用于传统的scp ssh拷贝源代码的方式。
  • 如果你本身是一个开发人员,没有太多CI/CD工具经验,想快速构建一个CI/CD流程,那么Drone就是你不二的选择。如果你之前用过Travis CI,对docker技术有一定的了解,那么就能飞快入门。

Drone优势

流程定义简单

配置即为代码,用配置的方式简单明了定义流程,告别复杂的shell脚本。

  1. Drone采用主流的基于pipline的方式进行流程定义,易于理解
  2. Drone主要采用yaml作为流程描述方式(语言),简单明了易于阅读。对于复杂的配置可以采用另一种类似json的jsonent 配置方式来定义,好处是可以定义方法函数,易于复用。

部署简单

  • Drone 部署简单,可以采用Docker部署的方式,只需要将官网提供的docker启动命令改几个参数,直接运行就启动起来了,整个配置过程只需要几分钟。

支持多环境

  • 支持多硬件环境

Drone适合在各种平台运行,如Linux x64、ARM、ARM64 Windows x64。同时 Drone 文件很小,对系统要求特别低,可以选择一个很便宜树莓派机子当服务器,甚至可以拿一台小米6来作为Drone服务器。

  • 支持多种源代码管理系统

Drone支持各种多种主流的git源代码管理系统如 Github, Bitbucket, GitLab GitTea, Drone对各种源代码管理系统实现基本是一致的, 所以可以很容易的在各种源代码管理系统之间无痛迁移。

  • 支持各种编程语言编程环境

Drone可以用于任何编程语言、任何数据,任何服务,只要能在docker里跑的程序都能用Drone。

扩展性好

  • Drone有大量的插件,虽然没法和 jienkens比但是绝对能满足你各种需求,最厉害的是他自定义插件非常容易,你可以快速构建自己的插件,一个插件实际就是一个docker镜像,并且构建插件并不依赖于开发语言,甚至可以用简单的shell脚本。

提供隔离的运行环境:

这个实际上是利用了docker的特性,在pipline的每一步都是运行在docker中的独立应用,给你完全的控制,不用考虑各种依赖。

支持分布式扩展:

  • 可以在多台机子中部署Drone-agent,实现一个Drone群集,实行Drone的横向扩展,可以实现多build 多stage的并发执行。Drone同时和k8s实现了深入定制化集成,采用k8s的方式部署,利用k8s的特性实现弹性分布式扩展。

易于调试

  • 可以实时的以ssh进入container进行调试
  • 可以用Drone exec方法在本地调试,解析执行Drone.yaml
  • 可以直接加断点在本地debug(后续文章将介绍如何本地debug)。

方便灵活的build流程定义(并发、顺序、依赖)

  • Drone可以通过配置 multiple pipeline 和 depends_on来定义各个step stage的依赖关系,执行先后顺序,是否同时并发执行。

Drone 敏捷开发 DevOps

  • 敏捷开发打破了需求分析、测试、开发运维之间的一些孤岛。敏捷开发使得团队中各种角色的融合,开发承担测试的工作,运维的工作,设计工作。
  • 关于什么是DevOps,有各种的理解,有各种的文章,本人的理解就是,开发过程和运维过程紧密结合,开发更深入的参与运维过程,dev和Ops两者角色的融合,两者更好的合作。
  • CI/CD就是从技术层面、工具层面来实现了敏捷开发的理念,实现开发、测试、运维紧密结合。

Drone作为新一代的CI/CD,从工具角度更好的实现了DevOps得理念,从设计和实现上,就原生的支持这种思想。

  1. Drone上手容易,可以使即使没有CI/CD运维经验的开发人员快速上手,开发人员就可以快速融入运维过程。
  2. Drone原生于docker实际执行步骤都是在容器中执行,在Drone流程定义中由开发人员执行镜像制作、定义容器执行相关命令,实际是开发人员实现了基础运行环境的构建(如数据库依赖,缓存依赖,代码依赖),开发人员想对运维人员更了解软件系统,对各种依赖关系更加了解,这项工作由开发人员做,减少了和运维人员的沟通成本,减少了出错的可能性。
  3. 运维人员作为技术专家角色对开发人员进行运维技术指导,解决擅长的运维配置问题。
  4. 相对传统的完全由运维人员构建CI/CD,运维人员就不需要了解软件的各种运行细节,不停的和开发人员各种沟通了,从何提高了工作效率,减少不必要的依赖,开发和运维各自专注于自己擅长的领域,两者就能更好的合作更好的融合。

安装

Drone 是采用webhook的触发方式来执行的,实际就是scm注册Drone的webhook api,然后当scm事件发生(用户commit 并push)调用Drone web hook方法 触发整个流程,Drone必须能被源代码管理系统发现,Drone服务能被源代码管理系访问到,所以如果用github Drone 服务必须是公网可以访问,如果用gitlab gittea要在同一个内网, 推荐搭建内网的gitlab 或者 gittea方便本地调试。

https://docs.Drone.io/installation 官方安装文档

再提供一个 采用非80端口(800端口)的例子,在gitlab中配置的地址也记得写端口(http://xxxxxxxx:8080/login)

<code>docker run \\
--volume=/var/run/docker.sock:/var/run/docker.sock \\
--volume=/var/lib/Drone:/data \\
--env=Drone_GIT_ALWAYS_AUTH=false \\
--env=Drone_GITLAB_SERVER=https://xxxx.com \\
--env=Drone_GITLAB_CLIENT_ID=df59396ko0992e545e7c3100f854c20bb3e629b6883a95095c27bebd4549f9a2c0 \\
--env=Drone_GITLAB_CLIENT_SECRET=e85747;kiuhc341868285f7fd1f138d585c841d9db93b6e9616r650601bc6l;kb98bd \\
--env=Drone_RUNNER_CAPACITY=2 \\
--env=Drone_SERVER_HOST=docker_scm-01w.dev.activenetwork.com:8000\\
--env=Drone_SERVER_PROTO=http \\
--env=Drone_TLS_AUTOCERT=false \\
--env=Drone_USER_CREATE=username:mwan5,admin:true\\
--publish=8000:80 \\
--publish=443:443 \\
--restart=always \\
--detach=true \\
--name=Drone10 \\
Drone/Drone:1

/<code>

采用golang源代码,编译代码的安装方式。

go install github.com/Drone/Drone/cmd/Drone-servergo install github.com/Drone/Drone/cmd/Drone-agent或者手动将编译好的Drone二进制文件 拷贝到的bin目录下运行 cmd/bin/Drone-server

Cron job

Drone 内置了cron job功能,可以实现定时任务的执行,在特定时间跑build。

提供加密管理服务

Drone提供了完善的密码管理服务,方便账户密码秘钥进行管理,可以调用第三方的秘钥管理服务。

pipeline 简单例子

<code>kind: pipeline
name: linux-arm

platform:
os: linux
arch: arm

steps:
- name: test
image: golang:1.11
commands:
- go test -v ./...
volumes:
- name:
path: /go
- name: build
image: golang:1.11
commands:
- "go build -ldflags \"-extldflags \\\\\\\\\"-static\\\\\\\\\"\" -o release/linux/arm/Drone-server github.com/Drone/Drone/cmd/Drone-server"
volumes:
- name:
path: /go
when:
event:
- push
- tag
- name: publish_server
image: plugins/docker
settings:
auto_tag: true
auto_tag_suffix: linux-arm
dockerfile: docker/Dockerfile.server.linux.arm
password:
from_secret: docker_password
repo: drone/drone
username:
from_secret: docker_username
when:
event:
- push
- tag
volumes:
- name:
temp: {}
/<code>

测试-> 打包 -> 制作镜像并发布到镜像仓库最后一步可以用scp ssh方式release代码

或者Drone Helm plugin插件直接发布到k8s上


分享到:


相關文章: