Github Action自动部署构建
文章目录
Github Action自动部署构建
1. 简介
2. 基础概念
3. workflow 文件
3.1 触发事件
3.2 job任务
3.3 运行主机环境
3.4 运行步骤
3.5 引用action
3.6 显示workflow status
3.7 with传参
3.8 env环境变量
3.9 secrets引用
3.10 action/checkout检查
4. 获取token
5. 示例
5.1 一条命令的action
5.2 React 项目发布到 GitHub Pages
1. 简介
GitHub Actions 是 GitHub 的持续集成服务,于2018年10月推出。
GitHub Actions 帮助您自动完成软件开发周期内的任务。 GitHub Actions 是事件驱动的,意味着您可以在指定事件发生后运行一系列命令。
工作流程是您添加到仓库的自动化过程。 工作流程由一项或多项作业组成,可以计划或由事件触发。 工作流程可用于在 GitHub 上构建、测试、打包、发布或部署项目。
GitHub 官方市场,我们除了自己编写action,也可以借用别人的。
每个 action 就是一个独立脚本,因此可以做成代码仓库,使用userName/repoName的语法引用 action。比如,actions/setup-node就表示github.com/actions/setup-node这个仓库,它代表一个 action,作用是安装 Node.js。事实上,GitHub 官方的 actions 都放在 github.com/actions 里面。
actions 也有版本的概念,下面都是合法的 action 引用,用的就是 Git 的指针概念,详见官方文档。
actions/setup-node@74bc508 # 指向一个 commit actions/setup-node@v1.0 # 指向一个标签 actions/setup-node@master # 指向一个分支
2. 基础概念
workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务;
step(步骤):每个 job 由多个 step 构成,一步步完成。
action (动作):每个 step 可以依次执行一个或多个命令(action)。
GitHub Actions 为每个任务 (job) 都提供了一个虚拟机来执行,每台虚拟机都有相同的硬件资
- 2-core CPU
- 7 GB RAM 内存
- 14 GB SSD 硬盘空间
使用限制:
每小时可以调用1000次 GitHub API 。
每个 job 最多可以执行6个小时。
免费版的用户最大支持20个 job 并发执行,macOS 最大只支持5个。
私有仓库每月累计使用时间为2000分钟,超过后$ 0.008/分钟,公共仓库则无限制。
操作系统方面可选择 Windows server、Linux、macOS,并预装了大量软件包和工具。
虽然名称叫持续集成,但当所有任务终止和完成时,虚拟环境内的数据会随之清空,并不会持续。即每个新任务都是一个全新的虚拟环境。
3. workflow 文件
GitHub Actions 的配置文件叫做 workflow 文件(官方中文翻译为 “工作流程文件”),存放在代码仓库的.github/workflows 目录中。workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml,比如 p3terx.yml。一个库可以有多个 workflow 文件,GitHub 只要发现.github/workflows 目录里面有.yml 文件,就会按照文件中所指定的触发条件在符合条件时自动运行该文件中的工作流程。在 Actions 页面可以看到很多种语言的 workflow 文件的模版,可以用于简单的构建与测试。
workflow 文件的配置字段非常多,详见官方文档。下面是一些基本字段。
#name字段是 workflow 的名称。如果省略该字段,默认为当前 workflow 的文件名。 name: GitHub Actions Demo
3.1 触发事件
#push事件触发 workflow。 on: push #on字段也可以是事件的数组。`push`事件或`pull_request`事件都可以触发 `workflow`。 on: [push, pull_request]
#只有`master`分支发生`push`事件时,才会触发 workflow on: push: branches: - master
#push tag 时触发 on: push: tags: - 'v*' #发布 release 触发 on: release: types: [published] 定时触发 on: schedule: - cron: '0 * * * *'
3.2 job任务
workflow
文件的主体是jobs
字段,表示要执行的一项或多项任务。
jobs
字段里面,需要写出每一项任务的job_id
,具体名称自定义。job_id
里面的name
字段是任务的说明。
#job_id分别是my_first_job和my_second_job jobs: my_first_job: name: My first job my_second_job: name: My second job
#`needs`字段指定当前任务的依赖关系,即运行顺序。`job1`必须先于job2完成,而job3等待`job1`和`job2`的完成才能运行 #因此,这个 workflow 的运行顺序依次为:`job1、job2、job3`。 jobs: job1: job2: needs: job1 job3: needs: [job1, job2]
3.3 运行主机环境
runs-on
字段指定运行所需要的虚拟机环境。它是必填字段。目前可用的虚拟机如下。
ubuntu-latest,ubuntu-18.04或ubuntu-16.04 windows-latest,windows-2019或windows-2016 macOS-latest或macOS-10.14
runs-on: ubuntu-18.04
3.4 运行步骤
#`steps`字段指定每个 `Job` 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下三个字段。 jobs.<job_id>.steps.name:步骤名称。 jobs.<job_id>.steps.run:该步骤运行的命令或者 action。 jobs.<job_id>.steps.env:该步骤所需的环境变量。
steps: - uses: actions/setup-node@74bc508 # Reference a specific commit - uses: actions/setup-node@v1 # Reference the major version of a release - uses: actions/setup-node@v1.2 # Reference a minor version of a release - uses: actions/setup-node@master # Reference a branch
示例:
jobs: build: # Job name is Greeting name: Greeting # This job runs on Linux runs-on: ubuntu-latest steps: # This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action - name: Hello world uses: actions/hello-world-javascript-action@v1 with: who-to-greet: 'Mona the Octocat' id: hello # This step prints an output (time) from the previous step's action. - name: Echo the greeting's time run: echo 'The time was ${{ steps.hello.outputs.time }}.'
3.5 引用action
#public repo {owner}/{repo}@{ref} or {owner}/{repo}/{path}@{ref}. #same repo {owner}/{repo}@{ref} or ./path/to/dir |-- hello-world (repository) | |__ .github | └── workflows | └── my-first-workflow.yml | └── actions | |__ hello-world-action | └── action.yml jobs: build: runs-on: ubuntu-latest steps: # This step checks out a copy of your repository. - uses: actions/checkout@v1 # This step references the directory that contains the action. - uses: ../github/actions/hello-world-action #docker container docker://{image}:{tag} 示例: jobs: my_first_job: steps: - name: My first step uses: docker://gcr.io/cloud-builders/gradle - name: Install Dependencies run: npm install shell: bash
3.6 显示workflow status
![](https://github.com/actions/hello-world/workflows/Greet Everyone/badge.svg)