基于 Gitea + Drone 的 CI / CD 方案

摘要: Github 的 CI/CD 方案,对于公开项目来说,目前是免费的,但是对于私有项目来说(大型项目),是收费的,个人开发者无力承担过多的支出在这上面,相较于 Gitlab 的集成化的方案,Gitea + Drone 的方案资源占用更低。Timochan 试了试 Gitlab ,也就自己的笔记本能承受 Gitlab 庞大的资源占用,但这有什么意义呢?

这篇文章上次修改于 3 个月前,可能部分内容已经不适用,如有疑问可询问作者。

基于 Gitea + Drone 的 CI / CD 方案

Github 的 CI/CD 方案,对于公开项目来说,目前是免费的,但是对于私有项目来说(大型项目),是收费的,个人开发者无力承担过多的支出在这上面,相较于 Gitlab 的集成化的方案,Gitea + Drone 的方案资源占用更低。Timochan 试了试 Gitlab ,也就自己的笔记本能承受 Gitlab 庞大的资源占用,但这有什么意义呢?

前言

什么是 CI/CD,CI 简单理解就是根据设定好的步骤进行自动化测试,会进行构建/编译等,来测试出被提交代码中的错误,减少错误代码未测试被并入主分支的风险;CD 简单理解就是自动化部署,自动构建好的代码产物,部署到指定位置,不需要人工干预

Gitea

安装

Gitea 官方提供了三种安装方式,分别是二进制安装,Docker 安装 ,包管理器安装。

二进制安装简单省事,如果没有个性化定制需求,二进制安装足矣。

BASH
#下载
wget -O gitea https://dl.gitea.io/gitea/1.16.2/gitea-1.16.2-linux-amd64
#赋权
chmod +x gitea
Copy

测试

BASH
./gitea web
Copy

在命令行执行完后,你可以 Ctrl + C 关掉程序。当然也可以退出终端,选择不关闭。

安装数据库

Gitea 支持多种数据库(MySQL+PostgreSQL),我选相对比较熟悉的 MySQL 。而且 Gitea 支持到较新的 8.0 版本,虽然 8.0 出现好久了。

由于 Gitea 默认 3000 端口,且不占用 80 端口,为了外网访问时业务安全,建议对其进行反向代理。

反向代理

一个 Nginx 局部配置示例如下:

NGINX
server {
    listen 80;
    server_name git.example.com;

    location / {
        proxy_pass http://localhost:3000;
    }
}
Copy

接下来是 Drone。

Drone

安装

这个就推荐使用 docker 安装,因为它自己进行 CI/CD 任务也是生成一个新的容器进行的。

注意:yml文件中的 {} 请自己替换。

docker-compose.yml 示例:

YAML
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
Copy

构建容器

BASH
#拉取容器镜像
sudo docker-compose pull
#构建容器 & 运行
sudo docker-compose up -d
Copy

如果有外网访问需求,可以反向代理,Nginx 示例如下

NGINX
server {
    listen 80;
    server_name drone.example.com;

    location / {
        proxy_pass http://localhost:3008;
    }
}
Copy

测试

首先,本地初始化一个 React 项目,然后根目录新建一个.drone.yml文件

示例如下:

YAML
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]
Copy

然后进入

Drone,进行授权,然后添加一个文件,触发 CI/CD 。


相关文章

  • Drone 工作流编写