或许在 Nas (群晖 [Docker]) 上 Gogs 和 Drone 更配哦

关于 DroneDocker in Docker (dind) 解决方案,本人历经 2天尝试了各种解决方案,最终解决方案为 volumes 挂载,已在本文体现

为什么

为什么?为什么要使用 GogsDrone?答案是习惯!!!

工作中一般使用 GIT 管理工具为 gitlab,自有开源项目一般都是使用的 github,自有私有项目之前一直用 gitee;玩 Nas 也有好几年了,最初也想过在 Nas 上通过 docker 搭建 gitlab 无奈配置不过硬

怎么说呢?了解 Gogs 是在它出来的那一段时间,但是也一直没有用过。最近心血来潮还是想自己在 Nas 上做一个 GIT 私有服;于是挑中了 GogsGitea,鉴于两个服务属于同源最后选择了 Gogs

Gogs

关于 Gogs 的安装我这里就不过多的赘述,可以看下面的两个文档

Gogs Github

Gogs Docker

这需要说明的是 Gogs 支持 MySQL, PostgreSQL, SQLite3, MSSQLTiDB;目前我使用的是 MySQL,关于 Mysql 的安装部署可以查看官方文档这里也不过多赘述

Mysql 安装文档

对于在群晖 Docker 中去管理 Mysql 的工具这里我推荐 adminer 安装文档如下

adminer 安装文档

最后我要说的是一个是端口映射的问题,一个是卷映射的问题,如下图


最后直接访问:http://192.168.1.2:10080 就 OK 了

这里贴出一下整个 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
50
51
52
53
// /data/gogs/conf/app.ini

APP_NAME = Gogs
RUN_USER = git
RUN_MODE = prod

[database]
DB_TYPE = mysql
HOST     = 192.168.1.2:3306 // mysql地址端口
NAME     = gogs
USER = root
PASSWD   = password // mysql密码
SSL_MODE = disable
PATH = data/gogs.db

[repository]
ROOT = /data/git/gogs-repositories
publish
[server]
DOMAIN           = 192.168.1.2 // 访问域名
HTTP_PORT       = 10080 // http端口
ROOT_URL         = http://192.168.1.2/ // 访问域名
DISABLE_SSH = false
SSH_PORT         = 10022 // SSH端口
START_SSH_SERVER = false
OFFLINE_MODE = false

[mailer]
ENABLED = false

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION   = true // 禁止注册,只能有管理员能加账号
ENABLE_CAPTCHA         = true
REQUIRE_SIGNIN_VIEW   = true // 默认跳转到登录页

[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY = security

到此为止,我们就完成了 Gogs 的所有安装

Drone

Drone 安装

为什么?为什么要使用 Drone 还是因为习惯。因为在使用 Gitlab 的时候使用的 CI/CD 都是 gitlab 自带的 gitlab ci;所以这里我们也需要一个 CI/CD 的工具于是我选择了 Drone,当然市场上 CI/CD 的工具是比较多的

Drone 安装这里我们参考官方文档

Gogs 单机安装文档

Docker 命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run \
-d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/drone:/data \
-e DRONE_GIT_ALWAYS_AUTH=false \
-e DRONE_GOGS_SERVER=http://192.168.1.2:10080 \
-e DRONE_SERVER_HOST=http://192.168.1.2:10800 \
-e DRONE_DATABASE_DRIVER=mysql \
-e DRONE_DATABASE_DATASOURCE="root:password@tcp(192.168.1.2:3306)/drone?parseTime=true" \
-p 80:80 \
-p 443:443 \
--name=drone \
drone/drone:latest

这里贴别强调一下 /var/run/docker.sock:/var/run/docker.sock 的挂载是必不可少的,因为后面的 DIND 会用到,另外因为我使用了 Mysql 所以上面 DRONE_DATABASE_DRIVER 配置为 mysql

接下来访问 http://192.168.1.2:10800 就会出现 Drone 登录界面,账号为 Gogs 管理员账号,这两个账号相通,而且也会自动同步 Gogs 项目

.drone.yml

在编辑.drone.yml 之前我们需要在 drone 管理界面对项目设置

这里需要设置项目为受信任项目,如果 Project settings 未显示,则表示当前用户在 Drone 不是管理员可以更改数据库授权为管理员

1
UPDATE `users` SET `user_admin` = '1' WHERE `user_id` = '1';

接下来我们编写.drone.yml,对于.drone.yml 编写我们以 Spring Boot 项目为例,首先我们需要编辑 DockerFile

1
2
3
4
5
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/hello-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

接下来我们编辑.drone.yml,关于.drone.yml 请参考.drone.yml 文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kind: pipeline
name: default

steps:
- name: build
image: maven:3.5-jdk-8
commands:
- mvn package -B -Dmaven.test.skip=true # 打包跳过测试

- name: publish
image: docker:dind
volumes:
- name: docker
path: /var/run/docker.sock # dind挂载来自Drone容器/var/run/docker.sock
commands:
- docker login --username=* --password=* registry.cn-shenzhen.aliyuncs.com
- docker build -t spring-boot:master .
- docker tag spring-boot:master registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master
- docker push registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master

volumes:
- name: docker
host:
path: /var/run/docker.sock # 这里挂载Drone容器所在/var/run/docker.sock,当然Drone容器/var/run/docker.sock来自于群晖宿主机/var/run/docker.sock

通过上面我们定义了两步,build 利用 mavenSpring Boot 进行了打包操作;publish 利用 dind 将打包好的 jar 包通过 DockerFile 打包成镜像并推送到镜像仓库,这里说一下我使用的镜像仓库是阿里云

这里也请注意 WebHook 的地址为上面安装的 Drone 地址请注意填写正确

下面我们看一下 Drone 执行过程

到这里我们就告一段落了


以上就是群晖对接整个 GogsDrone 过程