docker持续集成-drone发布静态博客
将hugo产生的静态页面推送到github
并通知到钉钉群

目标

自动化发布github pages
原流程:
通过hugo生成github pages
将public文件夹中的文件拷贝到xxx.github.io项目
更新该项目到github上

自动化流程:
当确认新文章可以更新到博客上时
将该文章提交到私有仓库src-repo
触发drone任务
drone会拉取新文章 通过hugo生成public文件夹
拷贝到xxx.github.io项目中 并提交推送
最后发通知到钉钉群

drone服务搭建

drone-server 用来管理任务,将任务调度给runner
runner则负责执行构建任务

之前本文依据1.0版本的drone写的 现在根据1.6版本的drone调整

前置配置项

一个github账户 访问 https://github.com/settings/tokens 可看到两个选项卡 oauth apps、Personal access tokens 通过该账户创建一个oauth的clientId secret 以及 accessToken clientId 用来给drone-server做企业账户 accessToken 则是作为commit push仓库时,登录用

drone-server绑定github

 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
#github中创建的oauth信息
DRONE_GITHUB_CLIENT_ID=c48b2xxxx7b6ed
DRONE_GITHUB_CLIENT_SECRET=e8exxxxef9c7deb2
#drone集群内部的共享密钥
DRONE_RPC_SECRET=9847fbbe1bf5f1556cf12adbef1153b8
#对外提供访问域名 与端口
DRONE_SERVER_HOST=tom.kongzi.com:12321
DRONE_SERVER_PROTO=http

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_GITHUB_SERVER=https://github.com \
  --env=DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} \
  --env=DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} \
  --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \
  --env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST} \
  --env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
drone/drone:1.6

#在 https://github.com/settings/developers 可创建Client ID, Client Secret  
#在路由器上配置端口转发 将请求到的12321端口的数据转发drone所在主机的80端口

runner

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
DRONE_RPC_SECRET=9847fbbe1bf5f1556cf12adbef1153b8
#这里写的drone-server的访问地址, 没用上面的域名,而是内网地址
DRONE_RPC_HOST=tom.kongzi.com:12321
DRONE_RPC_PROTO=http

docker run -d \

  -v /var/run/docker.sock:/var/run/docker.sock \

  -e DRONE_RPC_PROTO=${DRONE_RPC_PROTO} \

  -e DRONE_RPC_HOST=${DRONE_RPC_HOST} \

  -e DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \

  -e DRONE_RUNNER_CAPACITY=2 \

  -e DRONE_RUNNER_NAME=runnerA \

  -p 3000:3000 \

  --restart=on-failure:3 \

  --name runner \

drone/agent:1.6

配置构建流程

经过上面几步 drone环境搭好了 下面开始在drone中添加hugo编译博客的流程

访问管理界面 tom.kongzi.com 进行登录时会跳到githu网站进行授权登录
授权后 就能在管理页面中看到账户在github中的仓库了 选择仓库blog-hugo 为其配置构建流程

src-repo

将 hugo new site blog-hugo 生成的文件夹推送到仓库
github.com/duansheli/blog-hugo.git

博客文章源码通常放在blog-hugo\content\posts中
生成后博客页面位置 blog-hugo\public

blog-hugo/.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
25
26
27
28
29
30
31
32
33
34
kind: pipeline
type: docker
name: default

steps:
- name: build
  image: monachus/hugo:v0.59.0
  environment:
    GH_TOKEN: 
      from_secret: github_token
  commands:
  - hugo -t maupassant -b "https://duansheli.github.io"
  - git clone https://$GH_TOKEN@github.com/duansheli/duansheli.github.io.git blgo
  - cd blgo/
  - rm -rf *.html *.xml
  - cp -rf ../public/* ./
  - git config --global user.email hello@163.com
  - git config --global user.name hello 
  - git add .
  - git commit -m bydrone
  - git push

- name: notify
  image: lddsb/drone-dingtalk-message
  settings:
    access_token:
      from_secret: dingtalk_token
    lang: zh_CN
    msg_type: text
    msg_at_all: false
  when:
    status:
    - success
    - failure

target-repo

最终要把页面发布到 src-repo/public中的文件放到target-repo仓库
github.com/duansheli/duansheli.github.io.git

钉钉的webhook

方案为钉钉群的机器人 通过webhook触发

  1. 创建钉钉群
  2. 为钉钉群添加机器人 选择自定义类型(webhook)
  3. 查看该机器人的webhook-url中的参数token

配置Secrets

关键参数(dingtalk_token,github的账户密码)并没有写在.drone.yml中
而是在管理界面为构建配置项添加的

1
2
github_token=7cb835xxxxx13e0c8ef79
dingtalk_token=16dcc56xxxxx1eefbe2f6

测试

任意写篇文章 hello.md放入项目 blog-hugo\content\posts
提交到github上后 drone会自动进行编译静态博客, 并发布到github博客中
钉钉软件中可收到任务成功或失败的消息
然后访问博客查看新文章