Drone for Github|Golang CI集成

2021年9月21日 0 条评论 506 次阅读 0 人点赞

一、前言

Drone 是一套基于容器构建的CI工具,部署配置起来非常方便。

它的官网在这https://www.drone.io/

二、安装部署

话不多说,首先就是需要安装它,官方提供一套基于容器的单机部署方式。

你需要自行安装dokcerdocker-compose

安装完 docker-compose 后,将以下内容复制到 docker-compose.yml

docker-compose.yml 内容如下

(注:带 ${xxx} 形式的环境变量你不需要替换它,因为他会读取 .env 文件中的内容,而.env 文件的内容下文就有,最简单的方法就是你可以直接复制过来)

version: '3.7'

services:
  drone-server:
    image: drone/drone:1.6.2
    ports:
      - 80:80
      - 443:443 # 这个端口我暂时没用到,下次如果我配置 https 就会用到了
    restart: always
    volumes:
      - /var/lib/drone:/data
    environment:
      DRONE_AGENTS_ENABLED: "true"
      DRONE_GITHUB_SERVER: https://github.com
      DRONE_GITHUB_CLIENT_ID: ${DRONE_GITHUB_CLIENT_ID}
      DRONE_GITHUB_CLIENT_SECRET: ${DRONE_GITHUB_CLIENT_SECRET}
      DRONE_RPC_SECRET: ${DRONE_RPC_SECRET}
      DRONE_SERVER_HOST: ${SERVER_HOST}
      DRONE_SERVER_PROTO: http
      DRONE_USER_CREATE: username:xhyonline,admin:true # 设置用户名,是github的用户名.....但是你要区分账号,这就很离谱

  drone-runner:
    image: drone/drone-runner-docker:1
    ports:
      - 3000:3000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      DRONE_RPC_PROTO: http
      DRONE_RPC_HOST: ${SERVER_HOST}
      DRONE_RPC_SECRET: ${DRONE_RPC_SECRET}
      DRONE_RUNNER_CAPACITY: 3

介绍其中的几个参数:

  • drone配置项说明
    • DRONE_GITHUB_CLIENT_ID: 在Github中创建OAuth Application时生成的Client ID
    • DRONE_GITHUB_CLIENT_SECRET: 在Github中创建OAuth Application时生成的Client Secret
    • DRONE_SERVER_PROTO: Drone提供服务的prototype,可选为httphttps
    • DRONE_SERVER_HOST: Drone的server地址,设置为127.0.0.1作为本地地址,也可以设置为外部可访问的域名或IP地址
    • DRONE_TLS_AUTOCERT: 设置是否自动开启安全传输层协议,若设置为true,那么drone server proto会设置为使用httpsDRONE_SERVER_PROTO设置为http也是无效
    • DRONE_RUNNER_CAPACITY: drone提供服务的最大并行度
    • DRONE_SECRET_SECRET: 可自由设置
    • Drone用到的端口号有:80和443

紧接着你还需要设置GitHub OAuth Application

登陆你的github账户,在右上角点击个人头像,选择Setting,选择Developer settings,选择OAuth Application,选择新建一个application,如下图:

  • HomePage是DroneCI的访问地址,若是Drone由本地部署,那就可以设置为http://127.0.0.1 (当然我是部署在服务器上,这里就填写了 http://服务器的IP)
  • Authorization callback URL是DoneCI的登陆地址,格式必须是{{HomePage}}/login,如http://127.0.0.1/login (同理如果你部署在服务器上请记得修改)
  • 创建成功以后,拿到Client IDClient Secret

最后在 docker-compose.yml 的同级目录下创建 .env 文件,并且填入以下内容

#!/bin/bash

export SERVER_HOST=CI机器的IP,例如:39.96.14.232,你也可以填写域名
export DRONE_RPC_SECRET="请自行生成秘钥对,你可以用命令openssl rand -hex 16 生成,然后黏贴在这里"
export DRONE_GITHUB_CLIENT_ID="你在Github上的ClientID"
export DRONE_GITHUB_CLIENT_SECRET="你在Github上的secret"

启动它

docker-compose up
docker-compose up -d # 后台启动

启动后你就可以通过访问 CI 机器的 IP 就能访问到了。

刚开始,浏览器会重定向到github登陆认证页面(如下图所示)

使用github账户登陆之后,浏览器被重定向回drone,并被授权访问你的github仓库

  • 选中你要配置的仓库,点击ACTIVATE按钮,进入SETTINGS卡片,点击ACTIVATE按钮开启这个仓库.开启之后可以设置CI任务的基本配置。用过jenkins的人会发现,这个页面显然简洁一点。 此时,github仓库中会添加一条webhook地址,当github仓库发生改变时会通过webhook通知drone server。 不过,问题是这个webhook地址是DRONE_SERVER_HOST,如果配置为127.0.0.1或外网不可达时,这个webhook地址github是访问不到的。不过这不影响Cron Job的触发。
  • 配置里面有四个主要选项
  • Main: 主要配置
    • Project settings:设置是否开启仓库保护,若开启,那么每次触发CI自动编译都需要仓库管理员手动确认
    • Project visibilty:设置仓库可见性,因为你设置的host地址所有人都可以访问到,并通过自己的github账户登陆,可见性可以保护你的仓库
    • Configuration:设置CI任务的yaml配置文件,这里面制定了CI的所有流程,一般放在仓库根目录下,名为.drone.yaml,稍后会详细说明

Secrets: 如Drone Secret文档中所说,不方便明文存储到代码仓库里的密码值,可以通过Repository SecretsEncrypted SecretsExternal Secrets来存储 这里的Secrets设置可以指定Repository Secrets,在Secret Name中指定密码名称,Secret Value中设置该值。Allow Pull Requests是指,当是pull_request请求时这个密钥是否可被使用,因为其他人可能会通过pull request来触发CI,造成安全隐患。

.drone.yaml中可以通过from_secret引用,如下面的usernamepassword

kind: pipeline
      name: default

      steps:
      - name: build
        image: alpine
        environment:
          USERNAME:
            from_secret: username
     PASSWORD:
          from_secret: password
  • steps指定CI执行的步骤,默认pipline或创建一个叫做clone的步骤,它是从git仓库克隆代码大步骤
  • 多个step之间可以通过depends_on来指定执行顺序,比如先clone,后build,然后deploy
  • 同一个pipline下的多steps之间默认是串行的,实现方式应该是下面的stepdepends_on紧邻的上一个step
  • pipline之间是并行的,同一个yaml文件里使用---分割多个pipline的定义
  • triggers是指在什么情况下才会执行ICI任务,比如只对master分支的pull requestpush事件触发
  • 在每一个step中,可以通过Conditions来指定在CI过程中是否执行该step,通过when关键字指定。trriger是指定pipline何时被执行,condition指定pipline中的step是否被执行,如:

最后:

以下是完整的 Golang 在项目中定义 .drone.yml 文件,当你 push 到github 上时,就会触发构建,失败时会发送通知的 webhook

kind: pipeline
type: docker
name: srv-usercenter # 改改就能用 全局替换 srv-usercenter


steps:
  # 编译阶段
  - name: build
    image: golang:1.16-alpine
    volumes: # 将编译时将所需的依赖映射出来,避免下次构建时重新下载,当然如果你不需要,也可以把 volumes 删掉,大不了每次重新下载。请注意!!:挂载时需要在drone后台将 Trusted 勾上,具体路径请看下文的图片
      - name: cache-go-deps
        path: /go # 容器内的路径
    commands:
      - go version
      - go env -w GOPROXY=https://goproxy.cn,direct
      - go build -o app main.go
  # 压缩编译后的二进制文件
  - name: upx
    image: cnbattle/drone-upx
    settings:
      save_file: app_upx
      original_file: app
      level: 9
  # 将编译产物 rsync 到宿主机
  - name: rsync
    image: drillster/drone-rsync # 文档自行查看 drone 这个插件
    settings:
      hosts:
        from_secret: host # host 就是在drone中设置的 secret 选项,具体看下面的图片
      user:
        from_secret: user
      key:
        from_secret: key # 请使用 ssh-keygen -t rsa 生成秘钥对,然后将公钥拷贝到要操纵的目标器的/root/.ssh/authorized_keys里,再把私钥黏贴到 drone 后台的secret里
      source: ./app_upx
      target: /build/srv-usercenter # 我们提前需要在目标机器上创建 build目录
      delete: true
      script:
        - tree /build
        - /build/srv-usercenter # 你可以在目标机器上执行重启命令来完成CI
    when:
      status:
        - success

# 将容器内挂载出来,和构建阶段的 volumes 承接 
volumes:
  - name: cache-go-deps
    host:
      path: /var/local/drone-cache/repo/go-cache # 宿主机的路径

trigger:
  branch:
    - master
  event:
    - push

---
## 以下是构建完成后发送通知的事件
kind: pipeline
type: docker
name: notify

clone:
  disable: true

steps:
  - name: send
    image: plugins/webhook
    settings:
      username:
        from_secret: username
      password:
        from_secret: password
      method: POST
      urls: http://url/webhook # 请将 url 自行修改成你自己的
      content_type: application/json
      template: |
        {
          "owner": "{{ repo.owner }}",
          "repo": "{{ repo.name }}",
          "status": "{{ build.status }}",
        }
trigger:
  status:
    - success
    - failure

depends_on: [srv-usercenter]

兰陵美酒郁金香

大道至简 Simplicity is the ultimate form of sophistication.

文章评论(0)

你必须 登录 才能发表评论