前言
github有一个神器,叫做Github Actions,基于它提供的自动化构建服务,我们可以进行构建,测试,打包,部署我们的代码项目,相对于jenkins这类构建服务,它最大的优势是提供了整套服务器环境,包括Linux,Windows,macOS这些可选的服务器,这样一来,我们就不需要把时间花在搭建服务器这类繁冗无意义的事情上,把精力集中在我们的构建脚本任务上。
开始
我们先看一个例子main.yml:
name: Flutter Web Build To Github Page
on:
push:
branches:
- master
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@master
- name: build
uses: subosito/flutter-action@v1
with:
channel: 'stable'
- run: flutter pub get
- run: flutter channel master
- run: flutter upgrade
- run: flutter config --enable-web
- run: flutter build web
- run: cp ./CNAME ./build/web/CNAME
- name: deploy
uses: peaceiris/actions-gh-pages@v2.5.0
env:
PERSONAL_TOKEN: ${{ secrets.ACCESS_TOKEN }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: ./build/web
Github Actions的脚本任务是yml格式的,上面这个脚本的任务如name,就是使用flutter web构建web项目,然后把网站产物部署到GitHub Pages,打包部署一步到位。
基本概念
如上,Github Actions有几个关键字:
- workflow: 就是指整个脚本运行的过程
- on: 指的是触发任务的条件,如push等条件
- job: 是运行在特定环境的一次任务,一个workflow包含多个job
- step: 描述执行job的步骤,一个job包含多个step
- action: 是每个step执行的命令,一个step包含多个action
他们之间的关系如下:
workfolw > job > step > action
了解了基本概念之后,接下来我们分析上面的任务都做了啥,
-
首先看到on,条件是push,分支是master,所以这个workflow触发的条件就是我们在master分支push了代码,更多的触发条件可以看这里;
-
然后就是jobs,开始job之前,需要设定执行环境,也就是runs-on,我上面设置的是 ubuntu-latest;
-
接着就是一个又一个的step:
- checkout: 把master的分支切出来
- build: 执行了一系列的flutter web构建命令,和平时在命令行做的操作没有差异。
flutter pub get flutter channel master flutter upgrade flutter config --enable-web flutter build web- deploy: 部署操作,把上个step产生的产物推送到一个新分支gh-pages, 产物的输出文件夹是./build/web
-
等待所有任务执行完毕,此次构建就完成了。
除此之外,上面的构建脚本还有几个要注意的地方:
-
上述使用的actions/checkout其实是github提供的标准actions, 所以执行checkout操作,只需直接使用;
-
除了标准actions,我们还可以使用开发者在marketplace发布的actions,像上述执行的flutter构建任务,是需要flutter环境的,而使用了
subosito/flutter-action@v1,就无需关心环境问题,直接执行相应的构建命令即可; -
部署操作,推到GitHub Page需要配置
ACCESS_TOKEN, 这个需要在GitHub项目的settings进行设置。 -
Github page默认是取的
gh-pages分支,可以在CNAME配置自定义域名, 同时因为每次部署会把CNAME覆盖,所以会进行cp操作,把CNAME拷贝到产物文件夹一起进行部署。
总结
Github神器:
- Github Actions ➡ 0服务器持续打包构建项目
- Github Pages ➡ 0需服务器部署网站
Github Actions + Github Pages 🔜 持续编码👨💻,自动部署🔨。