在群晖上搭建gitea+drone实现Hexo自动发布

作者 胡萝虎 日期 2021-01-28
在群晖上搭建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客户端密钥,注意客户端密钥只显示一次,需要先复制保存下来

    image-20210128202101713

    image-20210128202239134

  • 生成RPC SECRET

    RPC SECRET是用于Drone-Server和Drone-Runner之前通信认证使用的,后面会用到。

    打开终端,输入以下命令,将得到一串随机码,复制保存下来。

    openssl rand -hex 16

    image-20210128203720595

2. 安装Drone-Server

  • 在群晖docker中搜索,选择 drone/drone官方镜像下载

image-20210128201450591

  • 下载完成后,在映像中找到后双击开始配置

    设置名称

    image-20210128201629438

设置挂载目录,需要现在共享文件夹中创建目录

image-20210128201817256

设置端口映射

image-20210128205021850

设置环境变量

环境变量比较重要,配置错了直接导致容器无法访问,需要特别注意。依次添加以下环境变量:

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,按实际填

image-20210128205417482

  • 完成全部设置后,点击应用返回引导页。下一步,选中向导完成后运行容器,点击应用,这时候容器就启动了。

  • 登录Drone-Server

    首次登录,在浏览器输入地址后,会自动根据容器环境变量中配置的gitea地址,跳转到gitea进行授权。在授权页面同意后即可完成应用授权,以后再打开drone就不需要再授权了,会直接进入管理页面。如下图,可以看到gitea中的项目已经自动被拉到drone中了。

    image-20210128211214505

    image-20210128211233886

2. 安装Drone-Runner

上面介绍完了drone-server的搭建以及与gitea的联动,但还不能实现自动部署应用,要达成这个目的,我们还得安装Drone-Runner才行,它才是真正的打工人

  • 与安装Drone-Server一样,搜索和下载镜像我们就不再说了,直接看镜像的配置,如下:

    不需要挂载,但是需要映射一个端口

    image-20210128211833423

    然后是环境变量,如下图:

    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

image-20210128212159569

  • 配置完成后,启动容器。

配置Drone 项目

现在,Server和Runner都已经跑起来了,接下来就可以准备起飞了!!!

1. 配置项目

登录drone server,点击你要自动发布的git项目,切换到SETTINGS,建议选中 Trusted,否则无法映射本地目录,其他可以保持默认,保存即可。

image-20210128213639501

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上就会触发自动构建和发布。

image-20210128214751687

等待自动化流水线自动执行,全部步骤都成功后,网站就发布更新了。当然,在流水线执行过程中肯定会遇到各种各样的问题,具体问题具体排查,顺不顺利还要看具体要构建和部署的内容,good luck !

“扫一扫接着看”