在群晖上搭建gitea+drone实现Hexo自动发布
本文将主要介绍如何在群晖NAS上搭建drone系统,并通过gitea和drone的配合,完成博客网站的自动构建和发布。其中,gitea的搭建暂不介绍,有兴趣的可以在移步谷歌,相对来说比较简单。
必要条件
- 一台支持
docker
的群晖NAS - 安装并配置好的
gitea
- 网站项目的源码
关于Drone
CI/CD工具其实有很多,比如老牌的Jenkins,GitLab CI,TravisCI等等,Jenkins曾经简单使用过,但是实在是太老了,配置起来也比较复杂。而Drone使用简单的 YAML 配置文件和 Dockercompose 的超集在 Docker容器中创建和执行流水线。运行时会自动下载独立的 Docker镜像,然后执行流水中的每一个动作。简单来说,只要提前把Drone服务搭建好,剩下的配置只需要写到又一个YAML文件中就行,非常方便。
另外一点在权限管理方面,Drone没有独立的权限管理功能,而是选择与git工具共享权限,这样就不需要在为用户单独设置一套权限,也是非常nice的。
安装Drone
Drone由两部分构成,分别是Drone-Server和Drone-Runner,Drone-Server用于管理项目和相关配置,流水线实际实在Drone-Runner中执行,下面开始安装:
1. 创建gitea应用和RPC SECRET
- 首先打开gitea,在
设置
—应用
中新增 OAuth2应用⚠️注意,是Oauth2应用,不是AccessToken,应用名称按自己喜欢的填,重定向可以先随便填,等Drone-Server安装好以后,确定ip/域名和端口后再回来修改。
填完后点击创建应用,将得到
客户端ID
和客户端密钥
,注意客户端密钥
只显示一次,需要先复制保存下来
- 生成RPC SECRET
RPC SECRET是用于Drone-Server和Drone-Runner之前通信认证使用的,后面会用到。
打开终端,输入以下命令,将得到一串随机码,复制保存下来。
openssl rand -hex 16
2. 安装Drone-Server
- 在群晖docker中搜索,选择
drone/drone
官方镜像下载
- 下载完成后,在
映像
中找到后双击开始配置设置名称
设置挂载目录,需要现在共享文件夹中创建目录
设置端口映射
设置环境变量
环境变量比较重要,配置错了直接导致容器无法访问,需要特别注意。依次添加以下环境变量:
DRONE_USER_CREATE : username:xxx,admin:true #指定管理员账号,其中 xxx 就是gitea中的账号名 DRONE_GITEA_CLIENT_ID: xxxxxxxxxxxxxxxxxx # 上面在gitea中创建的Oauth2的客户端ID DRONE_GITEA_CLIENT_SECRET: xxxxxxxxxxxxx # 上面在gitea中创建的Oauth2的客户端密钥 DRONE_GITEA_SERVER: https://your.giteadomain # gitea的地址 DRONE_GIT_ALWAYS_AUTH: false #是否总是要求gitea授权,建议false DRONE_RPC_SECRET: xxxxxxxxxxxxx # 前面通过openssh创建的随机码 DRONE_SERVER_HOST: drone.ownerdomain.com # drone server自己的访问地址,注意不要加http或https DRONE_SERVER_PORT: :80 #默认80即可 DRONE_SERVER_PORT: https # 访问drone server的协议,http或https,按实际填
- 完成全部设置后,点击应用返回引导页。下一步,选中
向导完成后运行容器
,点击应用,这时候容器就启动了。 - 登录Drone-Server
首次登录,在浏览器输入地址后,会自动根据容器环境变量中配置的gitea地址,跳转到gitea进行授权。在授权页面同意后即可完成应用授权,以后再打开drone就不需要再授权了,会直接进入管理页面。如下图,可以看到gitea中的项目已经自动被拉到drone中了。
2. 安装Drone-Runner
上面介绍完了drone-server的搭建以及与gitea的联动,但还不能实现自动部署应用,要达成这个目的,我们还得安装Drone-Runner才行,它才是真正的
打工人
!
- 与安装Drone-Server一样,搜索和下载镜像我们就不再说了,直接看镜像的配置,如下:
不需要挂载
卷
,但是需要映射一个端口然后是环境变量,如下图:
DRONE_RUNNER_NAME: xxxx # 名称,默认是主机名 DOCKER_API_VERSION:1.39 # 一定不能高于主机上docker支持的最大客户端版本,是个坑 DRONE_RPC_PROTO: https #与drone server通信的协议 DRONE_RPC_HOST: your.dronedomain #drone server的地址,不要加http或https DRONE_RPC_SECRET:xxxxx #前面通过openssh创建的随机码,用于server和runner之间的认证 DRONE_RUNNER_CAPACITY: 10 # runner最大并行的任务数量,默认是2
- 配置完成后,启动容器。
配置Drone 项目
现在,Server和Runner都已经跑起来了,接下来就可以准备起飞了!!!
1. 配置项目
登录drone server,点击你要自动发布的git项目,切换到SETTINGS
,建议选中 Trusted
,否则无法映射本地目录,其他可以保持默认,保存即可。
2. 编写发布文件
首先在项目根目录下创建drone.yml
文件。
因为我是使用hexo写博客的,相关的构建和发布配置都在hexo的_config.yml
文件中配置好了,所以自动化流水线要做的就是clone代码,然后安装依赖,最后执行hexo的构建和发布命令即可。下面是文件中的代码:
drone.yml
---
kind : pipeline
type: docker
name : blog-deploy
steps:
- name: restore-cache # 缓存插件,非必需
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
restore: true
mount:
- ./node_modules
- name: deploy # 核心步骤
image: centos/nodejs-10-centos7:latest
user: root # 使用root用户运行,各种报错排查后的成果
# environment:
when:
branch: master #仅当分支是master时才执行
commands: # 以下是详细的构建和发布过程,仅供参考,不能通用
- chmod 777 /drone/src
- ssh-agent bash
- mkdir /root/.ssh
- touch /root/.ssh/known_hosts
- cp id_rsa /root/.ssh/id_rsa
- cp id_rsa.pub /root/.ssh/id_rsa.pub
- chmod 700 /root/.ssh/id_rsa
- ssh-keyscan -t rsa -p 1046 hostip >> /root/.ssh/known_hosts
- ssh-add -k /root/.ssh/id_rsa
- npm install -g hexo
- npm install --unsafe-perm=true --allow-root
- yum install rsync
- hexo g -d
- name: rebuild-cache # 缓存插件,非必需
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /cache
settings:
rebuild: true
mount:
- ./node_modules
trigger: # 触发条件,git push即触发
event:
- push
volumes: # 挂载主机目录,供缓存插件使用,非必需
- name: cache
host:
path: /volume1/docker/drone/cache
3. 跑起来
OK,一切准备就绪,这时候,只要把代码通过git push到gitea上就会触发自动构建和发布。
等待自动化流水线自动执行,全部步骤都成功后,网站就发布更新了。当然,在流水线执行过程中肯定会遇到各种各样的问题,具体问题具体排查,顺不顺利还要看具体要构建和部署的内容,good luck !