准备

我们使用docker-compose来安装gogs和drone。

首先我们准备数据库,gogs支持mysql,postgres, sqlite, sql server和TiDB。
这里我们选择使用postgre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3'
services:
postgres:
image: postgres:14.2
container_name: postgres
ports:
- 5432:5432
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
POSTGRES_DB: postgres
networks:
- ci-network

networks:
ci-network:
external: true

创建docker网络并启动数据库

1
2
3
docker network create ci-network (仅第一次运行)

docker-compose up postgres

Gogs

Gogs是一款极易搭建的自助 Git 服务, 使用go开发,可以很方便的在任何go支持的平台上部署

安装

在docker-compose.yaml上添加gogs

1
2
3
4
5
6
7
8
9
10
11
12
13
gogs:
image: gogs/gogs:0.12.6
container_name: 'gogs'
ports:
- '10022:22'
- '13000:3000'
volumes:
- ./gogs:/data
- gogs/gogs
depends_on:
- postgres
networks:
- ci-network

gogs使用22端口提供ssh, 使用3000提供web页面服务,这里我们分别映射到本地的10022和13000端口

启动gogs服务:

1
docker-compose up gogs

使用浏览器打开http://127.0.0.1:13000/install

gogs的install页面

设置postgresql数据库,

gogs的install的postgreql设置

设置应用基本设置

gogs的install的应用设置

跳过邮件服务设置, 关闭·启用验证码服务,

gogs的install的邮件设置

设置管理员账号,

gogs的install的管理员设置

最后我们可以点击安装按钮了,浏览器将会跳转到http://host.docker.internal:3000, 但是我们其实不能访问这个链接,不过不用担心,可以使用http://127.0.0.1:13000

配置ssh

http://127.0.0.1:13000/user/settings/ssh页面上设置你的SSH 密钥:

gogs的SSH密钥配置
gogs的SSH密钥配置

创建仓库

gogs的创建仓库
gogs的创建仓库
gogs的创建仓库

这里我使用我的hoteler-web作为demo:

1
2
3
git clone https://github.com/damingerdai/hoteler-web.git
git remote add gogs ssh://git@localhost:10022/daming/hoteler-web.git
git push gogs master

gogs的创建仓库

换一个目录, 把hoteler-web拉到本地,

1
git clone ssh://git@localhost:10022/daming/hoteler-web.git

gogs的hoteler-web仓库

Drone

Drone是一个持续集成和持续交付的平台,可以与Docker完美集成。相对于Jenkins来说更加轻量,可以配合轻量的Gogs来实现持续集成

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
drone-server:
image: drone/drone:2.11
container_name: drone
ports:
- 10081:80
- 9000
volumes:
- ./drone:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_SERVER_HOST=drone-server
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_GOGS=true
- DRONE_GOGS_SKIP_VERIFY=false
- DRONE_GOGS_SERVER=http://host.docker.internal:13000
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_SECRET=ALQU2M0KdptXUdTPKcEw
- DRONE_USER_CREATE=username:daming,admin:true
networks:
- ci-network
drone-runner-docker:
image: drone/drone-runner-docker:1.8.1
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./pipe/docker_engine://./pipe/docker_engine
restart: always
ports:
- 13001:3000
environment:
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_PROTO=http
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_RUNNER_CAPCAITY=2
- DRONE_RUNNER_NAME=docker-runner
- DRONE_SECRET=ALQU2M0KdptXUdTPKcEw
networks:
- ci-network

然后执行

1
docker-compose up drone-server drone-runner-docker

在浏览器中打开http://127.0.0.1:10081

drone没有自己的账号信息, 直接使用gogs的账号信息就好了

drone登录页面
drone注册页面

激活hoteler-web仓库

drone的hoteler-web
drone的hoteler-web

我们需要设置Project Settings中开启Truste配置:

drone的hoteler-web

配置drone.yml

1
2
3
4
5
6
7
8
9
10
11
kind: pipeline
name: hoteler-web

steps:
- name: frontend
image: node:16
commands:
- yarn install && yarn build
trigger:
branch:
- master

并提交到gogs仓库里。

配置gogs的wehook

在浏览器中进入http://127.0.0.1:13000/daming/hoteler-web/settings/hooks/1

我们把http://drone-server/hook改成http://host.docker.internal:10081/hook, 点击更新web钩子的按钮。

最后我们可以点击测试推送的按钮:

drone的webhook测试

在drone我们可以看到:

drone的webhook结果

第一次ci/cd可能是网络问题,导致开启node:16镜像太慢了,上面的截图其实是第二次的结果

问题

  1. drone无法clone的gogs的地址问题
    gogs/gogs/conf/app.ini中将EXTERNAL_URL修改为*http://host.docker.internal:13000/*(仅仅作为本地使用)

  2. 容器无法访问localhost
    windows或者mac用户可以使用host.docker.internal,其他系统尚未测试过。

docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
version: '3'
services:
postgres:
image: postgres:14.2
container_name: postgres
ports:
- 5432:5432
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
POSTGRES_DB: postgres
networks:
- ci-network
gogs:
image: gogs/gogs:0.12.6
container_name: 'gogs'
ports:
- '10022:22'
- '13000:3000'
volumes:
- ./gogs:/data
- gogs/gogs
depends_on:
- postgres
networks:
- ci-network
drone-server:
image: drone/drone:2.11
container_name: drone
ports:
- 10081:80
- 9000
volumes:
- ./drone:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_SERVER_HOST=drone-server
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_GOGS=true
- DRONE_GOGS_SKIP_VERIFY=false
- DRONE_GOGS_SERVER=http://host.docker.internal:13000
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_SECRET=ALQU2M0KdptXUdTPKcEw
- DRONE_USER_CREATE=username:daming,admin:true
networks:
- ci-network
drone-runner-docker:
image: drone/drone-runner-docker:1.8.1
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./pipe/docker_engine://./pipe/docker_engine
restart: always
ports:
- 13001:3000
environment:
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_PROTO=http
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_RUNNER_CAPCAITY=2
- DRONE_RUNNER_NAME=docker-runner
- DRONE_SECRET=ALQU2M0KdptXUdTPKcEw
networks:
- ci-network

networks:
ci-network:
external: true

参考资料

  1. gogs官网
  2. gogs安装与说明(docker)
  3. Drone+Gogs+docker实现持续自动化部署
  4. 使用drone和gogs搭建自己的CI/CD系统
  5. Setup CI/CD service with gogs & registry & drone
  6. Drone 教程
  7. 轻量快速的CI工具Drone快速入门