使用drone和gogs搭建自己的CI/CD系统
drone是一个基于容器的本地持续交付平台,和Jenkins是差不多的,然后配合轻量级的gogs来作为git管理,都是基于golang开发的很符合我的需求,我们来把它们结合作为一个完整的CI、CD平台。
首先我们要先安装docker,上次的篇幅我们已经说过了我就不赘述了。
需要的东西有:linux,docker,docker-compose,drone,gogs,git等。
安装gogs和drone
配合荣锋亮大哥的yml文件和docker-compose我们可以很容易安装他们:
version: '3' services: drone-server: image: drone/drone:latest ports: - "8080:80" - 8843:443 - 9000 volumes: - ./drone:/var/lib/drone/ - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_OPEN=true - DRONE_SERVER_HOST=drone-server - DRONE_DEBUG=true - DRONE_GIT_ALWAYS_AUTH=false - DRONE_GOGS=true - DRONE_GOGS_SKIP_VERIFY=false - DRONE_GOGS_SERVER=http://gogs:3000 - DRONE_PROVIDER=gogs - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite - DRONE_DATABASE_DRIVER=sqlite3 - DRONE_SERVER_PROTO=http - DRONE_RPC_SECRET=ALQU2M0KdptXUdTPKcEw - DRONE_SECRET=ALQU2M0KdptXUdTPKcEw gogs: image: gogs/gogs:latest ports: - "10022:22" - "3000:3000" volumes: - ./data/gogs:/data depends_on: - mysql mysql: image: mysql:5.7.16 volumes: - ./gogs/mysql:/var/lib/mysql - /var/run/docker.sock:/var/run/docker.sock ports: - 3308:3306 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: gogs MYSQL_USER: gogs MYSQL_PASSWORD: pass TZ: Asia/Shanghai drone-agent: image: drone/agent:latest depends_on: - drone-server environment: - DRONE_RPC_SERVER=http://drone-server - DRONE_RPC_SECRET=ALQU2M0KdptXUdTPKcEw - DRONE_DEBUG=true - DOCKER_HOST=tcp://docker-bind:2375 - DRONE_SERVER=drone-server:9000 - DRONE_SECRET=ALQU2M0KdptXUdTPKcEw - DRONE_MAX_PROCS=5 docker-bind: image: docker:dind privileged: true # command: --storage-driver=overlay
我们创建一个存放docker-compose.yml文件的目录比如就叫gogs,然后我们把这些yml保存成docker-compose.yml,然后执行docker-compose来安装:
$ docker-compose up -d
配合yml文件,我们就安装好了drone-server和drone-agent还有gogs,然后我们用浏览器打开http://localhost:3000/
来进入gogs并初始化它。
域名和应用URL记得一样接着我们创建一个管理员用户,然后其他的都默认,点击立即安装完成。
初始化成功之后我们可以在gogs里边创建一个仓库,然后登陆drone。
drone
打开浏览器输入http://localhost/
直接进入drone,密码是gogs的你的刚刚的账户和密码。
我们会看到一个刚刚创建的仓库,激活它!
激活之后,我们回到gogs那边,仓库的设置里边的webhook应该已经配置好了
我们可以测试web hook,如果没有问题的话,应该会提示成功。
上传源码
测试没有问题之后,我们初始化我们的代码文件夹为git仓库,然后push到gogos上边
然后为你的仓库加上.drone.yml
配置文件,drone-server会自动读取这个文件进行CI、CD操作等。以下这个是我们的示例文件
kind: pipeline name: demo steps: - name: build image: golang:1.11.4 commands: - pwd - go version - go build . - go test demo/util # - name: frontend # image: node:6 # commands: # - npm install # - npm test - name: publish image: plugins/docker:latest settings: username: from_secret: docker_username password: from_secret: docker_password repo: example/demo tags: latest - name: deploy image: appleboy/drone-ssh pull: true settings: host: example.me user: root key: from_secret: deploy_key script: - cd /data - mkdir app/ - cd /data/app - docker rmi -f example/demo - echo "login docker" - echo "login success, pulling..." - docker pull example/demo:latest - echo "image running" - docker run -p 8088:8088 -d example/demo - echo "run success"
我们首先进行简单的golang build和test操作然后根据Dockerfile文件把我们的程序构建成docker镜像,接着上传到docker hub中,然后通过drone-ssh插件部署这个镜像。
开始构建
有了配置文件之后,推送代码我们就可以去drone查看构建进度:
drone的设置
在进入drone的时候,选择一个项目我们可以进行一些必要的设置,比如配置secrets,定时任务和徽章等等。
比如配置文件需要的密钥,用户名和密码,一些环境变量都可以在secrets设置,构建状态徽章可以在你的项目README.md文件加上去。
项目加上徽章:
示例代码,本文完。