未完待续!
目的是为了实现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
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 远程登录密码
参考资料:
- https://docs.drone.io/server/provider/gitea/
- https://www.qikqiak.com/post/drone-with-k8s-2/