准备
我们使用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服务:
使用浏览器打开http://127.0.0.1:13000/install
设置postgresql数据库,
设置应用基本设置
跳过邮件服务设置, 关闭·启用验证码服务,
设置管理员账号,
最后我们可以点击安装按钮了,浏览器将会跳转到http://host.docker.internal:3000
, 但是我们其实不能访问这个链接,不过不用担心,可以使用http://127.0.0.1:13000
配置ssh
在http://127.0.0.1:13000/user/settings/ssh页面上设置你的SSH 密钥:
创建仓库
这里我使用我的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
|
换一个目录, 把hoteler-web拉到本地,
1
| git clone ssh://git@localhost:10022/daming/hoteler-web.git
|
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的账号信息就好了
激活hoteler-web
仓库
我们需要设置Project Settings
中开启Truste配置:
配置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我们可以看到:
第一次ci/cd可能是网络问题,导致开启node:16
镜像太慢了,上面的截图其实是第二次的结果
问题
drone无法clone的gogs的地址问题
在gogs/gogs/conf/app.ini
中将EXTERNAL_URL修改为*http://host.docker.internal:13000/*(仅仅作为本地使用)
容器无法访问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
|
参考资料
- gogs官网
- gogs安装与说明(docker)
- Drone+Gogs+docker实现持续自动化部署
- 使用drone和gogs搭建自己的CI/CD系统
- Setup CI/CD service with gogs & registry & drone
- Drone 教程
- 轻量快速的CI工具Drone快速入门