最近想实践一下 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
在安装Gitea
和Drone
时,我们都选择使用docker-compose
来管理,因此需要先安装docker
和docker-compose
。
创建一个gitea
文件夹,并在该文件夹下创建docker-compose.yml
文件:
1version: "2"2
3networks:4 gitea:5 external: false6
7services:8 server:9 image: gitea/gitea:1.1110 environment:11 - USER_UID=100012 - USER_GID=100013 - RUN_MODE=prod14 - SSH_PORT= 3022 #SSH端口15 - SSH_DOMAIN= #IP地址或URL11 collapsed lines
16 - DISABLE_REGISTRATION=False #取消注册17 restart: always18 networks:19 - gitea20 volumes:21 - ./gitea:/data22 - /etc/timezone:/etc/timezone:ro23 - /etc/localtime:/etc/localtime:ro24 ports:25 - "3000:3000"26 - "3022:3022"
这里面需要注意的是,设置SSH_PORT
和SSH_DOMAIN
,这样 gitea 生成的 repo SSH 链接才是能直接使用的形式。
填写完后,直接docker-compose up -d
开启服务即可,第一次登陆时,会跳出一个安装页面,可以设置所使用的数据库和管理员账号,同时要记得检查一下 SSH 端口和域名是否正确。
Drone
Drone
的安装比Gitea
复杂的多,同时需要先在Gitea
中创建OAuth2
应用程序:
打开Gitea
的页面 -> 个人信息 -> 应用 -> 管理 OAuth2 应用程序
应用名称填什么都无所谓,但是重定向 URL 比较重要,要填 Drone
服务的地址(虽然现在还没启动),比如说,你的 Drone 的 ip
地址为1.2.3.4
,Drone
端口的为8000
,
那么就可以填http://1.2.3.4:8000
。
创建后会得到一个客户端ID和客户端密钥。这时,Gitea
的设置就已经完成了。
为了让Drone Server
和Drone Runer
能够通过RPC
连接,我们需要生成RPC
密钥,可以在 shell 中使用该命令来生成随机数,用该随机数作为 RPC 的密钥
1$ openssl rand -hex 16
上面的操作中可以得到:
- 客户端 ID
- 客户端密钥
- RPC 密钥
创建一个drone
文件夹并在其中创建一个docker-compose.yml
文件:
1version: "3.5"2
3networks:4 drone:5 name: drone_network6
7services:8 drone-server:9 image: drone/drone:110 ports:11 - 8000:8012 - 443:44313 networks:14 - drone15 volumes:28 collapsed lines
16 - ./drone-data:/var/lib/drone17 - /var/run/docker.sock:/var/run/docker.sock18 restart: always19 environment:20 - DRONE_GITEA_CLIENT_ID= # Gitea 客户端ID21 - DRONE_GITEA_CLIENT_SECRET= # Gitea 客户端密钥22 - DRONE_GITEA_SERVER= # Gitea URL 地址23 - DRONE_GITEA=true24 - DRONE_RPC_SECRET= # Drone RPC 密钥25 - DRONE_SERVER_HOST= # Drone URL,可以填域名或 ip:port26 - DRONE_SERVER_PROTO=http # Drone 所使用的协议 http 或者 https27 # 由于我的 Gitea 的设置是只允许登陆用户访问代码的,所以 Git 需要 Auth28 - DRONE_GIT_ALWAYS_AUTH=true29 - DRONE_GIT_USERNAME= # Gitea 用户名30 - DRONE_GIT_PASSWORD= # Gitea 密码31 drone-agent:32 image: drone/drone-runner-docker:133 restart: always34 depends_on:35 - drone-server36 networks:37 - drone38 volumes:39 - /var/run/docker.sock:/var/run/docker.sock40 environment:41 - DRONE_RPC_SECRET= # 这里的密钥要和 Server 一样42 - DRONE_RPC_PROTO=http43 - DRONE_RPC_HOST= # 和上面的 DRONE_SERVER_HOST
和Gitea
同理,我们只需要在docker-compose up -d
即可。
第一次打开 Drone 会先跳到 Gitea 进行验证。由于打开 Drone 会验证 Gitea 是否登陆,所以不用担心 Drone 的页面直接暴露到公网。
测试 Drone 和 Gitea
- 在 Gitea 中创建一个 repo
- 在 Drone 激活该 repo
- 创建公钥并加入到 gitea 中(这一步和 Github 类似)
- 将 repo clone 到本地
- 创建一个
.drone.yml
文件: - git commit and push
.drone.yml
的样例如下:
1kind: pipeline2type: docker3name: default4
5steps:6- name: greeting7 image: alpine8 commands:9 - echo hello10 - echo world
关于.drone.yml
的信息可以查看官方文档。
之后估计也会写一篇 blog 对 Drone 的使用进行下总结。