项目作者: fangbinwei

项目描述 :
将网站部署到阿里云OSS. Deploy website on aliyun OSS(Alibaba Cloud OSS)
高级语言: Go
项目地址: git://github.com/fangbinwei/aliyun-oss-website-action.git
创建时间: 2020-08-01T13:12:55Z
项目社区:https://github.com/fangbinwei/aliyun-oss-website-action

开源协议:

下载


aliyun-oss-website-action

deploy website on aliyun OSS(Alibaba Cloud OSS)

将静态网站部署在阿里云OSS

概览

  • 在阿里云OSS创建一个存放网站的bucket
  • 准备一个域名, 可能需要备案(bucket选择非大陆区域, 可以不备案, 但是如果CDN加速区域包括大陆, 仍然需要备案)
  • 在你的网站repo中, 配置github action, action 触发则增量上传网站repo生成的资源文件到bucket中
  • 通过阿里云OSS的CDN, 可以很方便地加速网站的访问, 支持HTTPS

    阿里云HTTPS免费证书停止自动续签, 但是可以自己申请免费的证书, 具体解决方案参考该公告

Usage

  1. - name: upload files to OSS
  2. uses: fangbinwei/aliyun-oss-website-action@v1
  3. with:
  4. accessKeyId: ${{ secrets.ACCESS_KEY_ID }}
  5. accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}
  6. bucket: your-bucket-name
  7. # use your own endpoint
  8. endpoint: oss-cn-shanghai.aliyuncs.com
  9. folder: your-website-output-folder

如果你使用了environment secret请查看这里

配置项

  • accessKeyId: 必填
  • accessKeySecret: 必填
  • endpoint: 必填, 支持指定protocol, 例如https://example.org或者http://example.org
  • folder: 必填, repo打包输出的资源文件夹
  • bucket: 必填,部署网站的bucket, 用于存放网站的资源
  • indexPage: 默认index.html.网站首页(用于静态页面配置)
  • notFoundPage: 默认404.html.网站404页面(用于静态页面配置)
  • incremental: 默认true. 使用增量上传.
  • skipSetting: 默认false, 是否跳过设置静态页面配置
  • htmlCacheControl: 默认no-cache
  • imageCacheControl: 默认max-age=864000
  • pdfCacheControl: 默认max-age=2592000
  • otherCacheControl: 默认max-age=2592000
  • exclude: 不上传folder下的某些文件/文件夹
  • cname: 默认false. 若endpoint填写自定义域名/bucket域名, 需设置为true. (使用CDN的场景下, 不推荐使用自定义域名)

incremental

开启incremental
上传文件到OSS后, 还会将文件的ContentMD5Cache-Control收集到名为.actioninfo的私有文件中. 当再次触发action的时候, 会将待上传的文件信息与.actioninfo中记录的信息比对, 信息未发生变化的文件将跳过上传步骤, 只进行增量上传. 且在上传之后, 根据.actioninfo和已上传的文件信息, 将OSS中多余的文件进行删除.

.actioninfo 记录了上一次action执行时, 所上传的文件信息. 私有, 不可公共读写.

关闭incremental 或 OSS中不存在.actioninfo文件

会执行如下步骤

  1. 清除所有OSS中已有的文件
  2. 上传新的文件到OSS中

计划未来优化这个步骤, 优化后, 先上传新的文件到OSS中, 再diff删除多余的文件.

Cache-Control

为上传的资源默认设置的Cache-Control如下
|资源类型 | Cache-Control|
|——| ——|
|.html|no-cache|
|.png/jpg…(图片资源)|max-age=864000(10days)|
|other|max-age=2592000(30days)|

静态页面配置

默认的, action会将阿里云OSS的静态页面配置成如下
2020-08-06-03-18-25

若不需要action来设置, 可以配置skipSettingtrue

exclude

如果folder下的某些文件不需要上传

  1. - name: exclude some files
  2. uses: fangbinwei/aliyun-oss-website-action@v1
  3. with:
  4. folder: dist
  5. exclude: |
  6. tmp.txt
  7. tmp/
  8. tmp2/*.txt
  9. tmp2/*/*.txt
  10. # match dist/tmp.txt
  11. # match dist/tmp/
  12. # match dist/tmp2/a.txt
  13. # match dist/tmp2/a/b.txt, not match dist/tmp2/tmp3/a/b.txt

不支持**

或者

  1. - name: Clean files before upload
  2. run: rm -f dist/tmp.txt

Docker image

直接使用已经build好的docker image

  1. - name: upload files to OSS
  2. uses: docker://fangbinwei/aliyun-oss-website-action:v1
  3. # 使用env而不是with, 参数可以见本项目的action.yml
  4. env:
  5. ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
  6. ACCESS_KEY_SECRET: ${{ secrets.ACCESS_KEY_SECRET }}
  7. BUCKET: your-bucket-name
  8. ENDPOINT: ali-oss-endpoint
  9. FOLDER: your-website-output-folder

Demo

部署VuePress项目

  1. name: deploy vuepress
  2. on:
  3. push:
  4. branches:
  5. - master
  6. jobs:
  7. build:
  8. runs-on: ubuntu-latest
  9. steps:
  10. # load repo to /github/workspace
  11. - uses: actions/checkout@v2
  12. with:
  13. repository: fangbinwei/blog
  14. fetch-depth: 0
  15. - name: Use Node.js
  16. uses: actions/setup-node@v1
  17. with:
  18. node-version: '12'
  19. - run: npm install yarn@1.22.4 -g
  20. - run: yarn install
  21. # 打包文档命令
  22. - run: yarn docs:build
  23. - name: upload files to OSS
  24. uses: fangbinwei/aliyun-oss-website-action@v1
  25. with:
  26. accessKeyId: ${{ secrets.ACCESS_KEY_ID }}
  27. accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}
  28. bucket: "your-bucket-name"
  29. endpoint: "oss-cn-shanghai.aliyuncs.com"
  30. folder: ".vuepress/dist"

具体可以参考本项目的workflow, npm/yarn配合action/cache加速依赖安装

Vue

see here

  1. - name: upload files to OSS
  2. uses: fangbinwei/aliyun-oss-website-action@v1
  3. with:
  4. accessKeyId: ${{ secrets.ACCESS_KEY_ID }}
  5. accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}
  6. bucket: website-spa-vue-demo
  7. endpoint: oss-spa-demo.fangbinwei.cn
  8. cname: true
  9. folder: dist
  10. notFoundPage: index.html
  11. htmlCacheControl: no-cache
  12. imageCacheControl: max-age=864001
  13. otherCacheControl: max-age=2592001

FAQ

配合CDN使用时, OSS更新后, CDN未刷新

开启OSS提供的CDN缓存自动刷新功能, 将触发操作配置为PutObject, DeleteObject.

2020-12-13-23-51-28

2020-12-13-23-51-55

endpoint使用自定义域名, 但是无法上传

  1. 如果endpoint的域名CNAME记录为阿里云CDN, CDN是否配置了http强制跳转https? 若配置了, 需要在endpoint中指定https, 即endpointhttps://example.org

  2. 如果endpoint的域名CNAME记录为阿里云CDN, 在CDN为加速范围为全球时有遇到过如下报错The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., 则endpoint不能使用自定义域名, 使用OSS源站的endpoint.

配置了environment secret怎么不生效

2021-05-21-16-47-59

如果使用environment secret, 那么需要如下类似的配置

  1. jobs:
  2. build:
  3. runs-on: ubuntu-latest
  4. + environment: your-environment-name