怎样通过 Github Action 薅腾讯如此开发的羊毛

印记中文一向致力于为国内前端开发者供应技术文档的翻译服务,比如 React, Webpack, Node.js 等技术文档,都能有看到印记中文参加的影子o , g n D a r 6 W。为了让文档的加载速度更好,我们都把文档全数安置在腾讯云国内的 CDN 服务上。不过这也带来了比较大的本钱压力,做安置服务买的机器、每几个月要买 TB 级别的 CDN 流量包。

直到最近,腾讯如此开发推出的静态资源安置服务,对于许K E X多文档站、静态个人官网,无论是在安置上,仍是价格上,都非常的和睦亲民。通过核算发现,比将站点安置在云服务器以及传统的 CDN 愈加实惠。这么好的羊毛,不薅天理t t – D R u *难容啊!

怎么通过 Github Action 薅腾讯如此开发的羊毛

不过因为印记中7 a B + p { n $文的文档种类多,情况各不相同,通过一番的研究之后,梳理出以下的需求,而且输出了对应的处+ o + I m & g z理方案,希望开放出来给我们针对本身的情况运用。

印记中文的安置需求

  • 需求一:文档个数多,r p :希望可以共同发布方案

因为印记中文的文档不少,至少有R c d p K } ^ 10 个以上,安置的方案需求比较整齐划一才比较好地做保护。之前我们是通过 Node.js 写了一个安置服务,必定程度上减轻了安置的背负,但仍是需求在每个文档里,新参% / : [ /加脚本做构建和触发安置。而 Github Action 推出后,完美处理了 Github 项目构建与安置问题,因此依据 Github Action 做一个安置方案是比较好的处理计~ ( 2 b } B d j d划。

  • 需求二:文档的资源量大,需求增量发布才干

印记中文的文档是安置在子域下面的,之前是安置在腾讯云的 COS 和 CDN 服务上。有的文档的文件量非常大,像 react, webpack 的文档文件数,动辄上千,腾讯云途径的东西都只是供应全量的上传,这样不仅上传的速度慢,而且途径是会针对上传次数计费的,因此,我们要尽量削减每次发布的上传量,将功用提升并将本钱降低。作为有追求+ m X E + O *的开发者,怎样或许在发布这个作业让云途径赚到我们的钱呢!

  • 需求三:主站的 HTML 需求安置在云服务器

主站因为备案要求以及产品战略的联系,一般都需求安置在云服务o { 4 ! ; 4 ? P s器。因此印记中文的主站采纳的战略是 HTML 文件安置在云服务v Q ;器,其它的静态资源安置在云开发作为加快。

印记中文的 Github Action 处理方案

依据印记中文上述的需求,开放出一套处理方案,底子可以满足上述的需求。

首要我们要I 8 0处理的是一个共同的发布方案,对代码入侵比较少的首要就是运用 Github Action。印记中文的布% h 3 b % 8 @Github Action 一起能支撑腾讯云目标存储(COS)还有云开发(Cloudbase),地址在:github.com/docschina/d…

怎么通过 Github Action 薅腾讯如此开发的羊毛

下面代码是截取了印记中文主站安置的前半部份,首要的流程就是构建+安置。关于 Gith F 5 g Q . / } Yhub Action 的语法举荐到技术社区查找相关的帖子,本文首要是叙述安置的计+ i W j F 5 ) A划。

第一个 step(进程)是 Checkout,首要就是拉取代码。

第二个 stepBuild and Deploy,用于运转 npm run build 指令构建,并将构建到B ; _ } ` t U build 目录的代码都上传到 gh-pages 分支做存档。

第三个 stepCheck Build,用于查看 build 目录是否存在以及给它赋予可读写的权限。

第四个 stepDocschina Github Action,就是印记中文{ n ] 4 B 2 7 3 z的中心安置 Github Action,在SettingSecrets里填写了腾讯云的密钥o C |SECRET_ID, SE f g X J _ ? |ECRET_KEb W 2 t cY 和云开发发ENV_ID

怎么通过 Github Action 薅腾讯如此开发的羊毛
name: Build CI For Cloul M 9 @dBase
on:
  push:
    branches: [master]
jo: x , 7 ! d .bs:
  build:
    runs-on: ubuntu-latestE { r
    strategy:
      matrix:
        node-version: [12.x]
    steps:
      - name: Check! ) 9 _out
        uses: actions/cheP h R Q l Gckout@v2
      - name: B9 c | c P 6uild and Deploy
        uses: JamesIves/github-pap ; ! 4 / s C Mges-deploy-action@master
        env:
          ACCESS_TOKEN: ${{ secrets.ACCESS_TO| l _ _ ! k u gKEN }}
          BRANCH: gh-pages
          FOLDER: build
          BU8 p =ILD_SCRIPT: npm install --) . b b K * 3 s Ounsafe-perm=true && npm9 q F t run bu# 7 N ! ! m  M )ild
      - name: Check Build
        run: |
sudo -i
sudo chown -R $USER build
      - name: DocscD S rhina Github Action
        id: deployStatic
        useX v * d  m d B 0s: docschina/docschina-actions@master
        with:
          secretId: $_ + Q 8 } k ( ; G{{ secrets.SECRET_ID }}
          secretKey: ${{ secrets.SECRET_KEY }}
          staticSrcPath: ./buildl & Z U n E
          isForce: ${{ secrets.ISFORCE }}
          envId: ${{ secrets.ENV_ID }}

docschina/docschQ 1 ] L - }ina-actions@master 这个 GS D Z c ( T A t withub Action 跟腾 . P | T g讯云的官方东西相比,供应了哪些其它的才干呢?官方的东西,首要是供应了全量的文件上传,而印记n D !中文研s * P ~ U发的东西,供应了增量发布、强制全S X * O r p @ ! 5量发布、w f n Z * X s忽略文件、支撑 COS 和 Cloudbase 两种发布方法。

忽略文件,是通过 skipFiles 填入的数据参数完结的,而全量发布,可以通过给isForce传入true值达到。那终究怎样完结增量发布的呢?

一般来说,增量发布有两种方法,见下图:

怎么通过 Github Action 薅腾讯如此开发的羊毛

方案一是最准F ; + x确的做法,就是每次都去检测现网,看看资源是否存在,而对于 Web 进口的 HTML 文件还要多检测一次 MD5——那. A ( 4 b是为Q n l l D大多数非 HTML 资源,都会在文件名里加上 MD5 串,而 HTML 则不会。但这种求精确的计p O L | f x o划会带来 CDN 资源的耗费,因为每次发布的时分都得检测,而且发布的速度也会被拖慢。

方案二则是挑选用空间换时间,将现已发布过的文件信息 5 M都存在一个 manifest 的文件里,然后每次发布前都拉取一下这个文件,假如在该文件里出现过的就不再发布了,而且还会将本次发布的文件更新到该 manifest 文件中。这种方法的缺陷是或许不精确,因为或许因为其它的原因,比如手动删去文件,服务中的文件或许不存在,: A 4 n 5但 manifest 中现已有该文件的发布信息了。依据这个方案,印记中文做了一些小优化,HTML文件会在 manifest 中记载其内容的 md5 值,非 HTML 文件则会记载是否发布的布尔型值,别的还供应了isForce参数,允许用户可以强制全量发布,避免有一些文件丢失的时分E M z,可以全量先发布一次。

上面的方案现已能处理前两个需求了,那第三个需求呢?我们把印记中文主站最{ $ I C终部份的安置代码列出来。这里是运用了Pendect/action-rsyncerH I E J D A B v这个Github Action,将 HTML 文件,通过rsync指令_ ] / e传输到远端的服务器。

 - name: Deploy To Server
        usesI ` &: Pendect/action-rsyncer@v1.1.0
        env:
          DEPLOY_KEY: ${{secrets.DEPLOY_KEY}}
        with:
          flags: '-avzr'
          options: ''
          ssh_options: ''
          src: 'build/'
          dest: 'root@129.226.66o ; g _ 5 K j p N.15B 8 E E:/data/docs/docschina'
          SSH_PRIVATE_K  ( ( ~ c } y iEYZ c F: ${{ secrets.DEPLOY_KEY }}

Github Action怎样可以衔接远端的服务器呢?关键就是E O U I ~在于这个DEPLOY_KEY.首要,你得先得生成一个 SSH 私钥,这J 4 p / $ F O个生成跟你的 Github SSH 私钥生成的进程类似,w = + j , [ j $ S可以自行查找相关的文章。

然后,需求让你的服务器,加载该 SSH 私钥,如下图:

怎么通过 Github Action 薅腾讯如此开发的羊毛

然后,翻开该私钥文件,拿到内容,给Github Action配备DEPLOY_KEY内容,这样在运用rsync的时分,就能自动衔接上远端的服务器。

自此,通过组合自研的和别人的Github Action,底子完结了常见的不同情况的: K ( * 5静态资源安置。要感谢腾讯E / W ( e T如此开发研制团队给: L O B $ W予的一些帮忙,让我比较顺利地通过调用一[ B N T p些内部的 API 更好地完结定制的安置流程,让我愈加任性地薅这波羊毛。这波的 9.9 元的包年活动据说到到 7 月份v x I = 4,假如想把自己的静态站点迁移到云开发静态安置服务,可以尝试运用本文举荐的东西。

如有过错,恳请指正!