前段时间开了个隐蔽的小站用来写日志,因为不想在这上面花太多钱买好的服务器,
所以博客系统采用了全静态的Hexo,加上轻量的Gitea,512M内存正好。
但是这个博客系统有点麻烦的就是部署到Git上面之后还得在网站根目录git pull
一遍。
Drone正好能解决这个问题。当博客被部署到Git上之后可以触发Drone的webhook实现自动CI/CD。
此文用来简单讲一下配置过程。
Gitea的安装
参考官方文档即可食用。
https://gitea.io
Drone的安装
Drone根据源码管理系统的不同安装方式也不同,不过前提是要有Docker环境。
Docker的安装可以参考Docker官方文档。
https://docs.docker.com/get-docker/
与Gitea配合使用首先要在Gitea生成一个用于OAuth验证的Client ID和Secret Key,按照下面官方介绍的安装即可。
https://docs.drone.io/server/provider/gitea/
安装Docker Runner
执行持续集成的流水线主要是Runner,Runner有很多种,个人比较推荐的是Docker。
Docker环境里和系统有一定的隔离性,
https://docs.drone.io/runner/docker/installation/linux/
注意事项
如果想要把宿主目录挂载到Runner里面,需要把工程设置成可信任。
https://docs.drone.io/pipeline/docker/syntax/volumes/host/
因为对宿主的文件系统操作是有一定的风险性的。
要把工程设置成可信任,需要先设置一个Drone的管理员。
只需要要启动Drone的时候在环境变量里设置一个和Gitea同名的管理员即可。
参考以下文档:
https://docs.drone.io/server/reference/drone-user-create/
比如你的Gitea账户名称为JUN,就这样设置:
DRONE_USER_CREATE=username:JUN,machine:false,admin:true,token:xxxxx
docker-compose
以下是一段可供参考的docker-compose配置文件
version: '3'
services:
drone:
image: drone/drone:latest
container_name: drone
volumes:
- "/usr/local/drone:/data"
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_GITEA_SERVER=https://git.yourdomain.com
- DRONE_GITEA_CLIENT_ID=xxxxxx
- DRONE_GITEA_CLIENT_SECRET=xxxxx
- DRONE_RPC_SECRET=xxxxx
- DRONE_SERVER_HOST=drone.yourdomain.com
- DRONE_SERVER_PROTO=https
- DRONE_GIT_ALWAYS_AUTH=true
- DRONE_USER_CREATE=username:JUN,machine:false,admin:true,token:xxxxxx
restart: always
ports:
- "8081:80"
drone-docker-runner:
image: drone/drone-runner-docker:latest
container_name: drone-docker-runner
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
environment:
- DRONE_RPC_PROTO=https
- DRONE_RPC_HOST=drone.yourdomain.com
- DRONE_RPC_SECRET=xxxxxx
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=drone-runner
restart: always
depends_on:
- drone
.drone.yml
以下是一段可供参考的流水线配置。
这里在runner上挂载了宿主的目录,已经在drone里将工程设置成了可信任。
简单介绍一下:
workspace是指git clone的临时目录。这里设置成了容器里的/home/wwwroot/tmp/deploy_temp。
然后image这里我使用了golang是为了以后可以编译运行golang,可以根据自身需要设置成alpine也可以。
volumes段里设置了宿主目录映射。
将宿主目录的/home/wwwroot/site_root映射到了容器内/tmp/site_root。
这段流水线主要进行的是将git clone下来的文件复制到宿主目录的/home/wwwroot/site_root下。
---
kind: pipeline
type: docker
name: deploy-site
workspace:
base: /home/wwwroot/tmp
path: deploy_temp
steps:
- name: copy-file
image: golang
volumes:
- name: site_root
path: /tmp/site_root
commands:
- mkdir -p /tmp/site_root
- cd /tmp/site_root
- rm -rf *
- cp -rf /home/wwwroot/tmp/deploy_temp/* /tmp/site_root
volumes:
- name: site_root
host:
path: /home/wwwroot/site_root
trigger:
branch:
- master
event:
- push