`eas workflow:validate` fails on `slack` job type when `webhook_url` uses a template expression
- Dominant language
- TypeScript
- Stars
- 1.4k
- Forks
- 236
- Avg merge
- 3d 1h
- Merged PRs (30d)
- 91
Description
### Build/Submit details page URL
_No response_
### Summary
`eas workflow:validate` rejects valid `slack` job configurations when `webhook_url` uses a `${{ }}` template expression (e.g. `${{ env.SLACK_WEBHOOK_URL }}`). The same workflow validates successfully server-side and runs correctly on EAS.
The workflow JSON schema at `https://api.expo.dev/v2/workflows/schema` defines `webhook_url` as:
```json
{
"type": "string",
"format": "uri"
}
```
The `format: "uri"` constraint is applied to the raw YAML value before template expressions are resolved. `${{ env.SLACK_WEBHOOK_URL }}` is not a valid URI, so it fails format validation. Since the `slack` params use an `anyOf` schema (message variant vs. payload variant), the `webhook_url` format failure causes neither variant to match, and the validator falls through to try every other job type, producing a large and confusing error cascade.
### Managed or bare?
Managed
### Environment
```
expo-env-info 2.0.8 environment info:
System:
OS: macOS 15.7.3
Shell: 5.9 - /bin/zsh
Binaries:
Node: 24.13.0 - ~/.local/state/fnm_multishells/84465_1770958971575/bin/node
Yarn: 4.12.0 - ~/.local/state/fnm_multishells/84465_1770958971575/bin/yarn
npm: 11.6.2 - ~/.local/state/fnm_multishells/84465_1770958971575/bin/npm
Watchman: 2026.01.12.00 - /opt/homebrew/bin/watchman
Managers:
CocoaPods: 1.16.2 - /Users/chris/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms: DriverKit 25.0, iOS 26.0, macOS 26.0, tvOS 26.0, visionOS 26.0, watchOS 26.0
IDEs:
Android Studio: 2025.1 AI-251.26094.121.2513.14007798
Xcode: 26.0.1/17A400 - /usr/bin/xcodebuild
npmPackages:
babel-preset-expo: ~54.0.0 => 54.0.3
expo: ~54.0.0 => 54.0.12
expo-updates: ~29.0.16 => 29.0.16
react: 19.1.0 => 19.1.0
react-native: 0.81.5 => 0.81.5
npmGlobalPackages:
eas-cli: 18.0.1
Expo Workflow: bare
```
### Error output
(truncated)
```
$ eas workflow:validate .eas/workflows/slack-repro.yml
✖ Workflow configuration YAML is not valid.
Error: The value at /jobs/notify/type must be equal to constant.
The value at /jobs/notify/params is missing the required field 'platform'.
The value at /jobs/notify/params has an unexpected property, webhook_url, which is not in the list of allowed properties (platform, profile, message).
The value at /jobs/notify is missing the required field 'steps'.
...
The value at /jobs/notify/params/webhook_url must be a valid URI string but it was not.
...
The value at /jobs/notify must match a schema in anyOf.
```
### Reproducible demo or steps to reproduce from a blank project
```yaml
name: Slack Repro
on:
workflow_dispatch: {}
jobs:
notify:
name: Notify
type: slack
environment: preview
params:
webhook_url: ${{ env.SLACK_WEBHOOK_URL }}
message: "Hello world"
```
Contributor guide
Assessment
This issue has not been assessed yet.