github+drone 自动化部署

544 阅读3分钟

服务器

在阿里云学生优惠中领取了一个免费7天的服务器。

github中添加OAUTH密钥

部署Drone之前在github中添加一个OAuth登录密钥,Drone使用OAuth方式登录。

1、打开setting -> Developer settings -> OAuth apps 添加一个新的oauth app

记住clint_id 和 secret 后面要用

image.png

其中

  • homepage url为drone server的地址
  • authorization callback url 为github oauth登录成功后的回调地址

编写dokcer-compose.yml文件

此文件用于编排生成运行容器(前提是服务器中安装了docker)

version: '3.9'
# 创建自定义网络
networks:
  drone:
    name: drone
    driver: bridge
services:
  # 数据库服务
  db:
    image: postgres:latest
    container_name: drone_db
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - '7931:5432'
    environment:
      - POSTGRES_USER=drone # PGSQL默认用户
      - POSTGRES_PASSWORD=drone # PGSQL默认密码
      - POSTGRES_DB=drone # PGSQL默认数据库
    volumes:
      - /volumes/drone/db:/var/lib/postgresql/data
  # Drone Server 服务
  server:
    image: drone/drone:2.8.0 # 目前drone最新版本为 2.8.0
    container_name: drone_server
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - '8888:80'
    environment:
      - DRONE_SERVER_PROTO=http # 访问协议,创建webHooks和重定向
      - DRONE_SERVER_HOST=47.115.223.63:8888 # 主机名称,创建webHooks和重定向
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 # 与 drone runner 通讯的密钥
      - DRONE_USER_CREATE=username:tlf,admin:true # 管理员账户
      - DRONE_DATABASE_DRIVER=postgres # 数据库类型
      - DRONE_DATABASE_DATASOURCE=postgres://drone:drone@db/drone?sslmode=disable # 数据库连接
      - DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份验证信息拉取代码
      - DRONE_GITHUB_CLIENT_ID=5922eead7512d27158c3 #上面申请的clientId
      - DRONE_GITHUB_CLIENT_SECRET=6911358fca7f451c22c7ab6a1c08864ebfc83f43 #github client secret
      - TZ=Asia/Shanghai

    volumes:
      - /volumes/drone/server:/data
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - db
  # Drone Docker Runner
  runner:
    image: drone/drone-runner-docker:1.8.0 # 目前drone-runner-docker最新版本为 1.8.0
    container_name: drone_runner
    restart: always
    networks:
      - drone # 加入到drone网络
    ports:
      - '7930:3000'
    environment:
      - DRONE_RUNNER_NAME=docker-runner
      - DRONE_RUNNER_CAPACITY=10 # 限制runner可执行的并发管道数量
      - DRONE_RPC_PROTO=http # 访问drone server 协议
      - DRONE_RPC_HOST=47.115.223.63:8888 # 访问drone server 服务器地址
      - DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 # 与 drone server 通讯的密钥
      - DRONE_UI_USERNAME=tlf # Drone Runner 的 UI 用户账号
      - DRONE_UI_PASSWORD=tlf # Drone Runner 的 UI 用户密码
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
    depends_on:
      - server
  • DRONE_RPC_SECRET 是drone server与runner通信的密钥,必须一致。
  • drone server :主要负责展示和管理自动部署的项目
  • drone runner: 负责执行操作,执行时会轮询server来确定执行的操作。
  1. 使用docker-compose up -d 命令来运行响应的容器。

image.png

image.png 此时相关容器以及运行起来。

2.访问docker server 的地址 http://127.0.0.1 会跳转到github进行oauth授权然后再跳转到login进行drone登录

3.进入drone页面

image.png

此页面已经是我测试部署成功的页面了。

4.激活仓库

image.png 点开未激活的仓库

image.png 进行激活并设置一些东西

image.png

  • Protected : 此属性是设置 是否要验证 配置文件(.drone.yml) 中的签名,开启后签名验证错误则不允许构建
  • timeout 是设置构建任务执行的超时时间。
  • Configuration 是设置配置文件文件,默认为  .drone.yml。 这个一般不需要改动。

编写 .doron.yml文件 此文件定义当github项目提交时,触发webhook发送消息后,drone自动化部署执行的操作。(放在项目的根目录中)

kind: pipeline # 定义一个管道
type: docker # 当前管道的类型
name: test # 当前管道的名称
steps: # 定义管道的执行步骤
  - name: test # 步骤名称
    image: node:latest # 当前步骤使用的镜像
    commands: # 当前步骤执行的命令
      - echo 测试drone执行

drone会根据step中的操作一步一步的执行。

稍微复杂一点的.drone.yml文件

kind: pipeline
name: 测试版

steps: 
   #git镜像
 - name: tlf
   image: alpine/git
   commands:
   - git checkout origin/tlf -B tlf

 - name: docker
   image: plugins/docker  #编译镜像
   volumes:                              #将容器中目录挂载到宿主机
   - name: docker                
     path: /var/run/docker.sock     
   settings:           
    repo: 
    registry: 
    dockerfile: Dockerfile --编译生成镜像时执行操作
    username:
      from_secret: docker_username
    password:
      from_secret: docker_password

 - name: notify     #通知镜像
   image: drillster/drone-email
   settings:
    host: sm
    port: 
    username: 
    password:
      from_secret: email_password
    from: 
    recipients: [  ]
   when:
    status: [success, failure]


volumes:        #定义流水线挂载目录
- name: docker
  host:
    path: /var/run/docker.sock

trigger:       #管道执行触发条件
  branch:
  - tlf

推送代码到github相关仓库触发自动化部署

image.png

drone执行相关操作,部署成功。