当前位置: 首页 > 科技观察

你应该知道的10个GitHubActions进阶技巧

时间:2023-03-12 20:26:51 科技观察

转载本文请联系公众号。1.工作流执行时,传入参数。工作流执行时,允许在GitHubActions页面输入参数,控制执行逻辑。我们可以在GitHubActions中参数化执行手动处理的逻辑,适合持续部署的场景。on:workflow_dispatch:inputs:logLevel:description:'Loglevel'required:truedefault:'warning'tags:description:'Testscenariotags'jobs:printInputs:runs-on:ubuntu-lateststeps:-run:|echo"Loglevel:${{github.event.inputs.logLevel}}"echo"Tags:${{github.event.inputs.tags}}"上面的工作流执行时,会弹出如下对话框。2.作业编排控制执行顺序。一个工作流由许多作业组成。通过needs参数,我们可以管理这些作业之间的依赖关系并控制它们的执行过程。on:pushjobs:job1:runs-on:ubuntu-lateststeps:-run:echo"job1"job2:runs-on:ubuntu-lateststeps:-run:sleep5needs:job1job3:runs-on:ubuntu-lateststeps:-run:sleep10needs:job1job4:runs-on:ubuntu-lateststeps:-run:echo"job4"needs:[job2,job3]当上面的工作流程执行时,job2和job3会等待job1执行成功,job4会等待job2和job3toexecute仅在成功时执行。3.对于项目管理,Kubernetes基于ChatOps,使用Prow来协调社区的有序协作。但并不是每个团队都愿意构建和维护一个Prow机器人系统。ChatOps实现的核心是事件驱动,也可以使用GitHub中的Actions实现。下面是几个项目管理相关的动作,根据配置文件中的修改目录-uses:actions/labeler@mainwith:repo-token:"${{secrets.GITHUB_TOKEN}}".github/workflows/labeler添加标签.yml添加规则自动将docs_label标签添加到修改docs目录的PullRequests(以下简称PR):docs_label:-./docs/*AddIssuestoProjectsusingsrggrs/assign-one-project根据标签-github-action,我们可以将NewIssues或PR添加到指定的Projects。-name:AssignNEWissuesandNEWpullrequeststoproject2uses:srggrs/assign-one-project-github-action@1.2.0if:github.event.action=='打开'with:project:'https://github.com/srggrs/assign-one-project-github-action/projects/2'也可以将包含指定标签的Issue或PR添加到指定Project的指定Column中。-name:Assignissuesandpullrequestswith`bug`labeltoproject3uses:srggrs/assign-one-project-github-action@1.2.0if:|contains(github.event.issue.labels.*.name,'bug')||contains(github.event.pull_request.labels.*.name,'bug')with:project:'https://github.com/srggrs/assign-one-project-github-action/projects/3'column_name:'Labeled'清理long没有及时跟进的Issues如果一个Issue30天没有更新,下面的工作流会再等5天,然后关闭。name:'ClosestaleissuesandPRs'on:schedule:-cron:'301***'jobs:stale:runs-on:ubuntu-lateststeps:-uses:actions/stale@v3with:stale-issue-message:'Thisissueisstale因为它已经打开30天没有活动。删除旧标签或评论或这将在5天内关闭。'days-before-stale:30days-before-close:5GitHub上的项目管理主要围绕Issues、Projects、Labels和PullRequests进行,相关的Actions可以在GitHubActions的Marketplace中搜索。4.在线调试在使用GitHubActions的过程中,如果你需要登录Runner调试命令,你一定会对下面的技巧感兴趣。-uses:shaowenchen/debugger-action@v2name:debuggertimeout-minutes:30continue-on-error:truewith:ngrok_token:${{secrets.NGROK_TOKEN}}去ngrok官网申请token就可以了通过ssh远程登录到Runner。当然你也可以把Runner上的服务暴露出来,提供外网访问的链接,最多6小时。在执行日志中,我们可以找到ssh登录链接,使用root/root登录Runner。如果配置了web端口映射,还可以查看相关服务链接。5、设置缓存缓存可以有效加快构建速度,减少网络请求,重用中间代码。这对于Java、Nodejs、Python等项目非常有用。-name:Getyarncacheddirectorypathid:yarn-cache-dir-pathrun:echo"::set-outputname=dir::$(yarncachedir)"-uses:actions/cache@v2id:yarn-cache#usethistocheckfor`cache-hit`(`steps.yarn-cache.outputs.cache-hit!='true'`)with:path:${{steps.yarn-cache-dir-path.outputs.dir}}key:${{runner.os}}-yarn-${{hashFiles('**/yarn.lock')}}恢复密钥:|${{runner.os}}-yarn-6。项目环节检测问题项目维护时间长了之后,最头疼的就是文档。研发和测试跟进代码和功能,但文档经常不更新。缺乏维护的文档可能会关闭潜在的参与者。以下操作检测文档中的断开链接。名称:CheckMarkdownlinkson:pushjobs:markdown-link-check:runs-on:ubuntu-lateststeps:-uses:actions/checkout@master-uses:gaurav-nelson/github-action-markdown-link-check@v1with:use-quiet-mode:'yes'config-file:'.github/workflows/checklink_config.json'max-depth:3gaurav-nelson/github-action-markdown-link-check支持自定义配置,非常灵活好用,就是一个必须准备的动作。这是一个例子}最后在GitHubActions日志页面会输出如下检测结果:==========================>MARKDOWNLINKCHECK<===========================文件:./docs/governance.md4linkschecked.文件:./docs/configuration/cri.md[?]https://build.opensuse.org/project/show/devel:kubic:libcontainers:stable7linkschecked.ERROR:1deadlinksfound![?]https://build.opensuse.org/project/show/devel:kubic:libcontainers:stable→状态:404FILE:./docs/configuration/kubeedge.md21linkschecked.==============================================================================================================================================================================================7.测试的流程由输入的参数控制。在GitHubActions中,我们还可以通过参数化的方式批量执行或编排流程。GitHubActions将组合矩阵中的每个参数以生成一个新的运行实例。on:pushjobs:node:runs-on:${{matrix.os}}strategy:matrix:os:[ubuntu-16.04,ubuntu-18.04]node:[6,8,10]steps:-uses:actions/setup-node@v1with:node-version:${{matrix.node}}-run:node--version执行上述工作流时,会执行6个作业。无论是用来测试兼容性还是批量执行作业,都非常好。8.复制操作的徽章状态显示在文档中。通常,我们使用GitHubActions为项目分析代码、执行测试、编译、打包、构建和推送图像。这些操作对于确保项目的稳定性至关重要。但并不是所有人都会关注Actions的实现细节。我们可以在显眼的地方给出这些进程的最终实时状态,提醒用户和开发者。如果主分支构建失败,可以提醒用户谨慎使用,也可以提醒研发尽快修复问题。在GitHub操作页面上,单击创建状态徽章。将弹出框中的URL链接添加到Readme文档中,可以实时快速查看工作流的执行结果。9.精准hookGitHub上的行为工作流,通过on关键字定义触发条件。触发事件主要分为三种:手动触发on:workflow_dispatch定时触发工作流每15分钟触发一次。on:schedule:-cron:'*/15****'Webhook触发我们在GitHub上的操作,比如创建Issue,添加Deployment等,我们可以通过API获取相关事件。通过这些事件,我们可以精确地自定义工作流的行为。通常我们是基于push或者pullrequests触发的,这里举几个不常见的例子:当有人fork仓库时触发on:fork,当有新的Issue时触发on:watch:types:[started]Triggeron:issues:types:[打开]10。开发一个动作非常简单。如果在Marketplace中找不到合适的Action,那么自己开发一个Action也是一个不错的选择。其实开发一个Action并没有想象的那么难。Action是一个处理逻辑,接收输入参数,执行一定的逻辑,然后输出参数。Action分为三种类型:Docker容器,适用于Linux系统,通过Docker容器提供Action执行逻辑处理。比如下面这个例子:DockerfileFROMappleboy/drone-scp:1.6.2-linux-amd64ADDentrypoint.sh/entrypoint.shRUNchmod+x/entrypoint.shENTRYPOINT["/entrypoint.sh"]entrypoint.sh#!/bin/shset-eu[-n"$INPUT_STRIP_COMPONENTS"]&&exportINPUT_STRIP_COMPONENTS=$((INPUT_STRIP_COMPONENTS+0))sh-c"/bin/drone-scp$*"快速开发一个动作,通过dron-scp镜像提供scp文件拷贝。JavaScript,适用于Linux、macOS、Windows系统,通过执行JavaScript来处理Action逻辑。官方提供了JavaScript和TypeScript的动作模板。创建项目时,使用模板创建,然后编写处理逻辑,发布自己的Action。GitHubActions通过这种方式提供了工具包来支持扩展,比如执行命令、操作GitHub等,都可以通过引用包的方式直接调用相关功能来实现。下面是一些工具包:@actions/exec,执行命令@actions/core,输入,输出,日志,秘钥相关@actions/io,运行文件复合运行步骤,适用于本Linux,macOS,Windows系统type,允许将一系列Shell操作用作Action。名称:'HelloWorld'描述:'Greetsomeone'输入:who-to-greet:#idofinput描述:'Whotogreet'需要:true默认值:'World'输出:随机数:描述:“随机数”值:${{steps.random-number-generator.outputs.random-id}}runs:using:"composite"steps:-run:echoHello${{inputs.who-to-greet}}.shell:bash-id:random-number-generatorrun:echo"::set-outputname=random-id::$(echo$RANDOM)"shell:bash-run:${{github.action_path}}/goodbye.shshell:bash11。参考?https://github.com/actions/typescript-action?https://github.com/shaowenchen/debugger-action