未完待续!

目的是为了实现hexo博客的自动部署, 每次push完之后, 触发drone ci自动进行部署。

选用drone的原因还是因为轻量, 且功能够用,如果用其他的CI工具,比如jenkins,我这小小的VPS部署服务一多,就扛不住了。

本文中drone是和gitea进行集成的, 如果要和其他仓库集成, 参考官方文档即可:https://docs.drone.io/

部署服务还是通过docker来进行。

准备工作

登录gitea, 进入设置->应用, 新建一个给drone用的OAuth2授权

注意, 重定向URI(Redirect URI)是你的drone服务的域名加上login。

生成授权之后, 会得到一个客户端ID和客户端秘钥, 记下来, 后面会用到。

drone搭建

本文在部署的时候, 是将drone和gitea进行集成,

drone的服务分为两部分:

  • drone-server
  • drone-runner-docker

本人将这两个服务都部署在同一个docker-compose.yml中,同时数据库还是连接的一个单独的mysql容器服务,所以需要先创建数据库, 命令如下:

1
create database drone default character set utf8mb4 collate utf8mb4_unicode_ci;

下面是docker-compose.yml文件, 其中db-net就是一个包含mariadb容器的docker网络, 具体创建过程见另外一篇博客:个人博客工具搭建。各个参数见说明。

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
version: "3"
networks:
db-net:
external: true
services:
drone-server:
image: drone/drone:2.12.1
container_name: drone-server
restart: always
networks:
db-net:
aliases:
- drone
ports:
- "6340:80"
volumes:
- ${PWD}/data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- DRONE_SERVER_HOST=drone服务的域名
- DRONE_SERVER_PROTO=https
- DRONE_RPC_SECRET=自已生成的一个随机字符串即可
- DRONE_GITEA_CLIENT_ID=之前在gitea上生成的客户端ID
- DRONE_GITEA_CLIENT_SECRET=之前在gitea上生成的客户端密钥
- DRONE_GITEA_SERVER=gite的地址
- DRONE_DATABASE_DATASOURCE=数据库连接地址,格式 username:password@tcp(host:port)/drone
- DRONE_DATABASE_DRIVER=mysql
- DRONE_USER_CREATE=username:sobriver,admin:true # 一定要配,否则无法登录gitea

drone-runner-docker:
image: drone/drone-runner-docker:1.8.2
container_name: drone-runner-docker
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- DRONE_RPC_HOST=drone服务的域名
- DRONE_RPC_PROTO=https
- DRONE_RPC_SECRET=自已生成的一个随机字符串即可,和server的要一样
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=docker-runner

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl;
server_name 你的域名
charset utf-8;
ssl_certificate 域名pem文件;
ssl_certificate_key 域名key文件;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:6340;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

服务启动之后,打开登录页面, 会自动跳转到gitea的登录, 登录成功之后, 对应于相应的仓库, 激活即可。

.drone.yml文件编写

此处实现当我们写完一篇文章,push到远程之后,自动触发hexo的构建,并将构建完成之后的文件移动到博客文件目录。

在项目的根目录下创建.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
35
36
37
38
39
40
41
42
43
44
kind: pipeline
type: docker
name: blog-job
steps:
- name: Hexo Build
image: node:12-alpine
commands:
- npm install hexo-cli -g
- npm install hexo-generator-sitemap --save
- npm install hexo-generator-baidu-sitemap --save
- npm install
- hexo clean
- hexo g
- name: Origin File Clean
image: appleboy/drone-ssh
settings:
host:
from_secret: SSH_HOST
port:
from_secret: SSH_PORT
username:
from_secret: SSH_USERNAME
password:
from_secret: SSH_PASSWORD
script:
- rm -rf /blog/public/*
- name: SCP File Transfer
image: appleboy/drone-scp
settings:
target: /blog
source: ./public
host:
from_secret: SSH_HOST
port:
from_secret: SSH_PORT
username:
from_secret: SSH_USERNAME
password:
from_secret: SSH_PASSWORD
rm: true

trigger:
event:
- push

说一下几个步骤含义:

  • Hexo Build 使用hexo构建文件
  • Origin File Clean 清除原先文件, 此处设置的构建文件的存储路径为/blog/public/
  • SCP File Transfer 将构建完的文件移动到指定目录

其中from_secret的值是利用drone的secret来新建的,如下图所示:

几个值含义如下:

  • SSH_HOST 远程登录主机的IP
  • SSH_PORT 远程登录端口
  • SSH_USERNAME 远程登录用户名
  • SSH_PASSWORD 远程登录密码

参考资料:

  1. https://docs.drone.io/server/provider/gitea/
  2. https://www.qikqiak.com/post/drone-with-k8s-2/