在群晖上搭建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 !

Recommended Posts

Jellyfin中使用QSV替代VAAPI转码

使用过Jellyfin的应该都会遇到转码的问题,默认情况下都是使用VAAPI进行转码,这种方式兼容性比较好,但是转码的性能比较一般。如果使用的是Intel平台J4125及更早的CPU的话,建议切换为QSV(Intel Quick Sync )进行转码,效率会比VAAPI快很多,并且CPU也会更低。

胡萝虎 

在群晖上使用Docker部署为知笔记服务

虽然市面上有很多各种类型的云笔记应用,像有道云笔记、印象、OneNote,包括Notion,博主都曾尝试使用过。但是随着资料越来越多,特别是一些涉及个人隐私的资料放在云端笔记上,比如密码、账号之类的,让博主越来越感到焦虑😂。博主此前也曾在群晖部署过蚂蚁笔记,但是使用感受实在不咋滴;一段时间以来,只能勉强用群晖自带的弱智Note Station来记录个人资料,真怕哪天自己也搞弱智了。

最近实在受不了Note Station的反人类操作了,不得不再次开启寻找解决方案的征途,幸运的是,Eureka…… 为知笔记的私有化方案终于让我解放啦

胡萝虎 

在群晖中搭建Cloudreve网盘系统

众所周知,某度网盘为了挣钱,各种极限限速,下载限速能把人恶心死。但是,网盘类服务越来越成为人们的刚需,不管是个人生活中的照片,还是工作学习中各类资料,相信很多人都需要使用到网盘进行存储和分享。如果你不想忍受某度的速度,建议有条件的朋友可以试试自己搭建一套网盘系统,本文以Cloudreve为例,在群晖NAS上搭建一套属于自己的私人网盘服务,供读者们参考

胡萝虎 

在群晖上搭建Bitwarden密码管理服务器

管理密码是很多人头痛的事,密码设置简单好记又不太安全,设置复杂又容易忘。为了解决这个难题,市面上出现了不少密码管理工具,帮助人们管理在各种平台、系统、网站、APP上设置的密码,比如1Password、Lastpass、KeePass等,不过绝大多数需要付费才能使用。本着能白嫖就绝不花一个子儿的原则,今天我就来介绍一个不需要花钱的密码管理器——Bitwarden

胡萝虎 

使用Docker一键安装服务端神器Appwrite

Appwrite是一个基于Docker的开源的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面极简了从零编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。

简单来说,如果你只会前端开发,不懂后端技术,那么这个神器就可以帮你轻松完成后端服务搭建,包括账户、用户、团队、数据库、存储、云函数等等,目前支持各类前端平台,包括Flutter、Vue、Angular、React、iOS和Android等

胡萝虎 

Leave A Comment