基于Gitea+Drone搭建自己的CI/CD平台

基于Gitea+Drone搭建自己的CI/CD平台

在自建 Gitea 上接入 Drone CI/CD:记录 Docker Compose 部署、Nginx 代理与流水线配置,并用 Node.js 项目的推送构建验证自动化流程。

—次点击3分钟阅读

上一篇我们搭建了自己的Git服务器 搭建自己的Git服务器-Gitea安装教程, 搭建Git之后,想找一个能解放生产力的工具

这个时间突然看到了Drone这个CI工具,了解过后,觉得这个特别适合做为CI、CD工具的入门训练,而且它的功能非常强大

Drone也是原生就支持docker的CI,所有编译、测试的流程都在 Docker 容器中进行。

开发者只需在项目中包含 .drone.yml 文件,将代码推送到 git 仓库,Drone 就能够自动化的进行编译、测试、发布。

本篇博客会从0开始安装一个Drone

下面开始安装

准备#

  • 拥有公网 IP、域名 (或者拥有自己的本地 Gitea 以供测试)
  • 域名 SSL 证书 (可以使用Letsencrypt)
  • 熟悉 Docker 以及 Docker Compose
  • 熟悉 Git 基本命令
  • 对 CI/CD 有一定了解

配置Docker-Compose#

创建docker-compose.yml配置文件

yaml


services:
  drone-server:
    image: drone/drone:latest
    ports:
      - 8000
      - 9000
    volumes:
      - /root/sites/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_DEBUG=false
      - DRONE_HOST=${DRONE_HOST}
      - GITRA_PRIVATE_MODE=true
      - DRONE_GITEA=true
      - DRONE_GITEA_URL=${GITEA_URL}
      - DRONE_SECRET=${SECRET}

  drone-agent:
    image: drone/agent:latest
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_DEBUG=false
      - DRONE_SECRET=${SECRET}
注: 1、drone-agent的docker image地址是 drone/agent,这个之前安装时没有看清楚导致CI一直跑不起来😂 2、DRONE_HOST为你的CI的线上地址 3、DRONE_SERVER现在drone最新版中可以直接设置server:port的方式 4、因为使用的gitea,所有需要将DRONE_GITEA设置为true

启动 Drone 服务#

docker-compose up -d

启动之后 curl localhost:9000 验证是否启动成功

如果启动失败,可以执行以下命令查看报错信息

docker-compose logs

配置 nginx 代理#

如果想提供给外网访问,还需要最后一步,配置nginx代理到Gitea服务

配置如下:

代码

server {
    listen       80;
    server_name  ci.marryto.me;
    charset utf-8;
    rewrite ^ https://ci.marryto.me;
}

## 请求转发到Gitea容器
server {
    listen       443 ssl;
    server_name  ci.marryto.me;
    charset utf-8;
    ssl on;
    ssl_certificate         /etc/*/live/*/fullchain.pem;
    ssl_certificate_key     /etc/*/live/*/privkey.pem;
    ssl_session_timeout     10m;
    ssl_session_cache       shared:SSL:10m;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_pass    ${之前配置的地址};
    }
    location ~ .*\.(js|css|png)$ {
        proxy_pass  ${之前配置的地址};
    }
}

接下来我们打开https://ci.marryto.me

登录验证需要输入gitea的用户名和密码,接下来我们可以体验自己搭建的drone-ci了

体验Drone#

我们打开一个Node项目,新建一个文件,然后push到gitea中试一下

yaml

  base: /ceshi/api
  path: .
pipeline:
  init:
    image: 'node:latest'
    commands:
      - 'yarn install --network-concurrency 1'
    when:
      event: [push, tag, deployment]
      branch: [master, develop]
  build:
    image: 'node:latest'
    environment:
      - TZ=Asia/Shanghai
    secrets:
      - key1
      - key3
    commands:
      - 'yarn run build'
    when:
      event: [push, tag, deployment]
      branch: [master, develop]

pipeline的设置基本上和其他CI工具差别不大,而且drone还支持一些service的配置

这个是官方service的一个配置

yaml
pipeline:
  test:
    image: golang
    commands:
      - go get
      - go test

services:
  database:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_DB=test

而我们这次用不到service,只需要init和 build测试一下

将改动push到master之后,我们可以看一下现在drone的页面,现在页面上有一个job在跑,我们可以点开查看一下

我们的安装完成了

关于Drone和其他git服务的集成可以看一下Drone的官网

Tips:

如果遇到CI job一直失败的情况,而且自己的配置没有问题的话,可以升级一下自己的服务器虚拟内存试一下,土豪请忽略。

资料:#

Drone官网