关于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 = gitRUN_MODE = prod[database] DB_TYPE = mysqlHOST = 192.168 .1 .2 :3306 NAME = gogsUSER = rootPASSWD = password SSL_MODE = disablePATH = data/gogs.db [repository] ROOT = /data/gi t/gogs-repositoriespublish [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 = fileLEVEL = Info ROOT_PATH = /app/g ogs/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过程