This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
Pre-packaged jobs in EAS Workflows
Edit page
Learn how to set up and use pre-packaged jobs in EAS Workflows.
Pre-packaged jobs are ready-to-use workflow jobs that help you automate common tasks like building, submitting, and testing your app. They provide a standardized way to handle these operations without having to write custom job configurations from scratch. This guide covers the available pre-packaged jobs and how to use them in your workflows.
Build
Build your project into an Android or iOS app.
Build jobs can be customized so that you can execute custom commands during the build process. See Custom builds for more information.
1 requirement
1 requirement
Your project must be set up for EAS Build: eas.json must contain the build profile the job
uses, and app signing credentials must be configured for the platform. Set up credentials
without running a build first by running eas credentials:configure-build -p <platform> -e <profile> with the same platform and profile the job uses. Learn more about configuring your
project for EAS Build.
Syntax
jobs: build_app: type: build runs_on: string # optional - see https://docs.expo.dev/build-reference/infrastructure/ for available options params: platform: android | ios # required profile: string # optional - default: production message: string # optional refresh_ad_hoc_provisioning_profile: boolean # optional hooks: before_install_node_modules: step[] # optional - steps to run before the build installs dependencies. after_install_node_modules: step[] # optional - steps to run after the build installs dependencies.
Parameters
You can pass the following parameters into the params list:
Environment variables
If you need certain environment variables during the build process, you can include them in your eas.json, for your specified build profile. They will be pulled from EAS environment variables.
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the Build job:
before_install_node_modules: steps to run before the build installs your project's dependencies.after_install_node_modules: steps to run after the build installs your project's dependencies.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the build job:
Basic build for a specific platform
This workflow builds your iOS app whenever you push to the main branch.
Build for both platforms in parallel
This workflow builds both Android and iOS apps in parallel when you push to the main branch.
Build with environment variables
This workflow builds your Android app with custom environment variables that can be used during the build process.
Build with different profiles
This workflow creates two different Android builds using different profiles - one for internal distribution and one for store submission using the development and production profiles.
Internal iOS build with refreshed ad hoc profile
This workflow builds your iOS app for internal distribution and refreshes the ad hoc provisioning profile when you push to the main branch.
Deploy
Deploy your application using EAS Hosting.
1 requirement
1 requirement
See Get started with EAS Hosting for setup instructions.
Syntax
jobs: deploy_web: type: deploy params: alias: string # optional prod: boolean # optional source_maps: boolean # optional hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies.
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the Deploy job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the deploy job:
Basic deployment to production
This workflow deploys your application to production using EAS Hosting.
Deploy to production only on merges to the `main` branch
This workflow deploys your application to production when you merge to the main branch, and makes a non-production deployment on all other branches.
Deployment with custom alias
This workflow deploys your application to a custom alias in production.
Fingerprint
Calculates a fingerprint of your project.
Note: This job type only supports CNG workflows. If you commit your android or ios directories, the fingerprint job won't work.
Note: To ensure fingerprints match your builds, use the same
environmentsetting as your build profile. For environment variables, we recommend using EAS environment variables rather than theenvfield for better consistency.
Syntax
jobs: fingerprint: type: fingerprint environment: production | preview | development # optional, defaults to production env: # optional list of environment variables ENV_VAR_NAME: value hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies.
Environment variables
You can pass a list of environment variables into the env parameter. These environment variables will be pulled from EAS environment variables. The passed environment parameter will be used for the environment variable's environment, which is useful when the same environment variable is defined across different environments.
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the Fingerprint job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the fingerprint job:
Basic fingerprint calculation
This workflow calculates fingerprints for both Android and iOS builds. The environment should match your build profile for accurate fingerprint matching.
Fingerprint with inline environment variables
Note: If you depend on inline environment variables, you will need to always make sure to set the right set of environment variables to the right values in every place (build profile, fingerprint job, update job, and so on) for fingerprints to match. We recommend using EAS Environment Variables instead, where you can group sets of variables into environments and reference them in the build profile and workflow jobs.
Get Build
Retrieve an existing build from EAS that matches the provided parameters.
Syntax
jobs: get_build: type: get-build params: platform: ios | android # optional profile: string # optional distribution: store | internal | simulator # optional channel: string # optional app_identifier: string # optional app_build_version: string # optional app_version: string # optional git_commit_hash: string # optional fingerprint_hash: string # optional sdk_version: string # optional runtime_version: string # optional simulator: boolean # optional wait_for_in_progress: boolean # optional
Parameters
You can pass the following parameters into the params list:
If wait_for_in_progress is set to true, the job will still prioritize continuing immediately with a successful build, but it will also look for in-progress builds. If no successful build is found, the job will wait for an in-progress build to complete before continuing. If the matched build succeeds, the job will be marked as successful and will return the successful build. If the matched build fails, the job will be marked as successful and its outputs will be empty — as if the build has not been matched.
Outputs
You can reference the following outputs in subsequent jobs:
Examples
Here are some practical examples of using the get-build job:
Get latest production build
This workflow retrieves the latest production build for iOS from the store distribution channel.
Get build by version
This workflow retrieves a specific version of an Android build by its app version and build version.
Get simulator build
This workflow retrieves a simulator build for iOS development. wait_for_in_progress is set to true so that if a build matching the filter already exists, the job will wait for it to complete before continuing.
Submit
Submit an Android or iOS build to the app store using EAS Submit.
1 requirement
1 requirement
Submission jobs require additional configuration to run within a CI/CD process. See the Google Play Store CI/CD submission guide and Apple App Store CI/CD submission guide for more information.
Syntax
jobs: submit_to_store: type: submit params: build_id: string # required profile: string # optional - default: production groups: string[] # optional hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies. before_submit: step[] # optional - steps to run before the submission starts. after_submit: step[] # optional - steps to run after the submission completes.
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the Submit job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.before_submit: steps to run before the submission starts.after_submit: steps to run after the submission completes.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the submit job:
Submit iOS build
This workflow submits an iOS build to the App Store using the production submit profile.
Submit Android build
This workflow submits an Android build to the Play Store using the production submit profile.
TestFlight
Distribute iOS builds to TestFlight internal and external testing groups. This is an alternative to the iOS submit job for when you need more advanced TestFlight features. If you need to control test groups, changelog, or Beta App Review submission, use the testflight job instead of submit.
The job supports two approaches: upload a build and submit it to TestFlight (build_id), or submit an already uploaded build (asc_build_id). In both cases, you can add the build to groups, set "What to Test" notes, and submit for Beta App Review. Provide exactly one of build_id or asc_build_id.
1 requirement
1 requirement
When distributing to external groups or submitting for Beta App Review (external_groups and/or
submit_beta_review: true), the build must have the required TestFlight test information
completed in App Store Connect before the job can succeed. See Provide test
information
in Apple's documentation.
Shared parameters
Both approaches accept the following parameters in params:
Upload build and submit to TestFlight
Upload an EAS iOS build and submit it to TestFlight in a single workflow job.
1 requirement
1 requirement
TestFlight jobs require an iOS build created with distribution: store and an Apple Developer
account configured. See the TestFlight submission
guide for more information.
Syntax
jobs: testflight_distribution: type: testflight params: build_id: string # required profile: string # optional - default: production internal_groups: string[] # optional external_groups: string[] # optional changelog: string # optional submit_beta_review: boolean # optional wait_processing_timeout_seconds: number # optional - default: 1800 (30 minutes) hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies.
Parameters
You can pass the following parameters into the params list:
You can also pass any of the shared parameters.
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the TestFlight job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.
See jobs.<job_id>.hooks for the general hooks syntax. Hooks are not supported when submitting an already uploaded build because that job variant does not run on a worker.
Examples
Here are some practical examples of using the TestFlight job:
Full distribution with internal and external groups
This workflow distributes to both internal and external TestFlight groups with a changelog.
Upload with changelog only
This workflow uploads a build with a changelog but without specifying any groups to explicitly add the build to. The build will only get added to internal groups with "auto-distribute" enabled.
Submit an already uploaded build
Submit a build that is already in App Store Connect to TestFlight groups, set "What to Test" notes, and submit for Beta App Review. Beta App Review submission is optional. Set submit_beta_review: false to update the changelog or groups on an existing build without re-submitting it for review.
1 requirement
1 requirement
Configure your App Store Connect connection in Project settings > General > Connections. The build must already exist in App Store Connect and be ready for submission.
Syntax
jobs: testflight_distribution: type: testflight params: asc_build_id: string # required internal_groups: string[] external_groups: string[] changelog: string submit_beta_review: boolean
Parameters
You can also pass any of the shared parameters.
Outputs
You can reference the following outputs in subsequent jobs:
Examples
Auto-distribute to TestFlight after App Store Connect upload
When a build is uploaded to App Store Connect, this workflow automatically adds the build to TestFlight groups, sets "What to Test" notes, and submits for Beta App Review. Configure your App Store Connect connection before using this trigger. See Trigger workflows from App Store Connect events.
${{ app_store_connect.build_upload.build.id }} is only available when the workflow is triggered by a build_upload event and App Store Connect has associated a build with the upload. build_upload.state: complete means the upload finished, not that App Store Connect finished processing the build. When using external_groups, complete the required TestFlight test information in App Store Connect first.
Update the changelog without re-submitting for Beta App Review
For a build that already exists in App Store Connect, you can update the "What to Test" notes or group membership without triggering Beta App Review. Set submit_beta_review: false to apply the changes while leaving the build's existing review status untouched.
This workflow takes the build ID and new changelog as manual inputs, so you can run it on demand with eas workflow:run.
Update
Publish an update using EAS Update.
1 requirement
1 requirement
To publish update previews and to send over-the-air updates. Run npx eas-cli@latest update:configure, then create new builds. Learn more about configuring EAS
Update.
Syntax
jobs: publish_update: type: update environment: production | preview | development # optional, defaults to production env: # optional list of environment variables ENV_VAR_NAME: value 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 - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies. before_update: step[] # optional - steps to run before publishing the update. after_update: step[] # optional - steps to run after publishing the update.
Environment variables
You can pass a list of environment variables into the env parameter. These environment variables will be pulled from EAS environment variables. The passed environment parameter will be used for the environment variable's environment, which is useful when the same environment variable is defined across different environments.
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Hooks
The following hooks are supported for the Update job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.before_update: steps to run before publishing the update.after_update: steps to run after publishing the update. Hook steps can access files produced during publishing (for example, sourcemaps in the dist directory).
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the update job:
Basic update to production channel
This workflow publishes an update to the production channel whenever you push to the main branch, using the commit message as the update message.
Platform-specific updates
This workflow publishes separate updates for Android and iOS platforms, allowing for platform-specific changes.
Update with branch-based deployment
This workflow publishes updates based on the branch name, allowing for different environments (staging/production) based on the branch.
Upload sourcemaps after publishing an update
This workflow publishes an update and then uploads the generated sourcemaps to PostHog with the built-in eas/posthog_upload_sourcemaps function. Publishing an update creates sourcemaps in the dist directory, the function's default upload directory. These files only exist on the worker that runs the job, so the upload must happen in an after_update hook rather than in a separate job. Hook steps inherit the job's environment, so you can provide the POSTHOG_CLI_API_KEY and POSTHOG_CLI_PROJECT_ID credentials as EAS environment variables. To upload to a different service, run its upload command in a run step instead.
Update rollout
Increase the rollout percentage of an in-progress EAS Update rollout. Use this to gradually roll out an update group that was published to a subset of users with a partial rollout_percentage.
Syntax
jobs: roll_out_update: type: update-rollout params: update_group_id: string # required rollout_percentage: number # optional - 0 to 100, defaults to 100
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Examples
Here are some practical examples of using the update rollout job:
Publish a partial rollout, then complete it after approval
This workflow publishes an update to 25% of users, waits for approval, and only then completes the rollout to 100%.
Branch delete
Delete an EAS Update branch in the current project. The same as eas branch:delete. Pass the EAS Update branch name in branch_name.
Syntax
jobs: delete_branch: type: branch-delete params: branch_name: string # required fail_on_missing: boolean # optional, default: false
Parameters
You can pass the following parameters into the params list:
Outputs
You can reference the following outputs in subsequent jobs:
Examples
See Clean up update branches example for a workflow that uses on.ref_delete with the branch-delete job.
Maestro
Run Maestro tests on an Android Emulator or iOS Simulator build.
Maestro tests are in alpha.
Syntax
jobs: run_maestro_tests: type: maestro environment: production | preview | development # optional - defaults to preview image: string # optional - see https://docs.expo.dev/build-reference/infrastructure/ for a list of available images. runs_on: string # optional - use a linux-*-nested-virtualization worker for Android Emulator tests. See https://docs.expo.dev/eas/workflows/syntax/#jobsjob_idruns_on for available options. params: build_id: string # required flow_path: string | string[] # required shards: number # optional - defaults to 1 retries: number # optional - defaults to 0 retry_failed_only: boolean # optional - defaults to true record_screen: boolean # optional - defaults to false include_tags: string | string[] # optional exclude_tags: string | string[] # optional maestro_version: string # optional - defaults to latest android_system_image_package: string # optional device_identifier: string | { android?: string, ios?: string } # optional output_format: string # optional - defaults to junit skip_build_check: boolean # optional - defaults to false hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_maestro_tests: step[] # optional - steps to run before the tests start. after_maestro_tests: step[] # optional - steps to run after the tests complete.
Parameters
You can pass the following parameters into the params list:
Hooks
The following hooks are supported for the Maestro job:
after_checkout: steps to run after the job checks out your project.before_maestro_tests: steps to run before the tests start.after_maestro_tests: steps to run after the tests complete.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the Maestro job:
Basic Maestro test
This workflow runs Maestro tests on an iOS Simulator build using the default settings.
Maestro test with sharding
This workflow runs Maestro tests on an Android Emulator build with 3 shards and 2 retries for failed tests.
Using Maestro prefixed environment variables
Maestro can automatically read environment variables in a workflow when the variable is prefixed by MAESTRO_. For more information, see the Maestro documentation on shell variables.
Generate Maestro flows before running tests
This workflow uses a hook to generate the maestro_tests directory right before Maestro starts running tests.
Recording screen and using a specific device
This workflow runs Maestro tests on an Android Emulator build with a specific device and records the screen.
Saving screenshots and recordings
Maestro commands such as takeScreenshot or startRecording save assets that you can use for debugging later.
In your Maestro flow file, give each asset a relative path:
The assets will be available within the "Maestro Test Results" artifact in the Artifacts section.
Report Maestro artifacts to Slack
This workflow saves screenshots and recordings to MAESTRO_TESTS_DIR, then runs a script after the tests finish to upload those files or send a summary to Slack.
Maestro Cloud
Run Maestro tests on Maestro Cloud.
This requires a Maestro Cloud account and Cloud Plan subscription. Go to Maestro docs to learn more.
Syntax
jobs: run_maestro_tests: type: maestro-cloud environment: production | preview | development # optional - defaults to preview image: string # optional- see https://docs.expo.dev/build-reference/infrastructure/ for a list of available images. params: build_id: string # required - ID of the build to test. maestro_project_id: string # required - Maestro Cloud project ID. Example: `proj_01jw6hxgmdffrbye9fqn0pyzm0`. flows: string # required - Path to the Maestro flow file or directory containing the flows to run. Corresponds to `--flows` param to `maestro cloud`. maestro_api_key: string # optional - defaults to `$MAESTRO_CLOUD_API_KEY` include_tags: string | string[] # optional - tags to include in the tests. Will be passed to Maestro as `--include-tags`. exclude_tags: string | string[] # optional - tags to exclude from the tests. Will be passed to Maestro as `--exclude-tags`. maestro_version: string # optional - version of Maestro to use for the tests. If not provided, the latest version will be used. maestro_config: string # optional - path to the Maestro `config.yaml` file to use for the tests. Will be passed to Maestro as `--config`. device_locale: string # optional - device locale to use for the tests. Will be passed to Maestro as `--device-locale`. device_model: string # optional - model of the device to use for the tests. Will be passed to Maestro as `--device-model`. Run `maestro list-cloud-devices` for a list of supported values. device_os: string # optional - OS of the device to use for the tests. Will be passed to Maestro as `--device-os`. Run `maestro list-cloud-devices` for a list of supported values. skip_build_check: boolean # optional - skip validation of the build (whether an iOS build is a simulator build). Defaults to false. name: string # optional - name for the Maestro Cloud upload. Corresponds to `--name` param to `maestro cloud`. branch: string # optional - override for the branch the Maestro Cloud upload originated from. By default, if the workflow run has been triggered from GitHub, the branch of the workflow run will be used. Corresponds to `--branch` param to `maestro cloud`. async: boolean # optional - run the Maestro Cloud tests asynchronously. If true, the status of the job will only denote whether the upload was successful, _not_ whether the tests succeeded. Corresponds to `--async` param to `maestro cloud`. hooks: after_checkout: step[] # optional - steps to run after the job checks out your project. before_maestro_cloud: step[] # optional - steps to run before the Maestro Cloud upload. after_maestro_cloud: step[] # optional - steps to run after the Maestro Cloud upload.
Parameters
You can pass the following parameters into the params list:
You need to either setmaestro_api_keyparameter orMAESTRO_CLOUD_API_KEYenvironment variable in the job environment. Go to "Settings" on Maestro Cloud to generate an API key and then to Environment variables to add it to your project.
Hooks
The following hooks are supported for the Maestro Cloud job:
after_checkout: steps to run after the job checks out your project.before_maestro_cloud: steps to run before the Maestro Cloud upload.after_maestro_cloud: steps to run after the Maestro Cloud upload.
See jobs.<job_id>.hooks for the general hooks syntax.
Outputs
You can reference the following outputs in subsequent jobs:
Note: When using
async: truemode, only themaestro_cloud_urloutput is guaranteed to be valid. Other outputs (flow counts and flow names) may be invalid or empty because the job does not wait for the upload to complete and the flows have not been executed yet.
You can also define additional outputs for this job using jobs.<job_id>.outputs.
Examples
Here are some practical examples of using the Maestro Cloud job:
Basic Maestro Cloud test
This workflow runs Maestro tests on an iOS Simulator build using the default settings.
Using Maestro prefixed environment variables
Maestro can automatically read environment variables in a workflow when the variable is prefixed by MAESTRO_. For more information, see the Maestro documentation on shell variables.
Using Maestro Cloud outputs in subsequent jobs
This workflow runs Maestro Cloud tests and then uses the test results in a Slack notification.
Slack
Send a message to a Slack channel using a Slack webhook URL.
Syntax
jobs: send_slack_notification: type: slack params: webhook_url: string # required message: string # required if payload is not provided payload: object # required if message is not provided
Parameters
You can pass the following parameters into the params list:
Examples
Here are some practical examples of using the Slack job:
Basic build notification
This workflow builds an iOS app and then sends a notification with the app identifier and version from the build job outputs. The webhook URL is read from a SLACK_WEBHOOK_URL environment variable set in the job's environment.
Rich build notification with Block Kit
This workflow builds an Android app and sends a rich notification using the build job outputs.
GitHub Comment
Automatically post reports of your workflow's completed builds, updates, and deployments to GitHub pull requests. It's particularly useful for providing instant feedback on PR builds, sharing test builds with QR codes for easy device testing, displaying EAS Hosting deployment previews, and automating deployment notifications. You can also override the comment contents by providing the payload parameter.
1 requirement
1 requirement
To use the GitHub Comment job, your project must have a GitHub repository connected. Learn how to connect your GitHub repository to get started.
Syntax
jobs: github_comment: type: github-comment params: message: string # optional - custom message to include in the report build_ids: string[] # optional - specific build IDs to include, defaults to all related to the running workflow update_group_ids: string[] # optional - specific update group IDs to include, defaults to all related to the workflow deployment_ids: string[] # optional - specific deployment IDs to include, defaults to all related to the workflow # instead of using message and the builds, updates, and deployments table, you can also override the comment contents with `payload` custom_github_comment: type: github-comment params: payload: string # optional - raw markdown/HTML content for fully custom comment
Parameters
The job operates in two mutually exclusive modes:
Mode 1: Auto-with-overrides mode
Default behavior is auto discovery builds and updates, you can specify any of these parameters if you want to:
Auto-discovery behavior: When
build_ids,update_group_ids, ordeployment_idsare not specified (undefined), the job automatically discovers all relevant builds, updates, and deployments from the current workflow. To explicitly exclude builds, updates, or deployments, pass an empty array[].
Mode 2: Payload mode
When using payload mode, you cannot specify any other parameters.
Outputs
You can reference the following outputs in subsequent jobs:
Examples
Here are practical examples demonstrating both modes of the GitHub Comment job:
Auto-with-overrides mode examples
Auto-discover all builds, updates, and deployments
This is the simplest usage - automatically discovers and posts all builds, updates, and deployments from the workflow.
Custom message with auto-discovery
Adds a custom message while still auto-discovering all builds, updates, and deployments.
PR preview with EAS Hosting deployment
This workflow deploys a preview of your website using EAS Hosting and posts the deployment details to the pull request.
Specify exact builds and updates
Explicitly specify which builds and updates to include in the comment.
Exclude builds, updates, or deployments
Use empty arrays to exclude specific content types.
Payload mode examples
Fully custom comment with payload
Payload mode gives you complete control over the comment content. Note that when using payload, you cannot specify any other parameters.
Conditional comment based on build status
This workflow posts different comments based on whether the build succeeded or failed.
Apple device registration request
Pause a workflow run until an iOS device enrolls for a specific Apple team and a team member approves that enrollment on expo.dev. Use this job to automate registering a device for internal distribution inside EAS Workflows.
When the workflow reaches this job, the job and the run enter action-required and stay paused until the flow completes:
- The workflow run page shows a QR code and a registration link for the device being enrolled.
- On the iPhone or iPad, the device downloads a provisioning profile and installs it through Settings. Only one profile is ready at a time, and it is removed if not installed within eight minutes.
- After installation, the unique device identifier (UDID) and metadata are collected.
- On the workflow run page, a team member approves or rejects the enrollment. Approval marks the job successful and exposes outputs (UDID, model, and more) to downstream jobs. Rejection fails the job and blocks jobs that use
needs.
If the UDID is already registered on your account, the job still waits for enrollment and approval before continuing.
Syntax
jobs: register_device: type: apple-device-registration-request params: apple_team_identifier: string # optional
Parameters
You can pass the following parameters into the params list:
Outputs
After a team member approves the enrolled device, you can reference the following outputs in subsequent jobs:
If a team member rejects the enrollment, the job fails and does not set outputs. Downstream jobs that use needs will not run.
Examples
Here are some practical examples of using the Apple device registration request job:
Register a device and notify Slack
This workflow registers an iOS device and sends a Slack message with the device UDID and model from the job outputs.
Register a device, then run an internal iOS build
This workflow registers a device and then runs an iOS internal distribution build that refreshes the ad hoc provisioning profile so the new device is included.
The preview profile must set distribution: internal and use credentials managed by EAS. For CI, you also need an App Store Connect API key. See internal distribution on CI and trigger builds from CI.
Require Approval
Require approval from a user before continuing with the workflow. A user can approve or reject which translates to success or failure of the job.
Syntax
jobs: require_approval: type: require-approval
Parameters
This job doesn't take any parameters.
Examples
Here are some practical examples of using the Require Approval job:
Ask for approval before deploying to production
This workflow deploys a web app to preview and then requires approval from a user before deploying to production.
Control flow of the workflow
This workflow lets a user decide how the story ends by requiring approval before revealing the conclusion.
Doc
Displays a Markdown section in the workflow logs.
Syntax
jobs: show_whats_next: type: doc params: md: string
Parameters
You can pass the following parameters into the params list:
Examples
Here are some practical examples of using the Doc job:
Display instructions
This workflow builds an iOS app and then displays a Markdown section in the workflow logs.
Repack
Repackages an app from an existing build. This job repackages the app's metadata and JavaScript bundle without performing a full native rebuild, which is useful for creating a faster build compatible with a specific fingerprint.
Syntax
jobs: repack: type: repack runs_on: string # optional - see https://docs.expo.dev/build-reference/infrastructure/ for available options 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 - steps to run after the job checks out your project. before_install_node_modules: step[] # optional - steps to run before the job installs dependencies. after_install_node_modules: step[] # optional - steps to run after the job installs dependencies.
Note: If the build might still be in progress, use
get-buildwithwait_for_in_progress: true, then pass itsbuild_idtorepack.
Common questions
When to use and when not to use repack?
Repack job is suitable for the following use cases:
- Reducing CI build times by reusing existing builds
- Triggering full native builds when required
- Delivering faster feedback loops to your team
Repack job is not suitable for the following use cases:
- Production builds that require builds to go through the complete pipeline for correct symbolication and app signing
Parameters
You can pass the following parameters into the params list:
Hooks
The following hooks are supported for the Repack job:
after_checkout: steps to run after the job checks out your project.before_install_node_modules: steps to run before the job installs your project's dependencies.after_install_node_modules: steps to run after the job installs your project's dependencies.
See jobs.<job_id>.hooks for the general hooks syntax.
Examples
Here are some practical examples of using the Fingerprint with Repack jobs: