我正在通过 GitHub 操作和 EAS Build 为 React Native Expo 应用程序构建内部分发版本。使用
expo/expo-github-action@v7
在推送时触发工作流。构建完成后,操作会记录 2 个 URL(和 2 个 QR 码),其中可以下载 .apk
和 .ipa
:
我想以编程方式获取这些链接,以便我可以在下一步中使用它们来通知我的 Slack 频道,例如。
我查看了文档,但它非常通用。谁能帮忙?
在我的评论中发表:
动作提供serval输出你可以使用,例如:
输出 | 说明 |
---|---|
qr | QR 码的绝对 URL 以加载此更新 |
链接 | expo.dev 上独立于平台的更新的绝对 URL |
安卓QR | 用于加载此 Android 特定更新的 QR 代码的绝对 URL |
安卓链接 | expo.dev 上 Android 特定更新的绝对 URL |
iosQR | 用于加载此 iOS 特定更新的 QR 代码的绝对 URL |
ios链接 | expo.dev 上 iOS 特定更新的绝对 URL |
示例(来自文档):
- name: 🚀 Create preview
uses: expo/expo-github-action/preview@v8
id: preview
with:
command: eas update --auto
comment: false
- name: 💬 Comment in Slack
uses: slackapi/[email protected]
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_TOKEN }}
with:
channel-id: deployments
slack-message: 'New deployment is ready!\n- Preview: ${{ steps.preview.outputs.link }}'
我用“困难的方式”解决了这个问题,因为
expo-github-action
没有任何输出。
首先,我需要获取 JSON 格式的构建输出。我用
--json
开关这样做:
eas build --profile preview --platform all --non-interactive --json
其次,我将结果存储在一个变量中,如下所示:
build_json=$(eas build --profile preview --platform all --non-interactive --json)
接下来,我解析了 JSON 并从中提取了链接:
android_link=$(echo $build_json | jq -r '.[] | select(.platform=="ANDROID") | .artifacts.applicationArchiveUrl')
ios_link=$(echo $build_json | jq -r '.[] | select(.platform=="IOS") | .artifacts.applicationArchiveUrl')
最后,我将变量分配给输出:
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "build_json<<$EOF" >> $GITHUB_OUTPUT
echo "$build_json" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
echo "android_link=$android_link" >> $GITHUB_OUTPUT
echo "ios_link=$ios_link" >> $GITHUB_OUTPUT
请注意,GitHub Actions 用于创建输出的系统很脆弱,不能很好地处理顶点或换行符,因此在
build_json
的情况下,唯一安全的替代方法是使用随机分隔符而不是 <name>=<variable>
语法.
然后我可以将输出与
steps.<step id>.outputs.android_link
等一起使用
整体解决方案是这样的:
build_json=$(eas build --profile preview --platform all --non-interactive --json)
android_link=$(echo $build_json | jq -r '.[] | select(.platform=="ANDROID") | .artifacts.applicationArchiveUrl')
ios_link=$(echo $build_json | jq -r '.[] | select(.platform=="IOS") | .artifacts.applicationArchiveUrl')
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "build_json<<$EOF" >> $GITHUB_OUTPUT
echo "$build_json" >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
echo "android_link=$android_link" >> $GITHUB_OUTPUT
echo "ios_link=$ios_link" >> $GITHUB_OUTPUT
希望它能帮助下一个人节省一天左右的调查时间!