关于 Drone
之 Docker in Docker (dind)
解决方案,本人历经 2天
尝试了各种解决方案,最终解决方案为 volumes
挂载,已在本文体现
为什么
为什么?为什么要使用 Gogs
和 Drone
?答案是习惯!!!
工作中一般使用 GIT
管理工具为 gitlab
,自有开源项目一般都是使用的 github
,自有私有项目之前一直用 gitee
;玩 Nas
也有好几年了,最初也想过在 Nas
上通过 docker
搭建 gitlab
无奈配置不过硬
怎么说呢?了解 Gogs
是在它出来的那一段时间,但是也一直没有用过。最近心血来潮还是想自己在 Nas
上做一个 GIT
私有服;于是挑中了 Gogs
和 Gitea
,鉴于两个服务属于同源
最后选择了 Gogs
Gogs
关于 Gogs
的安装我这里就不过多的赘述,可以看下面的两个文档
Gogs Github
Gogs Docker
这需要说明的是 Gogs
支持 MySQL
, PostgreSQL
, SQLite3
, MSSQL
和 TiDB
;目前我使用的是 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
|
APP_NAME = Gogs RUN_USER = git RUN_MODE = prod
[database] DB_TYPE = mysql HOST = 192.168.1.2:3306 NAME = gogs USER = root PASSWD = password SSL_MODE = disable PATH = data/gogs.db
[repository] ROOT = /data/git/gogs-repositories publish [server] DOMAIN = 192.168.1.2 HTTP_PORT = 10080 ROOT_URL = http: DISABLE_SSH = false SSH_PORT = 10022 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
利用 maven
对 Spring Boot
进行了打包操作;publish
利用 dind
将打包好的 jar
包通过 DockerFile
打包成镜像并推送到镜像仓库,这里说一下我使用的镜像仓库是阿里云
这里也请注意 WebHook
的地址为上面安装的 Drone
地址请注意填写正确
下面我们看一下 Drone
执行过程
到这里我们就告一段落了
以上就是群晖对接整个 Gogs
和 Drone
过程