从 CI 触发构建
编辑页面
了解如何在 EAS 上从 CI 环境(例如 GitHub Actions 等)为你的应用触发构建。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
本文档概述了如何从 CI 环境(例如 GitHub Actions、Travis CI 等)为你的应用触发 EAS 构建。
前置条件
在本地机器上成功运行一次构建
要从 CI 环境触发 EAS 构建,你的应用需要先配置为以非交互模式使用 EAS Build。为此,请完成 EAS Build 的初始化步骤,并在本地终端中针对你希望在 CI 上支持的每个平台成功运行一次构建。这样,eas build 命令就可以提示你进行任何所需的额外配置,然后这些配置就可以用于未来在 CI 上的非交互式运行。
在本地运行构建将完成以下关键配置步骤:
- 通过生成
projectId在 EAS 上初始化项目。 - 添加定义构建配置文件的 eas.json 文件。
- 为原生构建填充关键的应用配置属性,例如
android.packageName和ios.bundleIdentifier。 - 确保已创建构建凭据,包括 Android keystore 以及 iOS 分发证书和 provisioning profile。
运行 eas build -p [all|android|ios] 并验证每个平台的构建都能成功完成。然后,继续按照下面的步骤在 CI 上实现 EAS Build。
如果你还没有完成这一步,请查看 创建你的第一个构建 指南,并在准备好后返回这里。
使用 EAS Workflows
EAS Workflows 是 Expo 提供的一项 CI/CD 服务,允许你在 EAS 上运行构建以及许多其他类型的任务。你可以使用 EAS Workflows 来自动化开发和发布流程,例如创建开发构建或自动构建并提交到应用商店。
要使用 EAS Workflows 创建构建,首先在 .eas/workflows/build.yml 中添加以下代码:
name: Build on: push: branches: - main jobs: build_android: name: 构建 Android 应用 type: build params: platform: android build_ios: name: 构建 iOS 应用 type: build params: platform: ios
当有提交推送到 main 分支时,此工作流将创建 Android 和 iOS 构建。你可以在 EAS Workflows 文档 中了解如何修改此工作流并串联其他类型的任务。
为其他 CI 服务配置你的应用
提供个人访问令牌,以便在 CI 上使用你的 Expo 账户进行身份验证
接下来,我们需要确保我们能够在 CI 上以应用所有者的身份进行身份验证。可以通过在 CI 设置中将个人访问令牌存储到 EXPO_TOKEN 环境变量中来实现。
请参阅 个人访问令牌 了解如何创建访问令牌。
(可选)为你的 Apple 团队提供 ASC API 令牌
如果你的 iOS 凭据需要修复,我们将需要一个 ASC API 密钥,以便在 CI 中向 Apple 进行身份验证。一个常见的情况是你的 provisioning profile 需要重新签名。
你需要创建一个 API Key。接下来,你需要收集有关你的 Apple 团队 的信息。
使用你收集到的信息,通过环境变量将其传递给构建命令。你需要传递以下内容:
EXPO_ASC_API_KEY_PATH:你的 ASC API Key .p8 文件的路径。例如,/path/to/key/AuthKey_SFB993FB5F.p8。EXPO_ASC_KEY_ID:你的 ASC API Key 的 key ID。例如,SFB993FB5F。EXPO_ASC_ISSUER_ID:你的 ASC API Key 的 issuer ID。例如,f9675cff-f45d-4116-bd2c-2372142cee09。EXPO_APPLE_TEAM_ID:你的 Apple Team ID。例如,77KQ969CHE。EXPO_APPLE_TEAM_TYPE:你的 Apple Team Type。有效类型为IN_HOUSE、COMPANY_OR_ORGANIZATION或INDIVIDUAL。
触发新构建
现在我们已经通过 Expo CLI 完成了身份验证,可以创建构建步骤了。
要触发新构建,我们将把以下脚本添加到我们的配置中:
- npx eas-cli build --platform all --non-interactive --no-wait这将会在 EAS 上触发一个新构建。系统会打印出一个 URL,链接到 EAS 仪表板中该构建的进度页面。
--no-wait标志会在构建被触发后立即退出该步骤。在 EAS 执行构建期间,CI 执行时间不会计费。但是,只有在触发 EAS Build 成功时,你的 CI 才会报告构建任务通过。
Travis CI
将以下代码片段添加到项目仓库根目录下的 .travis.yml 中。
language: node_js node_js: - node - lts/* cache: directories: - ~/.npm before_script: - npm install -g npm@latest jobs: include: - stage: build node_js: lts/* script: - npm ci - npx eas-cli build --platform all --non-interactive --no-wait
GitLab CI
将以下代码片段添加到项目仓库根目录下的 .gitlab-ci.yml 中。
image: node:alpine cache: key: ${CI_COMMIT_REF_SLUG} paths: - .npm # 或者使用 Yarn: #- .yarn stages: - build before_script: - npm ci --cache .npm # 或者使用 Yarn: #- yarn install --cache-folder .yarn eas-build: stage: build script: - apk add --no-cache bash - npx eas-cli build --platform all --non-interactive --no-wait
Bitbucket Pipelines
将以下代码片段添加到项目仓库根目录下的 bitbucket-pipelines.yml 中。
image: node:alpine definitions: caches: npm: ~/.npm pipelines: default: - step: name: Build app deployment: test caches: - npm script: - apk add --no-cache bash - npm ci - npx eas-cli build --platform all --non-interactive --no-wait
CircleCI
将以下代码片段添加到项目仓库根目录下的 circleci/config.yml 中。
version: 2.1 executors: default: docker: - image: cimg/node:lts working_directory: ~/my-app jobs: eas_build: executor: default steps: - checkout - run: name: Install dependencies command: npm ci - run: name: Trigger build command: npx eas-cli build --platform all --non-interactive --no-wait workflows: build_app: jobs: - eas_build: filters: branches: only: master
GitHub Actions
将以下代码片段添加到项目仓库根目录下的 .github/workflows/eas-build.yml 中。
name: EAS Build on: workflow_dispatch: push: branches: - main jobs: build: name: Install and build runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v6 with: node-version: 22 cache: npm - name: Setup Expo and EAS uses: expo/expo-github-action@v8 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - name: Install dependencies run: npm ci - name: Build on EAS run: eas build --platform all --non-interactive --no-wait