使用Drone+gitea配置自己的CICD流程
Posted SaoJian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Drone+gitea配置自己的CICD流程相关的知识,希望对你有一定的参考价值。
什么是CI CD
CI CD一般包含三个概念:持续集成(Continuous Integration ,CI),持续交付(Continuous Delivery),持续部署(Continuous Deploy)。他是一种软件开发实践,核心是通过引入自动化的手段来提高软件交付效率。其最终目的是为了让工程师更快,更高质量,更简单的交付软件。
持续集成
在传统软件开发过程中,集成通常发生在每个人都完成了各自的工作之后,所谓集成,可以理解为团队里的大家完成自己负责的模块后,将各个子模块集成为一个可以完成整体功能的完整模块。在项目尾声阶段,通常集成还要痛苦的花费数周或者数月的时间来完成。持续集成是一个将集成提前至开发周期的早期阶段的实践方式,让构建、测试和集成代码更经常反复地发生。
为了实现持续集成,我们每个人都要单元测试(unit test),保证各个子模块的正常工作。
持续交付
持续交付是持续集成的延伸,将集成后的代码部署到类生产环境,确保可以以可持续的方式快速向客户发布新的更改。我们把代码部署到测试环境,预发布环境等等类生产环境成为交付。
持续部署
如果真的想获得持续交付的好处,应该尽早部署到生产环境,以确保可以小批次发布,在发生问题时可以轻松排除故障。于是有了持续部署。
我们通常将这个在不同环境发布和测试的过程叫做部署流水线。
持续部署是在持续交付的基础上,把部署到生产环境的过程自动化。
Gitea
gitea是一款开源,由Golang编写的可自运营的代码管理仓库,相对来说gitlab功能最为全面且内置CI,但是其对内存与cpu的开销更大,而gitea更为轻量化,日常运行占用的内存仅仅只有200mb上下,对于个人开发者来自己的云服务器往往只有2核4G甚至1核1G的配置,那么性能开销就显得弥足珍贵。
Drone
drone是一款开源的持续集成核持续交付平台,他可以帮助开发者自动化构建,测试核部署应用程序,drone的核心特点就是轻量级,他使用docker容器来运行构建核测试任务,这使得它可以快速的启动和销毁环境,从而提高了效率和可靠性,drone的部署十分简单,可以通过docker轻松部署,同时drone提供可视化的web界面和cli工具,方便用户管理和监控构建任务的状态和结果。
开始部署
我使用的系统是ubuntu22.04,采用的docker部署。
这里我们均使用docker-compose来部署,不知道什么是docker-compose的同学可以先去了解一下docker及docker-compose。
Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来配置应用程序的服务,并可以在单个命令中启动、停止和重建所有服务。Docker Compose可以帮助开发人员和运维人员更轻松地管理多个Docker容器,并提供了一种简单的方法来定义和管理应用程序的依赖关系。
Gitea docker-compose
version: "3"
services:
server:
image: gitea/gitea:1.19.0
container_name: gitea
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
~
编辑成docker-compose.yml文件输入docker compse up -d命令,docker就会根据编排好的文件自动创建容器及映射数据卷
这里我使用的端口是3000,gitea的默认端口也是3000,访问对应地址
这里需要我们进行一些默认配置,这里我选择使用sqlite数据,这样避免了还需要部署一个数据库容器,其他的我们使用默认配置即可。
部署成功后的默认界面如图,点击右上角登录,第一个注册的账号就是管理员账号
我们注册完第一个账号即管理员账号后,接下来我们注册一个Drone专用的账号,当然你也可以就把管理员账号给Drone来用。
点击右上角用户头像->设置->应用进入如下界面
应用名称为自定义的OAuth2授权名称,可随便取。
重定向URL十分重要,必须为接下来要部署的drone server的网站地址,如果不是域名的话还需带上端口,且以/login结尾
点击创建应用后保存生成的客户端ID及客户端密钥,待会创建drone server时要使用
Drone docker-compose
Drone分为drone server和drone runner两部分
drone server
version: "3"
services:
drone:
image: drone/drone:2
container_name: drone
environment:
- DRONE_GITEA_SERVER=http://110.41.160.73:3000
- DRONE_GITEA_CLIENT_ID=9c77ba3c-9d13-49ae-a7a5-cfbd6a7993c2
- DRONE_GITEA_CLIENT_SECRET=gto_zbxh6gznvbsrpskwf25ti4r7iltfe2ysjkl75hjst6dfcyuxl4oa
- DRONE_RPC_SECRET=as103208900
- DRONE_SERVER_HOST=110.41.160.73:3001
- DRONE_SERVER_PROTO=http
- DRONE_USER_CREATE=username:drone,admin:true
restart: always
volumes:
- ./drone:/data
ports:
- 3001:80
DRONE_GITEA_SERVER:你的gitea服务器地址
DRONE_GITEA_CLIENT_ID:你创建的OAtuh2授权的客户端ID,即是上一步中要求保存的客户端ID
DRONE_GITEA_CLINIE_SECRET:你创建的OAtuh2授权的客户端密钥,即是上一步中要求保存的客户端密钥
DRONE_RPC_SECRET:drone server与drone runner通信设定的密码,可自由设置,在接下来的drone runner的docker compose中也有这个参数,必须与此处相同
DRONE_SERVER_HOST:你设置的drone server地址,可以是域名,如果不是的话则必须是带端口的ip地址,且此处设置的端口必须与
DRONE_SERVE_PROTO:设置服务器的协议,如http或https
DRONE_USER_CREATE:指定某个用户为管理员,管理员有权管理其他账户,编辑仓库详细信息,编辑仓库信任标志,访问受限制的API。注意,此处设置的username:drone,其名称就是你给drone准备的gitea的账户名称,最好是把这个账号指定为管理员,否则非管理员无法设置某个仓库为受信任仓库,而非受信任的仓库是无法挂载数据卷的
同样是创建docker-compose.yml后输入docker compose up -d创建容器
访问对应地址取得gitea账户授权后如下
drone runner
version: "3"
services:
runner:
image: drone/drone-runner-docker:1
container_name: runner
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=110.41.160.73:3001
- DRONE_RPC_SECRET=as103208900
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=my-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 3002:3000
DRONE_RPC_PROTO:部署的服务器协议,如http,https
DRONE_RPC_HOST:部署的服务器地址,如果不是域名的话必须带上端口
DRONE_RPC_SECRET:与drone server通信的密钥
DRONE_RUNNER_CAPACITY:设置同时运行的流水线数量
DRONE_RUNNER_NAME:设置drone runner引用名称
同样是保存成docker-compose.yml后以docker compose up -d命令启动容器
自此,drone与gitea都部署成功
编写.drone.yml
我们创建一个项目,并且用vs添加docker支持,自动生成dockerfile
创建一个.drone.yml文件且必须放在最外层
kind: pipeline
type: docker
name: default
clone:
skip_verify: true
steps:
- name: publish
image: docker:dind
environment:
IMAGE: myfirst-cicdtest
CONTAINERNAME: testcdcidcontainer
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker stop $CONTAINERNAME
- docker rm $CONTAINERNAME
- docker rmi $IMAGE
- docker build -t $IMAGE .
- docker run -d -p 5056:80 --name $CONTAINERNAME $IMAGE
volumes:
- name: dockersock
host:
path: /var/run/docker.sock
其中steps中为主要构建命令
name:运行步骤的名称
image:依赖的基础镜像
environment:设置的变量,以键值对方式
volumes:挂载的数据卷设置,此处为容器内部地址
commands:运行命令
此处我是以docker部署,所以在每次跑流水线过程前都得先把旧有的容器,镜像删除才能创建新的容器镜像,因此当流水线第一次运行时并不需要这个删除的步骤,但是这种处理方式并不稳妥,实际上较为合理的方式应该是配合k3s或k8s集群,此处的构建只负责打包镜像,由集群来负责部署项目,奈何我暂时不会玩k3s或k8s,等以后有了涉猎之后再来对此处修改。
搭建Gitea+Drone轻量级代码管理和CI服务
使用环境
IP地址 | 端口 | 所属服务 |
10.10.9.208 | 3000 | Gitea网页管理服务 |
10.10.9.208 | 2222 | SSH、HTTP下载代码服务 |
10.10.9.208 | 7500 | Drone-Server服务 |
10.10.9.208 | 3100 | Drone-Runner |
Gitea
简介
Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证,它是从Gogs发展而来的,因为Gogs由单一管理者做决定,因此诞生了Gitea,它采用社区管理模式,增加了诸多新特性,而且由社区众多的维护者来决定它的发展方向,因此拥有更强的生命力和发展潜力。
Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。采用 Go 作为后端语言,只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC.
功能特性
-
支持活动时间线 -
支持 SSH 以及 HTTP/HTTPS 协议 -
支持 SMTP、LDAP 和反向代理的用户认证 -
支持反向代理子路径 -
支持用户、组织和仓库管理系统 -
支持添加和删除仓库协作者 -
支持仓库和组织级别 Web 钩子(包括 Slack 集成) -
支持仓库 Git 钩子和部署密钥 -
支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki -
支持迁移和镜像仓库以及它的 Wiki -
支持在线编辑仓库文件和 Wiki -
支持自定义源的 Gravatar 和 Federated Avatar -
支持邮件服务 -
支持后台管理面板 -
支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 TiDB(MySQL) 数据库 -
支持多语言本地化(21 种语言) -
支持软件包注册中心(Composer/Conan/Container/Generic/Helm/Maven/NPM/Nuget/PyPI/RubyGems)
安装
Gitea的官方文档有中文版,其中介绍了多种安装方式,我们以docker部署为例,采用最基本的部署方式,即使用内部sqlite3为数据库,docker-compose部署配置文件如下:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.17.2
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- SSH_PORT=2222
restart: always
networks:
- gitea
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
其中环境变量的配置很多,我们可以在官方文档中查看,这里主要修改一下SSH_PORT
的端口,因为默认使用22端口,这会和主机的ssh服务端口冲突,因此我们修改一下端口为2222,3000端口为网页管理端口,其他的配置在第一次访问时会通过网页的方式配置。
使用命令启动镜像:
docker-compose up -d
配置
因为比较轻量级,所以启动速度非常快,第一次访问网页端会进入初始配置页面
这里需要配置的项目有以下几个:
-
站点名称:名称随意配置 -
服务器域名:就是宿主机的IP地址或者绑定的域名 -
基础URL:这里就是网页访问地址,把localhost改为宿主机IP或者域名即可
在可选设置中需要修改一些配置,服务器和第三方服务设置和管理员账号设置。
服务器和第三方服务设置
这里主要是启用本地模式,因为默认会使用CDN连接一些外网的资源,对于服务器不能连接外网的公司,必须要启用本地模式。一般我们都是企业内使用,因此不需要用户注册,通过管理员创建账号即可。
管理员账号设置
默认第一个注册用户会成为管理员,我们直接在这里创建好管理员信息,这里要注意的是用户名有一些保留字是不能使用的,例如admin
配置好以后点击“立即安装”就可以进入用户页面。
导入外部仓库代码
Gitea支持从以下代码管理仓库导入代码库
如果要支持导入,还要进行一些配置,在gitea/conf/app.ini
文件中增加如下配置
[migrations]
ALLOW_LOCALNETWORKS = true
[webhook]
ALLOWED_HOST_LIST = 10.10.9.208/16
然后重启容器
docker-compose restart
Drone
简介
Drone 是一款基于 Docker 的 CI/CD 工具,所有编译、测试、发布的流程都在 Docker 容器中进行.
开发者只需在项目中包含 .drone.yml 文件,将代码推送到 git 仓库,Drone 就能够自动化的进行编译、测试、发布。
为什么使用 Drone 作为 CI/CD 工具
-
功能灵活强大:构建、测试、发布、部署,你想干什么都可以,一套系统全搞定 -
兼容性好:支持所有 SCM、所有平台、所有语言 -
环境部署简单:原生支持 Docker 容器,启动两个容器就完成了部署,其它构建、测试、部署工具在使用时会自动从 docker 仓库拉取 -
扩展性强:强大的插件系统,丰富的插件可以免费使用,也可以自定义 -
配置简单:正如官方宣传的那样,“configuration as a code”,所有功能、步骤、工具、命令,一个 yaml 配置文件全搞定 -
维护简单:直接复用 SCM 的账号体系和权限管理,无需注册用户、分配权限
安装
Drone 由两部分构成:
-
Server
负责任务调度
-
Runner
执行 Pipeline 的具体任务
因此安装有两个镜像drone/drone:2.13.0
和drone/drone-runner-docker:1.8.2
,首先下载镜像
docker pull drone/drone:2.13.0
docker pull drone/drone-runner-docker:1.8.2
Drone和Jenkins这类CI工具不一样,它必须绑定指定的Git仓库,因此在启动的时候必须配置好对应的仓库信息。我们以Gitea仓库为例。
准备工作
首先在Gitea里面创建好对应的验证信息
生成的令牌要记住,Drone使用OAuth2连接Gitea,这里创建好应用,重定向URI配置Drone服务的登录地址,虽然我们还没有创建好Drone服务,但是这里可以先填写好地址和端口,后面创建Drone服务的时候注意要和这里保持一致。
记录下客户端ID和客户端密钥。Drone是包含server和runner的,他们之间的通信需要进行加密,可以通过如下方式生成密钥:
openssl rand -hex 16
drone-server启动文件配置
version: "3"
services:
drone-server:
image: drone/drone:2.13.0
container_name: drone-server
restart: always
ports:
- "7500:80"
volumes:
- ./data:/data
environment:
- DRONE_GITEA_SERVER=http://10.10.9.208:3000
- DRONE_GITEA_CLIENT_ID=9eedfa2e-b0aa-497e-aaee-c7434755fd9c
- DRONE_GITEA_CLIENT_SECRET=gto_zdessdivpj4gly2lqq2bby3qvsa6xbbrbrngj3rv24pzotsfjw4q
- DRONE_RPC_SECRET=7cc96b3ca902a735958033cb233abb6e
- DRONE_SERVER_HOST=10.10.9.208:7500
- DRONE_SERVER_PROTO=http
- DRONE_USER_CREATE=username:xingxing,admin:true
-
DRONE_GITEA_CLIENT_ID
(必填) Gitea OAuth 客户端ID
-
DRONE_GITEA_CLIENT_SECRET
(必填)Gitea OAuth 客户端密钥
-
DRONE_GITEA_SERVER
(必填)Gitea 服务器地址,例如
http://10.10.9.208:3000
。注意填写准确的http(s)
协议,否则你会看到来自 Gitea 的错误报告:unsupported protocol scheme
。 -
DRONE_RPC_SECRET
(必填)在准备工作中使用
openssl rand -hex 16
生成的共享密钥。这个密钥用于验证 Drone Server 和 Runner 之间的 RPC 连接。因此,在 Server 和 Runner 上都必须使用相同的密钥。 -
DRONE_SERVER_HOST
(必填)访问 Drone 时所用的域名或 IP 地址。如果使用 IP 地址,还应该包含端口。 例如
http://10.10.9.208:7500
。 -
DRONE_SERVER_PROTO
(必填)设置服务器的协议,使用:
http
或https
。 默认为https
。 -
DRONE_USER_CREATE
管理员配置,这里的管理员用户名是Git仓库的用户名,不一定是Git仓库的管理员,只要是Git仓库的用户即可
配置完后启动drone-server服务
docker-compose up -d
然后访问http://10.10.9.208:7500
会自动跳到Gitea的授权页面,授权后填写邮箱、用户名、公司即可进入页面。在这里要注意一点,Drone是没有登录界面的,那么它是怎么获取到Gitea中的仓库进行构建的呢?
Drone和Gitea共用用户信息,当我们访问Drone的时候,如果在相同的浏览器内登录了Gitea,那么Drone就会使用当前Gitea登录用户的信息获取仓库数据;如果没有登录Gitea,那就会跳转到Gitea等登录页面。这个地方让我困惑了很久,一直不知道为什么有些仓库可以获取到,有些仓库又获取不到。还要注意一点,如果已经打开了Drone,我们再切换了Gitea登录的用户,那么Drone是不会自动进行切换的,这个时候需要在Drone中退出登录,再刷新页面登入即可实现切换账号。
进入后我们就看到了当前可以构建的仓库,如果在Gitea增加了参与的项目,而这里又看不到,可以点击Sync按钮进行手动同步。然后进入仓库激活它,进行一些设置。
不要接收pull和fork的WebHook消息,Trusted这里只有Drone管理员才能看到,其他用户是看不到的。
drone-runner启动文件配置
version: "3"
services:
drone-runner:
image: drone/drone-runner-docker:1.8.2
restart: always
container_name: drone-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=10.10.9.208:7500
- DRONE_RPC_SECRET=7cc96b3ca902a735958033cb233abb6e
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=runner
-
DRONE_RPC_HOST
填写 Drone Server 的主机名(以及可选填的端口号)
-
DRONE_RPC_PROTO
传输协议:
http
或https
-
DRONE_RPC_SECRET
与 Drone Server 共享的密钥,就是在准备工作中使用
openssl rand -hex 16
生成的共享密钥 -
DRONE_RUNNER_CAPACITY
Runner 可以并发执行的流水线数量,默认:
2
-
DRONE_RUNNER_NAME
自定义 Runner 名称
验证runner是否成功。
docker logs drone-runner
日志中包含以下内容则表示启动成功
starting the server
successfully pinged the remote server
使用构建
Drone是采用配置文件的方式进行流水线配置的,因此我们首先要在对应的仓库根目录下创建.drone.yml
文件,内容如下:
kind: pipeline
type: docker
name: test
文件提交后就会自动触发构建
我们可以通过手动在Drone中创建一个流水线也可以通过配置触发方式来自动触发,在使用Jenkins的时候,我们需要在Git仓库中配置WebHook,并且选择WebHook的触发事件,这样才能自动触发构建,但是在安装配置Drone的时候我们并没有配置触发方式,为什么添加了.drone.yml
文件就自动触发构建了呢?原因是因为Drone是与Git仓库绑定的,当我们在创建Drone服务的时候已经配置了Gitea仓库的认证信息,那么当我们在Drone中激活一个项目的时候,Drone就会自动在Gitea中为对应的项目创建WebHook。
搭建Gitea+Drone轻量级代码管理和CI服务
云原生之Docker实战使用Docker部署Drone轻量级自动化平台