GitHubActions指南GitHubActions允许您直接在您的GitHub存储库中创建自定义工作流,工作流是指自动化过程,例如构建、测试、打包、发布、部署等,这意味着您可以做CI(持续集成)和CD(持续部署)直接。基本概念工作流:工作流工作流是一个完整的过程,每个工作流都包含一组jobs任务。job:jobs任务包含一个或多个job,每个job包含一系列steps步骤。step:每一步都可以执行指令或者使用action动作。action:每个动作都是一个共同的基本单元。配置工作流工作流必须存放在你的项目库根路径下的.github/workflows目录下,每个工作流对应一个特定的.yml文件(或.yaml)。示例工作流:name:GreetEveryone#此工作流在推送到存储库时触发。on:[push]jobs:your_job_id:#JobnameisGreetingname:Greeting#ThisjobrunsonLinuxruns-on:ubuntu-lateststeps:#此步骤使用GitHub的hello-world-javascript-action:https://github.com/actions/hello-world-javascript-action-name:Helloworlduses:actions/hello-world-javascript-action@v1with:who-to-greet:'MonatheOctocat'id:hello#此步骤打印上一步操作的输出(时间)。-name:Echothegreeting'stimerun:echo'Thetimewas${{steps.hello.outputs.time}}.'说明:最外层的名称指定工作流名称。on声明一旦发生推送操作就会触发工作流。jobs定义了一组任务,其中可以有一个或多个作业任务,示例中只有一个。runs-on声明运行环境。步骤定义需要执行的步骤。每个step都可以定义自己的name和id,可以通过uses声明具体的action,通过run声明需要执行哪些指令。${{}}可以接受上下文参数。上面的例子可以抽象为:name:on:<触发工作流的事件>jobs::name:runs-on:steps:-name:uses:with::id:-name:run:onon声明何时触发工作流,可以是:一个或多个GitHub事件,比如推送一个commit,createdanissue,generatedapullrequest等,example:on:[push,pull_request]scheduledtime,example(每天00:00触发):on:schedule:-cron:'00***'一些外部事件。所谓外部事件触发,简单来说就是你可以通过RESTAPI向GitHub发送请求来触发。详情请参考官方文档:repository-dispatch-event配置多个事件,例如:on:#触发工作流上推或拉请求,#但只针对主分支push:branches:-masterpull_request:branches:-master#同样在page_build上触发,以及release创建的事件page_build:release:types:#这个配置不影响上面的page_build事件-创建的详细文档,请参考:触发事件jobsjobs可以包含一个或多个jobs,比如as:jobs:my_first_job:name:Myfirstjobmy_second_job:name:Mysecondjob如果多个job之间存在依赖关系,可能需要使用needs:jobs:job1:job2:needs:job1job3:needs:[job1,job2]这里的需求声明job2必须等待job1成功完成,job3必须依次等待job1和job2成功完成。每个任务的默认超时时间最长为360分钟。可以通过timeout-minutes配置:jobs:job1:timeout-minutes:runs-on&strategyruns-on指定任务的runner,也就是执行环境。runner分为两种类型:GitHub-hostedrunner和self-hostedrunner。所谓self-hostedrunner就是使用自己的机器,但是GitHub需要能够访问到它,并且给它需要的机器权限。这不在本文的讨论范围内。有兴趣的可以参考self-hostedrunner。GitHub-hostedrunner其实就是GitHub提供的虚拟环境。目前有四种:windows-latest:WindowsServer2019ubuntu-latest或者ubuntu-18.04:Ubuntu18.04ubuntu-16.04:Ubuntu16.04macos-latest:macOSCatalina10.15比较常见:runs-on:ubuntu-latestruns-onMultipleenvironments有时我们经常需要测试多个操作系统、多个平台、多个编程语言版本,那么我们可以配置一个构建矩阵。例如:runs-on:${{matrix.os}}strategy:matrix:os:[ubuntu-16.04,ubuntu-18.04]node:[6,8,10]示例中配置了两个os操作系统和三个节点版本是共六种情况的构造矩阵,${{matrix.os}}是上下文参数。strategy策略,包括:matrix:构建矩阵。fail-fast:默认为true,即矩阵任务一旦失败,所有正在进行的任务都会立即取消。max-paraller:可同时执行的最大并行度,默认GitHub会动态调整。示例:runs-on:${{matrix.os}}strategy:matrix:os:[macos-latest,windows-latest,ubuntu-18.04]node:[4,6,8,10]include:#包括一个新的npm的变量,值为2用于匹配os和版本的矩阵分支-os:windows-latestnode:4npm:2include当os声明为windows-latest时,添加一个节点和npm以使用特定版本的矩阵环境.include的反义词是exclude:runs-on:${{matrix.os}}strategy:matrix:os:[macos-latest,windows-latest,ubuntu-18.04]node:[4,6,8,10]exclude:#excludesnode4onmacOS-os:macos-latestnode:4exclude用于删除特定的配置项。例如,当os是macos-latest时,节点4的版本将从构建矩阵中删除。stepssteps的一般格式类似于:steps:-name:uses:with::id:continue-on-error:true-name:timeout-minutes:run:每个stepstep可以有:id:每个step的唯一标识符name:步骤的名称uses:使用哪个actionrun:用哪些命令执行:指定可能需要的参数beinputforanactioncontinue-on-error:设置为true,允许这一步失败,job仍然通过其他的。checkoutactioncheckoutaction是一个标准动作,当有以下情况需要时必须优先使用:工作流中的至少一个动作被定义在同一个项目库下。用法示例:-uses:actions/checkout@v1如果你只是想浅克隆你的仓库,或者只是复制最新版本,你可以在with中使用fetch-depth语句,例如:-uses:actions/checkout@v1with:fetch-depth:1参考action的官方action标准库:github.com/actions社区库:marketplace1,参考公共库中的action参考action的格式为{owner}/{repo}@{ref}或{owner}/{repo}/{path}@{ref},如上例中的actions/checkout@v1,也可以使用标准库中的其他动作,如设置节点版本:jobs:my_first_job:name:MyJobNamesteps:-uses:actions/setup-node@v1with:node-version:10.x2,参考同库中的action参考格式:{owner}/{repo}@{ref}或./path/to/dir。例如项目文件结构为:|--hello-world(repository)||__.github|└──工作流程|└──my-first-workflow.yml|└──动作||__你好世界行动|└──action.yml当你想在工作流中引用你自己的动作时:-uses:actions/checkout@v1#此步骤引用包含操作的目录。-uses:./.github/actions/hello-world-action3,如果在docker容器镜像中定义了action并推送到它,引用DockerHub上的容器在DockerHub上,也可以导入,格式为docker://{image}:{tag},example:jobs:my_first_job:steps:-name:Myfirststepuses:docker://alpine:3.8更多信息参考:Docker-image.ymlworkflowandCreatingaDockercontainer行动。buildingactions参考:building-actionsenv环境变量可以配置在以下地方:envjobs..envjobs..steps.env例子:env:NODE_ENV:devjobs:job1:env:NODE_ENV:测试步骤:-name:env:NODE_ENV:prod如果重复,将首先使用最接近的。if&context在job和step中可以使用if条件语句,只有满足条件时才执行特定的job或step:jobs..ifjobs..steps.if任务状态检查函数:success():上一步执行成功返回truealways():alwaysreturntruecancelled():工作流取消时返回truefailure():上一步执行失败返回true例如:steps:-name:step1if:always()-name:step2if:success()-name:step3if:failure()表示step1一直执行,step2只有上一步成功才执行,step3只有上一步失败才执行。${{}}上下文和表达式:${{}}。有时我们需要与第三方平台进行交互。这时候我们通常需要配置一个token,但是显然这个token是不能明文使用的。在这种情况下,我们需要做的是:在具体的repository库Settings的Secrets中添加一个secret。key,比如SOMEONE_TOKEN,那么在工作流中,可以通过${{secrets.SOMEONE_TOKEN}}将token安全的传递给环境变量。steps:-name:我的第一个actionenv:SOMEONE_TOKEN:${{secrets.SOMEONE_TOKEN}}这里的secrets是一个context,还有很多,比如:github.event_name:触发workflowjob的事件名称.status:当前作业的状态,例如成功、失败或已取消的步骤。.outputs:操作的输出runner.os:runner的操作系统,例如Linux、Windows或macOS,这里只列出几个。另外,${{}}符号在if中使用时不需要,例如:steps:-name:Myfirststepif:github.event_name=='pull_request'&&github.event.action=='unassigned'运行:echo此事件是一个已删除受让人的拉取请求。context和expression的详细介绍可以参考:contexts-and-expressionEpilogue最后给出一个自己写的例子,仅供参考:name:GitHubActionsCIon:[push]jobs:build-test-deploy:runs-on:ubuntu-lateststrategy:matrix:node-version:[8.x,10.x,12.x]步骤:-uses:actions/checkout@v1-name:installlinuxpackagesrun:sudoapt-getinstall-y--no-install-recommendslibevent-dev-名称:安装memcached如果:成功()运行:|wget-Omemcached.tar.gzhttp://memcached.org/files/memcached-1.5.20.tar.gztar-zxvfmemcached.tar.gzcdmemcached-1.5.20./configure&&make&&sudomakeinstallmemcached-d-名称:使用Node.js${{matrix.node-version}}使用:actions/setup-node@v1if:success()with:node-version:${{matrix.node-version}}-name:npminstall,build,andtestenv:CODECOV_TOKEN:${{secrets.CODECOV_TOKEN}}if:success()运行:|npmcinpmtestnpmrun报告覆盖