This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

EAS 工作流语法

编辑页面

EAS 工作流配置文件语法参考指南。


一个 workflow 是由一个或多个 job 组成的可配置自动化流程。你必须创建一个 YAML 文件来定义你的 workflow 配置。

要开始使用 workflows,请参阅 开始使用 EAS Workflows,或查看 示例 以获取完整的 workflow 配置。

工作流文件

工作流文件使用 YAML 语法,文件扩展名必须为 .yml.yaml,且文件大小不得超过 16 KiB。如果你刚开始接触 YAML 并希望了解更多信息,请参阅 在 5 分钟内学会 YAML

工作流文件位于项目中的 .eas/workflows 目录下。.eas 目录应与 eas.json 文件位于同一级别。

例如:

my-app
.eas
  workflows
   create-development-builds.yml
   publish-preview-update.yml
   deploy-to-production.yml
eas.json

配置参考

下面是 workflow 配置文件语法的参考。

name

工作流的易读名称。它会显示在 EAS 仪表盘的工作流列表页上,并作为工作流详情页的标题。

name: 我的 workflow

on

on 键定义哪些 GitHub 事件会触发 workflow。无论 on 键如何,任何 workflow 都可以通过 eas workflow:run 命令触发。

on: # 在推送到 main 分支时触发 push: branches: - main # 以及在以 'version-' 开头的 pull request 上触发 pull_request: branches: - version-*

on.push

当你向匹配的分支和/或标签推送提交时运行你的 workflow。

使用 branches 列表时,你可以仅在将提交推送到这些指定分支时触发 workflow。例如,如果你使用 branches: ['main'],只有推送到 main 分支时才会触发 workflow。支持 glob。通过使用 ! 前缀,你可以指定要忽略的分支(但你仍然需要提供至少一个不带该前缀的分支模式)。

使用 tags 列表时,你可以仅在推送这些指定标签时触发 workflow。例如,如果你使用 tags: ['v1'],只有推送 v1 标签时才会触发 workflow。支持 glob。通过使用 ! 前缀,你可以指定要忽略的标签(但你仍然需要提供至少一个不带该前缀的标签模式)。

使用 paths 列表时,你可以仅在对匹配指定路径的文件进行更改时触发 workflow。例如,如果你使用 paths: ['apps/mobile/**'],只有对 apps/mobile 目录中文件的更改才会触发 workflow。支持 glob。默认情况下,对任意路径的更改都会触发 workflow。

当既未提供 branches 也未提供 tags 时,branches 默认为 ['*']tags 默认为 [],这意味着 workflow 会在所有分支的 push 事件上触发,而不会在 tag push 时触发。如果只提供了这两个列表中的一个,另一个默认为 []

on: push: branches: - main - feature/** - !feature/test-** # 其他分支名称和 glob tags: - v1 - v2* - !v2-preview** # 其他标签名称和 glob paths: - apps/mobile/** - packages/shared/** - !**/*.md # 忽略 markdown 文件

on.ref_delete

当 GitHub 分支或标签被删除时运行你的工作流。你的 EAS 项目需要一个已关联的 GitHub 仓库

使用 branches 列表,你可以仅在删除这些指定分支时触发工作流。例如,如果你使用 branches: ['feat/**'],只有删除与 feat/** 匹配的分支时才会触发工作流。支持 glob。通过使用 ! 前缀,你可以指定要忽略的分支(但你仍然需要提供至少一个不带该前缀的分支模式)。有关 glob 和否定模式匹配的详细信息,请参阅 on.push

使用 tags 列表,你可以仅在删除这些指定标签时触发工作流。支持 glob 和 ! 否定,规则与分支相同。

当未提供 branchestags 时,branches 默认为 ['*']tags 默认为 [],这意味着工作流会在任意分支被删除时触发,但不会在标签删除时触发。如果只提供其中一个列表,另一个会默认为 []

将此触发器与 branch-delete 作业配合使用,可在 GitHub 分支被删除时移除 EAS Update 分支。有关完整工作流,请参阅清理更新分支示例

on: ref_delete: branches: - feat/** - !main # 其他分支名称和 glob tags: - v* - !v2-preview** # 其他标签名称和 glob

on.pull_request

当你创建或更新一个目标分支匹配的 pull request 时运行你的 workflow。

使用 branches 列表时,你可以仅在这些指定分支作为 pull request 的目标时触发 workflow。例如,如果你使用 branches: ['main'],只有合并到 main 分支的 pull request 才会触发 workflow。支持 glob。未提供时默认为 ['*'],这意味着 workflow 会在针对所有分支的 pull request 事件上触发。通过使用 ! 前缀,你可以指定要忽略的分支(但你仍然需要提供至少一个不带 ! 的分支模式)。

使用 types 列表时,你可以仅在指定的 pull request 事件类型上触发 workflow。例如,如果你使用 types: ['opened'],则只有 pull_request.opened 事件(在 pull request 首次打开时发送)会触发 workflow。未提供时默认为 ['opened', 'reopened', 'synchronize']。支持的事件类型:

  • opened
  • edited
  • base_ref_changed
  • ready_for_review
  • reopened
  • synchronize
  • labeled

edited 类型遵循 GitHub 的 pull_request.edited 行为,并且会在 pull request 的标题、正文或基础分支发生变化时触发。如果你只想在 pull request 的基础分支变化时触发,请使用 base_ref_changed

branches 过滤器匹配的是 pull request 当前的基础分支,因此将 pull request 重新指向一个匹配的分支也可能触发 workflow。

使用 paths 列表时,你可以仅在更改了匹配指定路径的文件时触发 workflow。例如,如果你使用 paths: ['apps/mobile/**'],则只有 apps/mobile 目录中的文件更改才会触发 workflow。支持 glob。默认情况下,任何路径的更改都会触发 workflow。

on: pull_request: branches: - main - feature/** - !feature/test-** # 其他分支名称和 glob types: - opened # 其他事件类型 paths: - apps/mobile/** - packages/shared/** - !**/*.md # 忽略 markdown 文件

on.pull_request_labeled

当 pull request 被匹配的标签标记时运行你的 workflow。

使用 labels 列表,你可以指定当哪些标签被分配到你的 pull request 时触发 workflow。例如,如果你使用 labels: ['Test'],则只有当 pull request 被标记为 Test 标签时才会触发 workflow。未提供时默认为 [],这意味着没有任何标签会触发该 workflow。

你也可以直接向 on.pull_request_labeled 提供匹配标签列表,以获得更简洁的语法。

on: pull_request_labeled: labels: - Test - Preview # 其他标签

或者:

on: pull_request_labeled: - Test - Preview # 其他标签

on.app_store_connect

当所选的 App Store Connect 事件之一发生时运行你的 workflow。

当存在 on.app_store_connect 时,你必须至少指定一个事件域(app_versionbuild_uploadexternal_betabeta_feedback)。在已配置的事件域中,你可以指定哪些状态应触发 workflow。

on.app_store_connect.app_version.states

过滤应用商店应用版本状态变更事件。未提供时默认为所有受支持的应用版本状态。

支持的值:

  • accepted
  • developer_rejected
  • in_review
  • invalid_binary
  • metadata_rejected
  • pending_apple_release
  • pending_developer_release
  • prepare_for_submission
  • processing_for_distribution
  • ready_for_distribution
  • ready_for_review
  • rejected
  • replaced_with_new_version
  • waiting_for_export_compliance
  • waiting_for_review

on.app_store_connect.build_upload.states

按状态过滤构建上传事件。未提供时默认为所有受支持的构建上传状态。

支持的值:

  • complete
  • failed
  • processing
  • awaiting_upload

on.app_store_connect.external_beta.states

按状态过滤外部测试版事件。未提供时默认为所有受支持的外部测试版状态。

支持的值:

  • processing
  • processing_exception
  • missing_export_compliance
  • ready_for_beta_testing
  • in_beta_testing
  • expired
  • ready_for_beta_submission
  • in_export_compliance_review
  • waiting_for_beta_review
  • in_beta_review
  • beta_rejected
  • beta_approved

on.app_store_connect.beta_feedback.types

按测试人员报告的 beta 反馈类型进行过滤。未提供时默认为所有受支持的 beta 反馈类型。

支持的值:

  • crash
  • screenshot

所有过滤值都必须为小写,且区分大小写。

# 在以下情况触发: # - 应用版本进入审核, # - 构建上传完成或失败, # - 外部测试版构建已准备好测试或已批准, # - 测试人员通过 TestFlight 报告崩溃。 on: app_store_connect: app_version: states: - ready_for_review - waiting_for_review build_upload: states: - complete - failed external_beta: states: - ready_for_beta_testing - beta_approved beta_feedback: types: - crash
# 在任何应用版本或构建上传状态变更时触发。 on: app_store_connect: app_version: {} build_upload: {}

on.schedule.cron

使用 unix-cron 语法按计划运行你的 workflow。你可以使用 crontab guru 及其 示例 来生成 cron 字符串。

  • 计划任务 workflow 只会在仓库的默认分支上运行。在许多情况下,这意味着位于 main 分支上的 workflow 文件中的 cron 会被调度,而位于功能分支中的 workflow 文件中的 cron 则不会被调度。
  • 在高负载期间,计划任务 workflow 可能会延迟。高负载时段包括每小时的开始时间。在极少数情况下,job 可能会被跳过或运行多次。请确保你的 workflow 具有幂等性,并且不会产生有害的副作用。
  • 一个 workflow 可以有多个 cron 计划。
  • 计划任务 workflow 以 GMT 时区运行。
on: schedule: - cron: '0 0 * * *' # 每天 GMT 午夜运行

on.workflow_dispatch.inputs

定义通过使用 eas workflow:run 命令手动触发 workflow 时可提供的输入。这使你能够创建可参数化的 workflows,每次运行时都可以接受不同的值。

on: workflow_dispatch: inputs: name: type: string required: false description: '要问候的人的名字' default: 'World' choice_example: type: choice options: - to be - not to be required: true
属性类型必填描述
typestring输入类型(stringbooleannumberchoiceenvironment)。
descriptionstring输入的描述。
requiredboolean该输入是否必填。默认为 false
defaultvaries输入的默认值。必须与输入类型匹配。
optionsstring[](针对 type: choicechoice 输入可用的选项。

提供输入

运行带输入的 workflow 时,你可以通过以下几种方式提供输入:

  1. 命令行标志:

    Terminal
    eas workflow:run .eas/workflows/deploy.yml -F environment=production -F debug=true -F version=1.2.3
  2. 通过 stdin 传入 JSON:

    Terminal
    echo '{"environment": "production", "debug": true, "version": "1.2.3"}' | eas workflow:run .eas/workflows/deploy.yml
  3. 交互式提示: 如果缺少必填输入且你没有使用 --non-interactive,CLI 将提示你输入这些值:

    Terminal
    eas workflow:run .eas/workflows/deploy.yml

用法

输入值可通过 ${{ inputs.<input_name> }} 语法在 workflow 的 jobs 中使用:

on: workflow_dispatch: inputs: name: type: string required: true description: '要问候的人的名字' jobs: deploy: steps: - name: Deploy to environment run: | echo "Hello, ${{ inputs.name }}!" # 注意:你可以使用 `||` 提供默认值 # 适用于非 eas-workflow:run-run workflows。 echo "Hello, ${{ inputs.name || 'World' }}!"

jobs

一个 workflow 运行由一个或多个 job 组成。

jobs: job_1: # ... job_2: # ...

jobs.<job_id>

每个 job 都必须有一个 ID。该 ID 在 workflow 内应唯一,并且可以包含字母数字字符和下划线。例如,下面 YAML 中的 my_job

jobs: my_job: # ...

jobs.<job_id>.name

在 workflow 详情页上显示的、便于人类理解的 job 名称。

jobs: my_job: name: Build app

jobs.<job_id>.environment

为该 job 设置 EAS 环境变量 环境。有三种可选值:

  • production
  • preview
  • development

environment 键适用于所有 job。如果省略该键,其默认值取决于 job 类型:build job 从 eas.json 中构建配置的 environment 推断,submit job 从所提交的构建继承,maestromaestro-cloud job 默认为 preview,其他所有 job 默认为 production。详情请参阅Job 环境

jobs: my_job: environment: production | preview | development

jobs.<job_id>.env

为该 job 设置环境变量。此属性适用于所有在 VM 上运行的 job(除预打包的 apple-device-registration-requestbranch-deletedocget-buildgithub-commentrequire-approvalslackupdate-rollout job 外的所有 job)。

jobs: my_job: env: APP_VARIANT: staging RETRY_COUNT: 3 PREV_JOB_OUTPUT: ${{ needs.previous_job.outputs.some_output }}

jobs.<job_id>.hooks

以下预打包 job 支持使用 hooks,在主要 job 操作之前或之后运行其他步骤:builddeployfingerprintmaestromaestro-cloudrepacksubmittestflightupdate。Hook 名称因 job 而异。可用的 hook 键请参阅相应 job 的文档。若要为 workflow 中的所有 job 设置默认 hooks,请使用 defaults.hooks

jobs: maestro_test: type: maestro-cloud params: build_id: ${{ needs.build.outputs.build_id }} maestro_project_id: proj_xyz flows: ./maestro/flows hooks: before_maestro_cloud: - run: echo "Before upload" after_maestro_cloud: - run: echo "After upload"

jobs.<job_id>.defaults.run.working_directory

设置该 job 中所有步骤执行命令的目录。

jobs: my_job: defaults: run: working_directory: ./my-app steps: - name: My first step run: pwd # 输出:/home/expo/workingdir/build/my-app

defaults

用于作为 workflow 配置中所有 job 默认值的参数。

defaults.hooks

工作流中所有 job 的默认 hooks。每个 job 会运行适用于自身的 hook 键,并忽略其余键。job 级别的 hook 键会覆盖 defaults.hooks 中的同名键。若要让某个 job 不使用默认 hook,请将该键设置为空数组。

defaults: hooks: before_install_node_modules: - name: Configure private registry run: echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc jobs: build_app: type: build params: platform: ios publish_update: type: update hooks: before_install_node_modules: [] # 让此 job 不使用默认 hook

defaults.image

为 workflow 中所有 job 使用的默认 VM 镜像。建议使用 sdk-XX 镜像标签。可用镜像请参阅 Infrastructure。单个 job 可以通过 jobs.<job_id>.image 覆盖此值。

defaults: image: sdk-57

defaults.run.working_directory

运行脚本的默认工作目录。诸如 "./assets" 或 "assets" 这样的相对路径会从应用的基础目录解析。

defaults.tools

该 workflow 配置中所定义 job 应使用的工具的特定版本。可用值请参阅各工具的文档。

工具说明
node通过 nvm 安装的 Node.js 版本。
yarn通过 npm -g 安装的 Yarn 版本。
corepack如果设置为 true,则会在构建过程开始时启用 corepack。默认值为 false。
pnpm通过 npm -g 安装的 pnpm 版本。
bun通过在 Bun 安装脚本中传入 bun-v$VERSION 安装的 Bun 版本。
ndk通过 sdkmanager 安装的 Android NDK 版本。
bundler将传递给 gem install -v 的 Bundler 版本。
fastlane将传递给 gem install -v 的 fastlane 版本。
cocoapods将传递给 gem install -v 的 CocoaPods 版本。

使用 defaults.tools 的 workflow 示例:

.eas/workflows/publish-update.yml
name: 设置自定义版本 defaults: tools: node: latest yarn: '2' corepack: true pnpm: '8' bun: '1.0.0' fastlane: 2.224.0 cocoapods: 1.12.0 on: push: branches: ['*'] jobs: setup: steps: - name: 检查 Node 版本 run: node --version # 应输出一个具体版本,例如 23.9.0 - name: 检查 Yarn 版本 run: yarn --version # 应输出一个具体版本,例如 2.4.3

concurrency

并发控制配置。目前仅允许为同分支 workflow 设置 cancel_in_progress

concurrency: cancel_in_progress: true group: ${{ workflow.filename }}-${{ github.ref }}
属性类型说明
cancel_in_progresstrue如果为 true,GitHub 新启动的 workflow 运行将取消当前正在进行的同分支运行。
groupstring我们目前还不支持自定义并发组。请设置此占位值,以便当我们未来支持自定义组时,你的 workflow 仍保持兼容。

控制流

你可以使用 needsafter 关键字控制 job 何时运行。此外,你还可以使用 if 关键字根据条件控制某个 job 是否应运行。

jobs.<job_id>.needs

一个 job ID 列表,这些 job 必须先成功完成,此 job 才会运行。

jobs: test: steps: - uses: eas/checkout - uses: eas/use_npm_token - uses: eas/install_node_modules - name: tsc run: yarn tsc build: needs: [test] # 只有当 'test' job 成功时,这个 job 才会运行 type: build params: platform: ios

jobs.<job_id>.after

一个 job ID 列表,这些 job 必须先完成(无论成功与否),此 job 才会运行。

jobs: build: type: build params: platform: ios notify: after: [build] # 这个 job 会在 build 完成后运行(无论 build 成功还是失败)

jobs.<job_id>.if

if 条件用于决定某个 job 是否应运行。当满足 if 条件时,job 将运行;当条件不满足时,job 将被跳过。被跳过的 job 不会被视为成功完成,且任何将该 job 包含在 needs 列表中的下游 job 都不会运行。

jobs: my_job: if: ${{ github.ref_name == 'main' }}

插值

你可以基于 workflow 运行的上下文,自定义 workflow 的行为——包括要执行的命令、控制流、环境变量、构建配置、应用版本等。

使用 ${{ expression }} 语法访问上下文属性和函数。例如:${{ github.ref_name }}${{ needs.build_ios.outputs.build_id }}

上下文属性

以下属性可在插值上下文中使用:

after

当前 job 的 after 列表中指定的所有上游 job 的记录。每个 job 提供:

{ "status": "success" | "failure" | "skipped", "outputs": {} }

示例:

jobs: build: type: build params: platform: ios notify: after: [build] steps: - run: echo "构建状态:${{ after.build.status }}"

needs

当前 job 的 needs 列表中指定的所有上游 job 的记录。每个 job 提供:

{ "status": "success" | "failure" | "skipped", "outputs": {} }

大多数预封装 job 会暴露特定输出。你可以使用 set-output 函数在自定义 job 中设置输出

示例:

jobs: setup: outputs: date: ${{ steps.current_date.outputs.date }} steps: - id: current_date run: | DATE=$(date +"%Y.%-m.%-d") set-output date "$DATE" build_ios: needs: [setup] type: build env: # 你可以使用 process.env.VERSION_SUFFIX # 在动态 app config 中自定义应用版本。 VERSION_SUFFIX: ${{ needs.setup.outputs.date }} params: platform: ios profile: development

steps

当前 job 中所有步骤的记录。每个步骤都会提供其使用 set-output 函数设置的输出。

示例:

jobs: my_job: outputs: value: ${{ steps.step_1.outputs.value }} steps: - id: step_1 run: set-output value "hello" - run: echo ${{ steps.step_1.outputs.value }} another_job: needs: [my_job] steps: - run: echo "值:${{ needs.my_job.outputs.value }}"

inputs

手动使用 workflow_dispatch 触发 workflow 时提供的输入记录。当 workflow 通过带输入参数的 eas workflow:run 命令触发时可用。

示例:

on: workflow_dispatch: inputs: name: type: string required: true jobs: greet: steps: - run: echo "Hello, ${{ inputs.name }}!"

github

为了便于从 GitHub Actions 迁移到 EAS Workflows,我们暴露了一些你可能会觉得有用的上下文字段。

type GitHubContext = { triggering_actor?: string; event_name: 'pull_request' | 'push' | 'schedule' | 'workflow_dispatch'; sha: string; ref: string; // 例如 refs/heads/main ref_name: string; // 例如 main ref_type: 'branch' | 'tag' | 'other'; commit_message?: string; // 仅适用于 push 和 schedule 事件 label?: string; repository?: string; repository_owner?: string; event?: { action?: string; label?: { name: string; }; // 仅适用于 push 和 schedule 事件 head_commit?: { message: string; id: string; }; pull_request?: { number: number; title: string; body: string | null; state: 'open' | 'closed'; draft: boolean; merged: boolean | null; // ... 来自 GitHub Pull Request webhook payload 的其他字段 }; changes?: { base?: { ref?: { from: string; }; }; }; number?: number; schedule?: string; inputs?: Record<string, string | number | boolean>; }; };

如果 workflow 运行是通过 eas workflow:run 启动的,那么其 event_name 将是 workflow_dispatch,其余所有属性都将为空。

示例:

jobs: build_ios: type: build if: ${{ github.ref_name == 'main' }} params: platform: ios profile: production
${{ github }} 上下文

查看 ${{ github }} 定义的源代码。

workflow

有关当前 workflow 的信息。

type WorkflowContext = { id: string; name: string; filename: string; url: string; };

示例:

jobs: notify_slack: after: [...] type: slack params: message: | Workflow run completed: ${{ workflow.name }} View details: ${{ workflow.url }}

app_store_connect

有关与 workflow 运行相关联的 App Store Connect 实体的信息。此上下文仅适用于由 App Store Connect 事件触发的 workflow。参见 on.app_store_connect

type AppStoreConnectContext = { app: { id: string; }; build_upload?: { id: string; state: 'awaiting_upload' | 'processing' | 'failed' | 'complete'; cf_bundle_version?: string; cf_bundle_short_version_string?: string; platform?: string; uploaded_date?: string; created_date?: string; build?: { id: string; }; }; app_version?: { id: string; state: string; }; external_beta?: { id: string; state: string; }; beta_feedback?: { id: string; type: 'crash' | 'screenshot'; url: string; }; };

仅当 workflow 由 build_upload 事件域触发时,app_store_connect.build_upload 对象才会存在。

示例:

on: app_store_connect: build_upload: states: - complete jobs: notify: type: slack params: webhook_url: ${{ env.SLACK_WEBHOOK_URL }} message: | Upload complete for App Store Connect app: ${{ app_store_connect.app.id }} Upload ID: ${{ app_store_connect.build_upload.id }} Upload state: ${{ app_store_connect.build_upload.state }} Version: ${{ app_store_connect.build_upload.cf_bundle_short_version_string }} (${{ app_store_connect.build_upload.cf_bundle_version }})

build_upload.build.id 用作 testflight job 的 asc_build_id

.eas/workflows/testflight-after-asc-upload.yml
name: 在 ASC 上传后分发到 TestFlight on: app_store_connect: build_upload: states: - complete jobs: distribute_to_testflight: name: 分发到 TestFlight type: testflight params: asc_build_id: ${{ app_store_connect.build_upload.build.id }} internal_groups: - QA Team external_groups: - Public Beta changelog: | Build ${{ app_store_connect.build_upload.cf_bundle_version }} is ready for testing. submit_beta_review: true

env

当前 job 上下文中可用的环境变量记录。

示例:

jobs: my_job: steps: - run: echo "API URL: ${{ env.API_URL }}"

上下文函数

以下函数可在插值上下文中使用:

success()

返回所有之前的 job 是否都已成功。

jobs: notify: if: ${{ success() }} steps: - run: echo "所有 job 都已成功"

failure()

返回之前是否有任何 job 失败。

jobs: notify: if: ${{ failure() }} steps: - run: echo "有一个 job 失败了"

fromJSON(value)

解析一个 JSON 字符串。等同于 JSON.parse()

示例:

jobs: publish_update: type: update print_debug_info: needs: [publish_update] steps: - run: | echo "第一个 update group:${{ needs.publish_update.outputs.first_update_group_id }}" echo "第二个 update group:${{ fromJSON(needs.publish_update.outputs.updates_json || '[]')[1].group }}"

toJSON(value)

将一个值转换为 JSON 字符串。等同于 JSON.stringify()

示例:

jobs: my_job: steps: - run: echo '${{ toJSON(github.event) }}'

contains(value, substring)

检查 value 是否包含 substring

示例:

jobs: my_job: if: ${{ contains(github.ref_name, 'feature') }} steps: - run: echo "Feature 分支"

startsWith(value, prefix)

检查 value 是否以 prefix 开头。

示例:

jobs: my_job: if: ${{ startsWith(github.ref_name, 'release') }} steps: - run: echo "Release 分支"

endsWith(value, suffix)

检查 value 是否以 suffix 结尾。

示例:

jobs: my_job: if: ${{ endsWith(github.ref_name, '-production') }} steps: - run: echo "Production 分支"

hashFiles(...globs)

返回与所提供 glob 模式匹配的文件的哈希值。适用于缓存键。

示例:

jobs: my_job: steps: - run: echo "依赖哈希:${{ hashFiles('package-lock.json', 'yarn.lock') }}"

replaceAll(input, stringToReplace, replacementString)

inputstringToReplace 的所有出现位置替换为 replacementString

示例:

jobs: my_job: steps: - run: echo "${{ replaceAll(github.ref_name, '/', '-') }}"

substring(input, start, end)

input 中提取子字符串,起始位置为 start,结束位置为 end。如果未提供 end,则会从 start 提取到 input 末尾。底层使用 String#substring

示例:

jobs: my_job: steps: - run: echo "${{ substring(github.ref_name, 0, 50) }}"

预置作业。

jobs.<job_id>.type

指定要运行的预置作业类型。预置作业会根据工作流详情页中的作业类型生成专门的界面。

jobs: my_job: type: build

下面了解不同的预置作业。

build

使用 EAS Build 为你的项目创建 Android 或 iOS 构建。有关详细信息和示例,请参阅 Build 作业文档

jobs: my_job: type: build params: platform: ios | android # required profile: string # optional, default: production message: string # optional refresh_ad_hoc_provisioning_profile: boolean # optional hooks: before_install_node_modules: step[] # optional after_install_node_modules: step[] # optional

此作业输出以下属性:

{ "build_id": string, "app_build_version": string | null, "app_identifier": string | null, "app_version": string | null, "channel": string | null, "distribution": "internal" | "store" | null, "fingerprint_hash": string | null, "git_commit_hash": string | null, "platform": "ios" | "android" | null, "profile": string | null, "runtime_version": string | null, "sdk_version": string | null, "simulator": "true" | "false" | null }

deploy

使用 EAS Hosting 部署你的应用。有关详细信息和示例,请参阅 Deploy 作业文档

jobs: my_job: type: deploy params: alias: string # optional prod: boolean # optional source_maps: boolean # optional hooks: after_checkout: step[] # optional before_install_node_modules: step[] # optional after_install_node_modules: step[] # optional

此作业输出以下属性:

{ "deploy_json": string, // 包含部署详情的 JSON 对象(`npx eas-cli deploy --json` 的输出)。 "deploy_url": string, // 部署的 URL。如果这是生产部署,则使用生产 URL。否则,使用第一个别名 URL 或部署 URL。 "deploy_alias_url": string, // 部署的别名 URL(例如,`https://account-project--alias.expo.app`)。 "deploy_deployment_url": string, // 部署的唯一 URL(例如,`https://account-project--uniqueid.expo.app`)。 "deploy_identifier": string, // 部署标识符。 "deploy_dashboard_url": string, // 部署仪表板的 URL(例如,`https://expo.dev/projects/[project]/hosting/deployments`)。 }

fingerprint

计算你项目的指纹。有关详细信息和示例,请参阅 Fingerprint 作业文档

jobs: my_job: type: fingerprint environment: production # Should match your build profile hooks: after_checkout: step[] # optional before_install_node_modules: step[] # optional after_install_node_modules: step[] # optional

此作业输出以下属性:

{ "android_fingerprint_hash": string, "ios_fingerprint_hash": string, }

get-build

从 EAS 中检索与所提供参数匹配的现有构建。有关详细信息和示例,请参阅 Get Build 作业文档

jobs: my_job: type: get-build params: platform: ios | android # 可选 profile: string # 可选 distribution: store | internal | simulator # 可选 channel: string # 可选 app_identifier: string # 可选 app_build_version: string # 可选 app_version: string # 可选 git_commit_hash: string # 可选 fingerprint_hash: string # 可选 sdk_version: string # 可选 runtime_version: string # 可选 simulator: boolean # 可选 wait_for_in_progress: boolean # 可选

此作业输出以下属性:

{ "build_id": string, "app_build_version": string | null, "app_identifier": string | null, "app_version": string | null, "channel": string | null, "distribution": "internal" | "store" | null, "fingerprint_hash": string | null, "git_commit_hash": string | null, "platform": "ios" | "android" | null, "profile": string | null, "runtime_version": string | null, "sdk_version": string | null, "simulator": "true" | "false" | null }

submit

使用 EAS Submit 将 Android 或 iOS 构建提交到应用商店。有关详细信息和示例,请参阅 Submit 作业文档

jobs: my_job: type: submit params: build_id: string # 必需 profile: string # 可选,默认值:production groups: string[] # 可选 hooks: after_checkout: step[] # 可选 before_install_node_modules: step[] # 可选 after_install_node_modules: step[] # 可选 before_submit: step[] # 可选 after_submit: step[] # 可选

此作业输出以下属性:

{ "apple_app_id": string | null, // Apple App ID。https://expo.fyi/asc-app-id "ios_bundle_identifier": string | null, // 已提交构建的 iOS bundle 标识符。https://expo.fyi/bundle-identifier "android_package_id": string | null // 已提交的 Android 包名 ID。https://expo.fyi/android-package }

testflight

将 iOS 构建分发到 TestFlight 内部和外部测试组。请准确提供 build_id(上传构建并提交到 TestFlight)或 asc_build_id(提交一个已上传的构建)中的一个。有关详细信息和示例,请参阅 TestFlight 作业文档

jobs: my_job: type: testflight params: build_id: string # 必须提供,用于上传并提交到 TestFlight;不能与 asc_build_id 同时使用 profile: string # 可选,默认值:production;仅在上传并提交时使用 wait_processing_timeout_seconds: number # 可选,默认值:1800(30 分钟);仅在同一个作业中上传并提交时使用 asc_build_id: string # 必须提供,用于提交已上传的构建;不能与 build_id 同时使用 internal_groups: string[] # 可选 external_groups: string[] # 可选 changelog: string # 可选 submit_beta_review: boolean # 可选 hooks: # 仅在使用 build_id 上传并提交时使用 after_checkout: step[] # 可选 before_install_node_modules: step[] # 可选 after_install_node_modules: step[] # 可选

此作业输出以下属性,其中仅在提交已上传的构建时设置 asc_build_id

{ "apple_app_id": string | null, // Apple App ID。https://expo.fyi/asc-app-id "ios_bundle_identifier": string | null, // 已提交构建的 iOS bundle 标识符。https://expo.fyi/bundle-identifier "asc_build_id": string | null // App Store Connect 构建 ID。仅在提交已上传的构建时提供。 }

update

使用 EAS Update 发布更新。有关详细信息和示例,请参阅 Update 作业文档

jobs: my_job: type: update params: message: string # optional platform: string # optional - android | ios | all, defaults to all branch: string # optional channel: string # optional - cannot be used with branch rollout_percentage: number # optional - 0 to 100, defaults to 100 private_key_path: string # optional upload_sentry_sourcemaps: boolean # optional - defaults to "try uploading, but don't fail the job if it fails" hooks: after_checkout: step[] # optional before_install_node_modules: step[] # optional after_install_node_modules: step[] # optional before_update: step[] # optional after_update: step[] # optional

此作业输出以下属性:

{ "first_update_group_id": string, // 第一个更新组的 ID。你可以将其用于例如为开发客户端深度链接构造更新 URL。 "updates_json": string // 更新组的字符串化 JSON 数组。`eas update --json` 的输出。 }

update-rollout

增加进行中的 EAS Update 发布的发布百分比。有关详细信息和示例,请参阅 Update rollout 作业文档

jobs: my_job: type: update-rollout params: update_group_id: string # required rollout_percentage: number # optional - 0 to 100, defaults to 100

此作业输出以下属性:

{ "update_group_id": string, // 已完成发布的更新组 ID。 "rollout_percentage": string, // 应用于更新组的发布百分比。 "updates_json": string // 组内更新的字符串化 JSON 数组。 }

branch-delete

删除一个 EAS Update 分支及其所有更新。有关详细信息和示例,请参阅 Branch delete 作业文档

jobs: my_job: type: branch-delete params: branch_name: string # 必需 fail_on_missing: boolean # 可选,默认值:false

此作业输出以下属性:

{ "branch_id": string | null, "branch_name": string }

maestro

在构建上运行 Maestro 测试。有关详细信息和示例,请参阅 Maestro 作业文档

jobs: my_job: type: maestro environment: production | preview | development # 可选,默认值为 preview image: string # 可选。请参阅 https://docs.expo.dev/build-reference/infrastructure/ 获取可用镜像列表。 runs_on: string # 可选。对 Android Emulator 测试使用 linux-*-nested-virtualization worker。可用选项请参阅 https://docs.expo.dev/eas/workflows/syntax/#jobsjob_idruns_on。 params: build_id: string # 必需 flow_path: string | string[] # 必需 shards: number # 可选,默认值为 1 retries: number # 可选,默认值为 0 retry_failed_only: boolean # 可选,默认值为 true。为 true 时,在适用情况下,重试将仅尝试重新运行上一次尝试中失败的流程。 record_screen: boolean # 可选,默认值为 false。若为 true,则上传测试的屏幕录制。 include_tags: string | string[] # 可选。要包含在测试中的标签。将作为 `--include-tags` 传递给 Maestro。 exclude_tags: string | string[] # 可选。要从测试中排除的标签。将作为 `--exclude-tags` 传递给 Maestro。 maestro_version: string # 可选。用于测试的 Maestro 版本。如果未提供,将使用最新版本。 android_system_image_package: string # 可选。要使用的 Android Emulator 系统镜像包。 device_identifier: string | { android?: string, ios?: string } # 可选。要用于测试的设备标识符。 output_format: string # 可选,默认值为 junit。Maestro 测试报告格式。将作为 `--format` 传递给 Maestro。可以是 `junit` 或其他受支持的格式。 skip_build_check: boolean # 可选,默认值为 false。跳过构建校验(例如 iOS 构建是否为模拟器构建)。 hooks: after_checkout: step[] # 可选 before_maestro_tests: step[] # 可选 after_maestro_tests: step[] # 可选

maestro-cloud

Maestro Cloud 中的构建上运行 Maestro 测试。有关详细信息和示例,请参阅 Maestro Cloud 作业文档

jobs: my_job: type: maestro-cloud environment: production | preview | development # 可选,默认值为 preview image: string # 可选。请参阅 https://docs.expo.dev/build-reference/infrastructure/ 获取可用镜像列表。 params: build_id: string # 必需。要测试的构建 ID。 maestro_project_id: string # 必需。Maestro Cloud 项目 ID。示例:`proj_01jw6hxgmdffrbye9fqn0pyzm0`。 flows: string # 必需。Maestro flow 文件的路径,或包含要运行的 flows 的目录。对应 `maestro cloud` 的 `--flows` 参数。 maestro_api_key: string # 可选。用于 Maestro 项目的 API key。默认情况下,将使用 `MAESTRO_CLOUD_API_KEY` 环境变量。对应 `maestro cloud` 的 `--api-key` 参数。 include_tags: string | string[] # 可选。要包含在测试中的标签。将作为 `--include-tags` 传递给 Maestro。 exclude_tags: string | string[] # 可选。要从测试中排除的标签。将作为 `--exclude-tags` 传递给 Maestro。 maestro_version: string # 可选。用于测试的 Maestro 版本。如果未提供,将使用最新版本。 maestro_config: string # 可选。用于测试的 Maestro `config.yaml` 文件的路径。将作为 `--config` 传递给 Maestro。 device_locale: string # 可选。要用于测试的设备语言区域。将作为 `--device-locale` 传递给 Maestro。 device_model: string # 可选。要用于测试的设备型号。将作为 `--device-model` 传递给 Maestro。请运行 `maestro list-cloud-devices` 查看支持的值列表。 device_os: string # 可选。要用于测试的设备操作系统。将作为 `--device-os` 传递给 Maestro。请运行 `maestro list-cloud-devices` 查看支持的值列表。 skip_build_check: boolean # 可选,默认值为 false。跳过构建校验(例如 iOS 构建是否为模拟器构建)。 name: string # 可选。Maestro Cloud 上传的名称。对应 `maestro cloud` 的 `--name` 参数。 branch: string # 可选。覆盖 Maestro Cloud 上传来源的分支。默认情况下,如果工作流运行是从 GitHub 触发的,则使用该工作流运行的分支。对应 `maestro cloud` 的 `--branch` 参数。 async: boolean # 可选。异步运行 Maestro Cloud 测试。如果为 true,则作业状态只表示上传是否成功,*而不表示*测试是否成功。对应 `maestro cloud` 的 `--async` 参数。 hooks: after_checkout: step[] # 可选。在作业检出项目后运行的步骤。 before_maestro_cloud: step[] # 可选。在上传到 Maestro Cloud 前运行的步骤。 after_maestro_cloud: step[] # 可选。在上传到 Maestro Cloud 后运行的步骤。

slack

使用 webhook URL 向 Slack 频道发送消息。有关详细信息和示例,请参阅 Slack 作业文档

jobs: my_job: type: slack params: webhook_url: string # 必需 message: string # 必需,如果未提供 payload payload: object # 必需,如果未提供 message

github-comment

自动将你工作流中已完成的构建、更新和部署的综合报告发布到 GitHub pull request,或你提供的内容中。有关详细信息和示例,请参阅 GitHub Comment 作业文档

jobs: my_job: type: github-comment params: message: string # 可选 - 要包含在报告中的自定义消息 build_ids: string[] # 可选 - 要包含的特定构建 ID,默认包含与正在运行的工作流相关的全部构建 update_group_ids: string[] # 可选 - 要包含的特定更新组 ID,默认包含与工作流相关的全部更新组 deployment_ids: string[] # 可选 - 要包含的特定部署 ID,默认包含与工作流相关的全部部署 # 不使用 message 以及构建、更新和部署表格时,你也可以用 `payload` 覆盖评论内容 custom_github_comment: type: github-comment params: payload: string # 可选 - 用于完全自定义评论的原始 markdown/HTML 内容

此作业输出以下属性:

{ "comment_url": string | undefined // 已发布的 GitHub 评论 URL }

apple-device-registration-request

暂停工作流,直到 iOS 设备注册到 Apple 团队,并且团队成员批准该注册。有关详细信息和示例,请参阅 Apple device registration request 作业文档

jobs: register_device: type: apple-device-registration-request params: apple_team_identifier: string # 可选

require-approval

在继续工作流之前,需要用户批准。用户可以批准或拒绝,这将分别转换为作业成功或失败。有关详细信息和示例,请参阅 Require Approval 作业文档

jobs: confirm: type: require-approval

doc

在工作流日志中显示一个 Markdown 区块。有关详细信息和示例,请参阅 Doc 作业文档

jobs: next_steps: type: doc params: md: string

repack

从现有构建重新打包一个应用。此作业会重新打包应用的元数据和 JavaScript bundle,而不执行完整的原生重新构建,这对于创建与特定指纹兼容的更快构建很有用。有关详细信息和示例,请参阅 Repack 作业文档

jobs: next_steps: type: repack params: build_id: string # required profile: string # optional embed_bundle_assets: boolean # optional js_bundle_only: boolean # optional ios_signing_use_source_app_entitlements: boolean # optional ios_signing_app_entitlements_path: string # optional message: string # optional repack_version: string # optional repack_package: string # optional hooks: after_checkout: step[] # optional before_install_node_modules: step[] # optional after_install_node_modules: step[] # optional

自定义任务

运行自定义代码,并可使用内置 EAS 函数。不需要 type 字段。

jobs: my_job: steps: # ...

jobs.<job_id>.steps

一个任务包含一个名为 steps 的任务序列。步骤可以运行命令。steps 只能在自定义任务和 build 任务中提供。

jobs: my_job: steps: - name: 我的第一步 run: echo "Hello World"

jobs.<job_id>.outputs

由任务定义的输出列表。这些输出可供所有依赖此任务的下游任务访问。要设置输出,请在任务步骤中使用 set-output 函数。

下游任务可以在 插值上下文 中使用以下表达式访问这些输出:

  • needs.<job_id>.outputs.<output_name>
  • after.<job_id>.outputs.<output_name>

这里,<job_id> 指的是上游任务的标识符,而 <output_name> 指的是你想访问的特定输出变量。

在下面的示例中,set-output 函数在 job_1step_1 步骤中将名为 test 的输出设置为值 hello world。之后,在 job_2 中,可以在 step_2 里使用 needs.job_1.outputs.output_1 访问它。

jobs: job_1: outputs: output_1: ${{ steps.step_1.outputs.test }} steps: - id: step_1 run: set-output test "hello world" job_2: needs: [job_1] steps: - id: step_2 run: echo ${{ needs.job_1.outputs.output_1 }}

jobs.<job_id>.image

指定用于该任务的 VM 镜像。可用镜像请参见 Infrastructure

jobs: my_job: image: auto | string # 可选,默认为 'auto'

jobs.<job_id>.runs_on

指定将执行该任务的 worker。可用于自定义任务以及 buildmaestromaestro-cloudrepack 预打包任务。

jobs: my_job: runs_on: linux-medium | linux-large | linux-medium-nested-virtualization | linux-large-nested-virtualization | macos-medium | macos-large # 可选,默认为 linux-medium
工作器vCPU内存(GiB RAM)SSD(GiB)备注
linux-medium41614默认工作器。
linux-large83228
linux-medium-nested-virtualization41614允许运行 Android 模拟器。
linux-large-nested-virtualization43228允许运行 Android 模拟器。
工作器效率核心数统一内存(GiB RAM)SSD(GiB)备注
macos-medium520125运行 iOS 作业,包括模拟器。
macos-large1040125运行 iOS 作业,包括模拟器。

jobs.<job_id>.steps.<step>.id

id 属性用于在作业中引用该步骤。可用于在下游作业中使用该步骤的输出。

jobs: my_job: outputs: test: ${{ steps.step_1.outputs.test }} # 引用 step_1 的输出 steps: - id: step_1 run: set-output test "hello world"

jobs.<job_id>.steps.<step>.name

该步骤的人类可读名称,会显示在作业日志中。当步骤未提供名称时,会使用 run 命令作为步骤名称。

jobs: my_job: steps: - name: 我的第一步 run: echo "Hello World"

jobs.<job_id>.steps.<step>.run

在该步骤中运行的 shell 命令。

jobs: my_job: steps: - run: echo "Hello World"

jobs.<job_id>.steps.<step>.shell

Shell 用于运行命令。默认值为 bash

jobs: my_job: steps: - run: echo "Hello World" shell: bash

jobs.<job_id>.steps.<step>.working_directory

运行命令的目录。当在步骤级别定义时,如果作业中也定义了 jobs.<job_id>.defaults.run.working_directory 设置,则该设置会被覆盖。

jobs: my_job: steps: - uses: eas/checkout - run: pwd # 输出:/home/expo/workingdir/build/my-app working_directory: ./my-app

jobs.<job_id>.steps.<step>.uses

EAS 提供了一组内置的可复用函数,可在工作流步骤中使用。uses 关键字用于指定要使用的函数。所有内置函数都以 eas/ 前缀开头。

jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/prebuild - name: 列出文件 run: ls -la

以下是你可以在工作流步骤中使用的内置函数列表。

eas/checkout

检出你的项目源文件。

jobs: my_job: steps: - uses: eas/checkout

对于使用基于 Git 的项目源的作业,该步骤默认使用作业记录的提交。使用 ref 可以检出其他分支、标签或提交:

jobs: my_job: steps: - uses: eas/checkout with: ref: feature/add-icon

ref 接受以下内容:

  • 分支,可以是 feature/add-icon 这样的裸名称,也可以是 refs/heads/feature/add-icon 这样的限定引用。仓库最终会位于该分支上。
  • 标签,例如 refs/tags/v1.2.3 这样的限定引用。仓库最终会处于分离的 HEAD 状态。
  • 完整的提交 SHA。仓库最终会处于分离的 HEAD 状态。

该步骤会从源仓库的 origin 执行浅层提取(--depth 1),因此该引用必须在那里可访问。

ref 仅在项目源来自 Git 仓库时有效,例如通过 GitHub 集成触发的作业。本地构建和上传的项目 tarball 不支持此功能。请在作业的第一个 eas/checkout 步骤中设置 ref。在后续步骤中设置会失败,因为项目已经检出。

属性类型必填描述
refstring要检出的 Git 分支、标签或完整提交 SHA。默认为触发构建或工作流任务的 ref。
eas/checkout 源代码

在 GitHub 上查看 eas/checkout 函数的源代码。

eas/install_node_modules

使用根据你的项目检测到的包管理器(bun、npm、pnpm 或 Yarn)安装 node_modules。适用于 monorepo。

example.yml
jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules
eas/install_node_modules 源代码

在 GitHub 上查看 eas/install_node_modules 函数的源代码。

eas/download_build

下载给定构建的应用归档。默认情况下,下载的产物可以是 .apk.aab.ipa.app 文件,或者是一个包含这些文件中一个或多个的 .tar.gz 归档。如果产物是 .tar.gz 归档,它将被解压,并返回匹配指定扩展名的第一个文件。如果构建未生成任何应用归档,该步骤将失败。

jobs: my_job: steps: - uses: eas/download_build with: build_id: string # 必填。要下载的构建 ID。 extensions: [apk, aab, ipa, app] # 可选。要查找的文件扩展名列表。默认为 ["apk", "aab", "ipa", "app"]。
属性类型必填默认值描述
build_idstring要下载的构建的 ID。必须是有效的 UUID。
extensionsstring[]["apk", "aab", "ipa", "app"]要在下载的工件或存档中查找的文件扩展名列表。
输出
属性类型描述
artifact_pathstring匹配的应用程序存档的绝对路径。此输出可用作其他步骤的输入。例如,可用于上传或进一步处理工件。
eas/download_build 源代码

在 GitHub 上查看 eas/download_build 函数的源代码。

示例用法:

jobs: build_ios: type: build params: platform: ios profile: production my_job: needs: [build_ios] steps: - uses: eas/download_build id: download_build with: build_id: ${{ needs.build_ios.outputs.build_id }} - name: 打印产物路径 run: | echo "Artifact path: ${{ steps.download_build.outputs.artifact_path }}"

eas/prebuild

使用根据你的项目检测到的包管理器(bun、npm、pnpm 或 Yarn),并采用最适合你的构建类型和构建环境的命令来运行 expo prebuild 命令。

jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/prebuild
jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/resolve_apple_team_id_from_credentials id: resolve_apple_team_id_from_credentials - uses: eas/prebuild with: clean: false apple_team_id: ${{ steps.resolve_apple_team_id_from_credentials.outputs.apple_team_id }}
属性类型描述
cleanboolean可选属性,用于定义函数运行命令时是否应使用 --clean 标志。默认为 false。
apple_team_idstring可选属性,用于定义执行预构建时应使用的 Apple 团队 ID。使用凭据进行 iOS 构建时必须指定此属性。
eas/prebuild 源代码

在 GitHub 上查看 eas/prebuild 函数的源代码。

eas/restore_cache

从指定键恢复之前保存的缓存。这对于通过重用已缓存的产物(如已编译的依赖项、构建工具或其他中间构建输出)来加快构建速度很有用。

jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/prebuild - uses: eas/restore_cache with: key: cache-${{ hashFiles('package-lock.json') }} restore_keys: cache path: /path/to/cache
jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/prebuild - uses: eas/restore_cache with: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache
属性类型必填描述
keystring要恢复的缓存键。您可以使用 ${{ hashFiles('package-lock.json') }} 等表达式,根据文件哈希创建动态键。
restore_keysstring如果未找到完全匹配的键,则使用的备用键或前缀。如果提供了该值,缓存系统将查找所有以此前缀开头的缓存条目。
pathstring缓存应恢复到的路径。该路径应与保存缓存时使用的路径一致。
eas/restore_cache 源代码

在 GitHub 上查看 eas/restore_cache 函数的源代码。

eas/save_cache

将缓存保存到指定键。这使你可以持久化构建产物、已编译的依赖项或其他中间输出,以便在后续构建中重复使用,从而加快构建过程。

jobs: my_job: steps: - uses: eas/checkout - uses: eas/install_node_modules - uses: eas/prebuild - uses: eas/restore_cache with: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache - name: 构建 Android 应用 run: cd android && ./gradlew assembleRelease - uses: eas/save_cache with: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache
属性类型必填描述
keystring保存缓存所使用的缓存键。你可以使用 ${{ hashFiles('package-lock.json') }} 这样的表达式,根据文件哈希创建动态键。此键应与恢复缓存时使用的键一致。
pathstring应缓存的目录或文件的路径。此路径应与恢复缓存时使用的路径一致。
eas/save_cache 源代码

在 GitHub 上查看 eas/save_cache 函数的源代码。

eas/send_slack_message

向已配置的 Slack webhook URL 发送指定消息,然后它会将消息发布到相关的 Slack 频道。消息可以指定为纯文本或 Slack Block Kit 消息。

你可以在消息中引用构建作业属性,并使用其他步骤的输出进行动态求值。例如,Build URL: https://expo.dev/builds/${{ needs.build_ios.outputs.build_id }}Build finished with status: ${{ after.build_android.status }}

必须指定 messagepayload 其中之一,但不能同时指定两者。

jobs: my_job: steps: - uses: eas/send_slack_message with: message: 'This is a message sent to a Slack channel' slack_hook_url: ${{ env.ANOTHER_SLACK_HOOK_URL }}
PropertyTypeDescription
messagestring要发送的消息文本。例如,'This is the content of the message'

**注意:**必须提供 messagepayload,但不能同时提供两者。
payloadjson要发送的消息内容,使用 Slack Block Kit 布局定义。

**注意:**必须提供 messagepayload,但不能同时提供两者。
slack_hook_urlstring之前配置的 Slack webhook URL,该 URL 会将你的消息发布到指定频道。请使用 EAS 环境变量 提供,例如 slack_hook_url: ${{ env.ANOTHER_SLACK_HOOK_URL }};或者设置 SLACK_HOOK_URL 环境变量,该变量将作为默认 webhook URL(在后一种情况下,无需提供 slack_hook_url 属性)。
eas/send_slack_message 源代码

在 GitHub 上查看 eas/send_slack_message 函数的源代码。

eas/use_npm_token

配置 Node 包管理器(bun、npm、pnpm 或 Yarn)以便与私有包一起使用,这些包可以发布到 npm 或私有注册表。

在项目的 secrets 中设置 NPM_TOKEN,该函数将通过使用该令牌创建 .npmrc 来配置构建环境。

example.yml
jobs: my_job: name: 安装私有 npm 模块 steps: - uses: eas/checkout - uses: eas/use_npm_token - name: 安装依赖 run: npm install # <---- 现在可以安装私有包了
eas/use_npm_token 源代码

在 GitHub 上查看 eas/use_npm_token 函数的源代码。

eas/upload_artifact

将作业工作区中的文件作为附加到工作流运行的工件上传。上传的工件会显示在运行的 Artifacts 部分,并可在后续作业中通过 eas/download_artifact 获取。

jobs: my_job: steps: - uses: eas/checkout - name: Run tests run: ./scripts/run-tests.sh # 将结果写入 ./results - uses: eas/upload_artifact if: ${{ always() }} with: type: other name: test-results path: | results/**/*
属性
属性类型必填描述
pathstring要上传的路径或以换行符分隔的路径列表。支持 * 和其他 glob 模式
typestring构件类型。在自定义作业中使用 other(通用构件)。当作业没有构建平台时,默认为 other;在构建作业中默认为 application-archive。构建范围的值 application-archivebuild-artifact 仅适用于构建作业。
namestring构件名称,用于从 eas/download_artifact 引用该构件。
metadatajson要附加到通用(other)构件的任意元数据。
ignore_errorbooleantrue 时,上传失败会记录日志,但不会导致步骤失败。默认为 false
输出
属性类型描述
artifact_idstring已上传构件的 ID。可传递给 eas/download_artifact
eas/upload_artifact 源代码

在 GitHub 上查看 eas/upload_artifact 函数的源代码。

eas/download_artifact

根据工件的 ID 或名称从 EAS 下载一个工件。适用于将前面作业中的工件发送到其他服务。

jobs: my_job: steps: - uses: eas/download_artifact with: name: string # 如果未提供 artifact_id,则为必填。要下载的工件名称。 artifact_id: string # 如果未提供 artifact_name,则为必填。要下载的工件 ID。
属性
属性类型必填描述
namestring要下载的构建产物名称。如果未提供 artifact_id,则此项为必填项。
artifact_idstring要下载的构建产物 ID。如果未提供 name,则此项为必填项。
输出
属性类型描述
artifact_pathstring已下载构建产物的路径。此输出可用作工作流中其他步骤的输入。例如,用于发送或处理构建产物。
eas/download_artifact 源代码

在 GitHub 上查看 eas/download_artifact 函数的源代码。

示例
jobs: maestro_tests: type: maestro params: build_id: '123-abc' flow_path: 'path/to/flow.yaml' my_job: needs: [maestro_tests] steps: - uses: eas/download_artifact id: download_artifact with: name: 'iOS Maestro Test Report (junit)' - name: 打印 Maestro 输出 run: echo ${{ steps.download_artifact.outputs.artifact_path }}

以下函数可将你的工作流连接到 PostHog。运行 eas integrations:posthog:connect 以关联 PostHog 项目,并设置这些函数读取的环境变量。eas/posthog_capture_event 使用你的公共项目 API 密钥,而其他函数使用 PostHog 个人 API 密钥,并要求具备各函数注明的权限范围。有关设置,请参阅使用 PostHog;有关完整工作流,请参阅 EAS Workflows 的 PostHog 配方

eas/posthog_capture_event

PostHog 发送分析事件。你可以使用它在 PostHog 时间线中标记构建、发布和其他里程碑。

如果不提供 distinct_id,事件将以匿名方式发送,并且不会创建 PostHog 人员档案,从而使工作流事件不会出现在人员列表中。

jobs: my_job: steps: - uses: eas/posthog_capture_event with: event: ota_update_published properties: branch: main
属性
属性类型必填描述
eventstring要发送的事件名称。
distinct_idstring要将事件归因到的人员。省略时,事件将匿名发送,且不会创建人员档案。
propertiesjson要附加到事件的属性。
api_keystringPostHog 项目 API 密钥。默认为由 eas integrations:posthog:connect 设置的 EXPO_PUBLIC_POSTHOG_API_KEY 环境变量;如果未设置,则回退到 POSTHOG_API_KEY
hoststringPostHog 主机。默认为 EXPO_PUBLIC_POSTHOG_HOST 环境变量,或 https://us.posthog.com
ignore_errorboolean当值为 true 时,发送事件失败会记录日志,但不会导致步骤失败。默认为 false
eas/posthog_capture_event 源代码

在 GitHub 上查看 eas/posthog_capture_event 函数的源代码。

eas/posthog_flag_rollout

启用、禁用或逐步发布 PostHog 功能标志。该函数会通过键查找标志,然后更新它。至少提供 activerollout_percentagepayload 其中之一。

jobs: my_job: steps: - uses: eas/posthog_flag_rollout with: flag: new-checkout rollout_percentage: 25
属性
PropertyTypeRequiredDescription
flagstring要更新的功能标志键。
activeboolean功能标志是否已启用。
rollout_percentagenumber功能标志面向的用户百分比,取值为 0100 之间的整数。此函数会将其应用于功能标志的兜底发布条件,并保留其他条件。如果功能标志没有兜底条件,此函数会将其应用于第一个条件。
payloadjson要附加到功能标志的负载。
variantstring在多变量功能标志上用于存储 payload 的变体键。默认为功能标志的 true 负载。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 feature_flag:readfeature_flag:write 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorbooleantrue 时,网络错误、缺少功能标志或意外响应会被记录,但不会导致步骤失败。默认为 false。权限错误或无效输入(例如超出范围的 rollout_percentage)始终会导致步骤失败。
eas/posthog_flag_rollout 源代码

在 GitHub 上查看 eas/posthog_flag_rollout 函数的源代码。

eas/posthog_wait_for_metric

暂停工作流,直到 HogQL 查询返回满足比较条件的数值。你可以使用它根据某项指标控制发布流程,例如等待最近几分钟的错误数保持较低。

该函数每隔 interval_seconds 运行一次查询,直到比较结果为真或 timeout_seconds 到期。无法读取的查询(例如无效的 HogQL)会立即导致步骤失败,而临时错误会在超时前重试。

jobs: my_job: steps: - uses: eas/posthog_wait_for_metric with: query: SELECT count() FROM events WHERE event = '$exception' AND timestamp > now() - INTERVAL 15 MINUTE operator: lt threshold: 10
属性
属性类型必填描述
querystringHogQL 查询。第一行的第一列必须是单个数字。
operatorstring比较运算符。可以是 ltltegtgteeq 之一。当 value <operator> threshold 成立时,步骤将清除。
thresholdnumber用于与查询结果进行比较的值。
timeout_secondsnumber等待的最长时间,以秒为单位。默认为 600
interval_secondsnumber检查之间的时间间隔,以秒为单位。默认为 30
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 query:read 权限范围。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
输出
属性类型描述
valuestring满足比较条件的指标值。
eas/posthog_wait_for_metric 源代码

在 GitHub 上查看 eas/posthog_wait_for_metric 函数的源代码。

eas/posthog_wait_for_query

暂停工作流,直到 HogQL 查询返回 true。当条件更容易直接在查询中表达时,可以使用此函数。如果是带有明确阈值的数值比较,请改用 eas/posthog_wait_for_metric

当第一行第一列的值为 true 或非零数字时,该步骤会完成,因此请编写查询以选择单个布尔值,例如 SELECT count() > 100 FROM events

jobs: my_job: steps: - uses: eas/posthog_wait_for_query with: query: SELECT count() > 0 FROM events WHERE event = 'smoke_test_passed' AND timestamp > now() - INTERVAL 30 MINUTE
属性
属性类型必填描述
querystringHogQL 查询。当第一行的第一列为 true 或非零数字时,该步骤将清除。
timeout_secondsnumber最大等待时间,以秒为单位。默认为 600
interval_secondsnumber检查之间的间隔时间,以秒为单位。默认为 30
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 query:read 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
eas/posthog_wait_for_query 源代码

在 GitHub 上查看 eas/posthog_wait_for_query 函数的源代码。

eas/posthog_annotation

在项目时间线上创建 PostHog 注释。注释会显示在 PostHog 图表上,因此可以方便地在相关指标旁标记构建、发布和其他里程碑。

jobs: my_job: steps: - uses: eas/posthog_annotation with: content: Published update to production
属性
属性类型必填描述
contentstring注释文本。
date_markerstring注释固定到的 ISO 8601 时间戳。默认为当前时间。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 annotation:write 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorboolean当值为 true 时,会记录网络错误或意外响应,但不会使步骤失败。默认为 false。权限错误始终会使步骤失败。
eas/posthog_annotation 源代码

在 GitHub 上查看 eas/posthog_annotation 函数的源代码。

eas/posthog_upload_sourcemaps

将 JavaScript 源映射上传到 PostHog,以便 PostHog 在错误跟踪中对堆栈跟踪进行符号化处理。请在生成 bundle 的步骤之后、同一作业中运行此函数,以确保 bundle 和源映射在磁盘上可用。使用 npx expo export --source-maps 导出,并根据源映射指南配置 PostHog Metro 配置,使 bundle 携带能够将其与源映射匹配的分块 ID。

jobs: publish_update: steps: - uses: eas/checkout - uses: eas/install_node_modules - run: npx expo export --source-maps - uses: eas/posthog_upload_sourcemaps with: directory: dist
属性
属性类型必填描述
directorystring包含 bundle 和源映射的目录,相对于工作目录。默认为 dist
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要源映射上传权限。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorboolean当为 true 时,上传失败会被记录,但不会导致步骤失败。默认为 false
eas/posthog_upload_sourcemaps 源代码

在 GitHub 上查看 eas/posthog_upload_sourcemaps 函数的源代码。

内置 shell 函数

EAS Workflows 提供了以下 shell 函数,你可以在工作流步骤中使用它们来设置变量输出。

set-output

设置一个输出变量,其他步骤或工作流中的其他任务可以访问它。

set-output <name> <value>

用于与另一个步骤共享变量的示例:

jobs: my_job: steps: - id: step_1 run: set-output variable_1 "变量 1" - id: step_2 run: echo ${{ steps.step_1.outputs.variable_1 }} # 输出:变量 1

用于与另一个任务共享变量的示例:

jobs: job_1: outputs: variable_1: ${{ steps.step_1.outputs.variable_1 }} steps: - id: step_1 run: set-output variable_1 "变量 1" job_2: needs: [job_1] steps: - run: echo ${{ needs.job_1.outputs.variable_1 }} # 输出:变量 1

set-env

设置一个环境变量,该变量可供同一任务中的后续步骤使用。在一个步骤的命令中使用 export 导出的环境变量不会自动暴露给其他步骤。若要与其他步骤共享环境变量,请使用 set-env 可执行文件。

set-env <name> <value>

set-env 需要传入两个参数:环境变量的名称和值。例如,set-env NPM_TOKEN "abcdef" 会将 $NPM_TOKEN 变量及其值 abcdef 暴露给后续步骤。

用于与另一个步骤共享环境变量的示例:

jobs: my_job: steps: - name: 设置环境变量 run: | # 仅使用 export 只会让它在当前步骤中可用 export LOCAL_VAR="仅在此步骤中" # 使用 set-env 会让它在后续步骤中可用 set-env SHARED_VAR "在后续步骤中可用" # SHARED_VAR 目前在当前步骤的环境中还不可用 echo "LOCAL_VAR: $LOCAL_VAR" # 输出:仅在此步骤中 echo "SHARED_VAR: $SHARED_VAR" # 输出:(空) - name: 使用共享变量 run: | # SHARED_VAR 现在可用了 # @info # echo "SHARED_VAR: $SHARED_VAR" # 输出:在后续步骤中可用 # @end #

在任务之间共享环境变量

set-env 函数只会在同一任务内与其他步骤共享环境变量。若要在不同任务之间共享值,请使用任务的 outputs 配合 set-output,并通过接收任务上的 env 属性传递它们:

jobs: job_1: outputs: my_value: ${{ steps.step_1.outputs.my_value }} steps: - id: step_1 run: set-output my_value "来自 job_1 的值" job_2: needs: [job_1] env: MY_VALUE: ${{ needs.job_1.outputs.my_value }} steps: - run: echo "MY_VALUE: $MY_VALUE" # 输出:来自 job_1 的值