基于 Gitea + Drone 的 CI / CD 方案
Github 的 CI/CD 方案,对于公开项目来说,目前是免费的,但是对于私有项目来说(大型项目),是收费的,个人开发者无力承担过多的支出在这上面,相较于 Gitlab 的集成化的方案,Gitea + Drone 的方案资源占用更低。Timochan 试了试 Gitlab ,也就自己的笔记本能承受 Gitlab 庞大的资源占用,但这有什么意义呢?
前言
什么是 CI/CD,CI 简单理解就是根据设定好的步骤进行自动化测试,会进行构建/编译等,来测试出被提交代码中的错误,减少错误代码未测试被并入主分支的风险;CD 简单理解就是自动化部署,自动构建好的代码产物,部署到指定位置,不需要人工干预
Gitea
安装
Gitea 官方提供了三种安装方式,分别是二进制安装,Docker 安装 ,包管理器安装。
二进制安装简单省事,如果没有个性化定制需求,二进制安装足矣。
#下载
wget -O gitea https://dl.gitea.io/gitea/1.16.2/gitea-1.16.2-linux-amd64
#赋权
chmod +x gitea
测试
./gitea web
在命令行执行完后,你可以 Ctrl + C
关掉程序。当然也可以退出终端,选择不关闭。
安装数据库
Gitea 支持多种数据库(MySQL+PostgreSQL),我选相对比较熟悉的 MySQL 。而且 Gitea 支持到较新的 8.0 版本,虽然 8.0 出现好久了。
由于 Gitea 默认 3000 端口,且不占用 80 端口,为了外网访问时业务安全,建议对其进行反向代理。
反向代理
一个 Nginx 局部配置示例如下:
server {
listen 80;
server_name git.example.com;
location / {
proxy_pass http://localhost:3000;
}
}
接下来是 Drone。
Drone
安装
这个就推荐使用 docker 安装,因为它自己进行 CI/CD 任务也是生成一个新的容器进行的。
注意:yml文件中的 {} 请自己替换。
docker-compose.yml 示例:
version: '3'
networks:
gitea:
external: false
services:
# 容器名称
drone-server:
container_name: drone
# 构建所使用的镜像
image: drone/drone
# 映射容器内80端口到宿主机的3008端口
ports:
- 3008:80
# 映射容器内/data目录到宿主机的目录
volumes:
- /data/apps/drone:/data
# 容器随docker自动启动
restart: always
privileged: false
networks:
- gitea
environment:
# Gitea 服务器地址
- DRONE_GITEA_SERVER=https://git.example.com
# Gitea OAuth2客户端ID
- DRONE_GITEA_CLIENT_ID={}
# Gitea OAuth2客户端密钥
- DRONE_GITEA_CLIENT_SECRET={}
# drone的共享密钥
- DRONE_RPC_SECRET=311137bbbd11b205737ecac6cceab823
# drone的主机名
- DRONE_SERVER_HOST=localhost:3008
# 外部协议方案
- DRONE_SERVER_PROTO=https
# 创建管理员账户,这里对应为gitea的用户名
- DRONE_USER_CREATE=username:{},admin:true
docker-runner:
container_name: drone-runner
image: drone/drone-runner-docker
ports:
- 3009:3000
restart: always
privileged: true
networks:
- gitea
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
# 用于连接到Drone服务器的协议。该值必须是http或https。
- DRONE_RPC_PROTO=http
# 用于连接到Drone服务器的主机名
- DRONE_RPC_HOST=drone:80
# Drone服务器进行身份验证的共享密钥,和上面设置一样
- DRONE_RPC_SECRET=311137bbbd11b205737ecac6cceab823
# 限制运行程序可以执行的并发管道数。运行程序默认情况下执行2个并发管道。
- DRONE_RUNNER_CAPACITY=2
# docker runner 名称
- DRONE_RUNNER_NAME=docker-runner
构建容器
#拉取容器镜像
sudo docker-compose pull
#构建容器 & 运行
sudo docker-compose up -d
如果有外网访问需求,可以反向代理,Nginx 示例如下
server {
listen 80;
server_name drone.example.com;
location / {
proxy_pass http://localhost:3008;
}
}
测试
首先,本地初始化一个 React 项目,然后根目录新建一个.drone.yml文件
示例如下:
workspace:
base: /dist
path: .
pipeline:
init:
image: 'node:latest'
commands:
- 'yarn config set registry https://registry.npm.taobao.org'
- 'yarn install --network-concurrency 1'
when:
event: [push, tag, deployment]
branch: [master, develop]
build:
image: 'node:latest'
commands:
- 'yarn run build'
when:
event: [push, tag, deployment]
branch: [master, develop]
然后进入
Drone,进行授权,然后添加一个文件,触发 CI/CD 。