Code & Func

Gitea + Drone CI/CD

2020-03-27
Gitea
Drone
CICD
最后更新:2024-09-19
6分钟
1051字

最近想实践一下 DevOps,所以准备搭建一套代码托管和CI/CD 系统。

技术选型

代码托管

代码托管系统的选择其实并不多:

  • Gitea
  • Gogs
  • GitLab

由于 Gitlab 资源占用过大,所以可以直接去除(毕竟这个系统只有我一个人在用,而且只有一台1核2G的服务器)。

Gitea是脱胎于Gogs的,在Gogs上做了较多的扩展,而且迭代的也毕竟快。Gitea对现有的代码托管做了横向对比, 我们可以看出来Gitea几乎是最优选择。

Gitea有一个比较显著的缺点,它没有像Gitlab一样内置了CI/CD,所以我们必须搭另外一套CI/CD系统。

CI/CD

对现有的 CI/CD 进行了一下调研:

  • Jenkins
    • 优点:最为流行,出现坑的容易找到解决方案
    • 缺点:用 Java 编写,过于笨重
  • GitLab CI
    • 优点:据说很好用
    • 缺点:笨重
  • Drone
    • 优点:轻量级,支持Gitea
    • 缺点:生态不够丰富,文档差

在这里我们选择Drone作为CI/CD,主要原因当然是因为只有它轻量级啊。

Gitea

在安装GiteaDrone时,我们都选择使用docker-compose来管理,因此需要先安装dockerdocker-compose

创建一个gitea文件夹,并在该文件夹下创建docker-compose.yml文件:

1
version: "2"
2
3
networks:
4
gitea:
5
external: false
6
7
services:
8
server:
9
image: gitea/gitea:1.11
10
environment:
11
- USER_UID=1000
12
- USER_GID=1000
13
- RUN_MODE=prod
14
- SSH_PORT= 3022 #SSH端口
15
- SSH_DOMAIN= #IP地址或URL
11 collapsed lines
16
- DISABLE_REGISTRATION=False #取消注册
17
restart: always
18
networks:
19
- gitea
20
volumes:
21
- ./gitea:/data
22
- /etc/timezone:/etc/timezone:ro
23
- /etc/localtime:/etc/localtime:ro
24
ports:
25
- "3000:3000"
26
- "3022:3022"

这里面需要注意的是,设置SSH_PORTSSH_DOMAIN,这样 gitea 生成的 repo SSH 链接才是能直接使用的形式。

填写完后,直接docker-compose up -d开启服务即可,第一次登陆时,会跳出一个安装页面,可以设置所使用的数据库和管理员账号,同时要记得检查一下 SSH 端口和域名是否正确。

Drone

Drone的安装比Gitea复杂的多,同时需要先在Gitea中创建OAuth2应用程序:

打开Gitea的页面 -> 个人信息 -> 应用 -> 管理 OAuth2 应用程序

default

应用名称填什么都无所谓,但是重定向 URL 比较重要,要填 Drone服务的地址(虽然现在还没启动),比如说,你的 Drone 的 ip 地址为1.2.3.4Drone端口的为8000, 那么就可以填http://1.2.3.4:8000

创建后会得到一个客户端ID和客户端密钥。这时,Gitea的设置就已经完成了。

为了让Drone ServerDrone Runer能够通过RPC连接,我们需要生成RPC密钥,可以在 shell 中使用该命令来生成随机数,用该随机数作为 RPC 的密钥

Terminal window
1
$ openssl rand -hex 16

上面的操作中可以得到:

  • 客户端 ID
  • 客户端密钥
  • RPC 密钥

创建一个drone文件夹并在其中创建一个docker-compose.yml文件:

1
version: "3.5"
2
3
networks:
4
drone:
5
name: drone_network
6
7
services:
8
drone-server:
9
image: drone/drone:1
10
ports:
11
- 8000:80
12
- 443:443
13
networks:
14
- drone
15
volumes:
28 collapsed lines
16
- ./drone-data:/var/lib/drone
17
- /var/run/docker.sock:/var/run/docker.sock
18
restart: always
19
environment:
20
- DRONE_GITEA_CLIENT_ID= # Gitea 客户端ID
21
- DRONE_GITEA_CLIENT_SECRET= # Gitea 客户端密钥
22
- DRONE_GITEA_SERVER= # Gitea URL 地址
23
- DRONE_GITEA=true
24
- DRONE_RPC_SECRET= # Drone RPC 密钥
25
- DRONE_SERVER_HOST= # Drone URL,可以填域名或 ip:port
26
- DRONE_SERVER_PROTO=http # Drone 所使用的协议 http 或者 https
27
# 由于我的 Gitea 的设置是只允许登陆用户访问代码的,所以 Git 需要 Auth
28
- DRONE_GIT_ALWAYS_AUTH=true
29
- DRONE_GIT_USERNAME= # Gitea 用户名
30
- DRONE_GIT_PASSWORD= # Gitea 密码
31
drone-agent:
32
image: drone/drone-runner-docker:1
33
restart: always
34
depends_on:
35
- drone-server
36
networks:
37
- drone
38
volumes:
39
- /var/run/docker.sock:/var/run/docker.sock
40
environment:
41
- DRONE_RPC_SECRET= # 这里的密钥要和 Server 一样
42
- DRONE_RPC_PROTO=http
43
- DRONE_RPC_HOST= # 和上面的 DRONE_SERVER_HOST

Gitea同理,我们只需要在docker-compose up -d即可。

第一次打开 Drone 会先跳到 Gitea 进行验证。由于打开 Drone 会验证 Gitea 是否登陆,所以不用担心 Drone 的页面直接暴露到公网。

测试 Drone 和 Gitea

  1. 在 Gitea 中创建一个 repo
  2. 在 Drone 激活该 repo
  3. 创建公钥并加入到 gitea 中(这一步和 Github 类似)
  4. 将 repo clone 到本地
  5. 创建一个.drone.yml文件:
  6. git commit and push

.drone.yml的样例如下:

1
kind: pipeline
2
type: docker
3
name: default
4
5
steps:
6
- name: greeting
7
image: alpine
8
commands:
9
- echo hello
10
- echo world

关于.drone.yml的信息可以查看官方文档

之后估计也会写一篇 blog 对 Drone 的使用进行下总结。

本文标题:Gitea + Drone CI/CD
文章作者:wuxiaobai24
发布时间:2020-03-27