8686 # Run the full CI check suite
8787 just ci-checks
8888
89+ - name : Install Playwright browsers
90+ if : steps.update.outputs.needs_update == 'true'
91+ working-directory : packages/opencode/packages/app
92+ run : bunx playwright install --with-deps
93+ env :
94+ PLAYWRIGHT_BROWSERS_PATH : ${{ github.workspace }}/.cache/ms-playwright
95+
96+ - name : Run e2e tests
97+ id : e2e_checks
98+ if : steps.update.outputs.needs_update == 'true'
99+ working-directory : packages/opencode/packages/app
100+ run : bun test:e2e:local -- --workers=2
101+ env :
102+ CI : " true"
103+ OPENCODE_DISABLE_MODELS_FETCH : " true"
104+ OPENCODE_MODELS_PATH : ${{ github.workspace }}/packages/opencode/test/tool/fixtures/models-api.json
105+ PLAYWRIGHT_BROWSERS_PATH : ${{ github.workspace }}/.cache/ms-playwright
106+ timeout-minutes : 30
107+
89108 - name : Verify OCI description label
90109 id : verify_oci
91110 run : python3 scripts/extract-oci-description.py packages/core/src/docker/Dockerfile
@@ -119,6 +138,7 @@ jobs:
119138 env :
120139 UPDATE_OUTCOME : ${{ steps.update.outcome }}
121140 CI_CHECKS_OUTCOME : ${{ steps.ci_checks.outcome }}
141+ E2E_CHECKS_OUTCOME : ${{ steps.e2e_checks.outcome }}
122142 VERIFY_OCI_OUTCOME : ${{ steps.verify_oci.outcome }}
123143 COMMIT_PUSH_OUTCOME : ${{ steps.commit_push.outcome }}
124144 SUBMODULE_BRANCH : ${{ steps.update.outputs.submodule_branch }}
@@ -167,7 +187,7 @@ jobs:
167187 fi
168188
169189 status_line="ℹ️ No update needed"
170- if [[ "${UPDATE_OUTCOME:-}" == "failure" || "${CI_CHECKS_OUTCOME:-}" == "failure" || "${VERIFY_OCI_OUTCOME:-}" == "failure" || "${COMMIT_PUSH_OUTCOME:-}" == "failure" || "${UPDATE_OUTCOME:-}" == "cancelled" || "${CI_CHECKS_OUTCOME:-}" == "cancelled" || "${VERIFY_OCI_OUTCOME:-}" == "cancelled" || "${COMMIT_PUSH_OUTCOME:-}" == "cancelled" ]]; then
190+ if [[ "${UPDATE_OUTCOME:-}" == "failure" || "${CI_CHECKS_OUTCOME:-}" == "failure" || "${E2E_CHECKS_OUTCOME:-}" == "failure" || "${ VERIFY_OCI_OUTCOME:-}" == "failure" || "${COMMIT_PUSH_OUTCOME:-}" == "failure" || "${UPDATE_OUTCOME:-}" == "cancelled" || "${CI_CHECKS_OUTCOME:-}" == "cancelled" || "${E2E_CHECKS_OUTCOME :-}" == "cancelled" || "${VERIFY_OCI_OUTCOME:-}" == "cancelled" || "${COMMIT_PUSH_OUTCOME:-}" == "cancelled" ]]; then
171191 status_line="❌ Failed"
172192 elif [[ "${PUSHED:-}" == "true" ]]; then
173193 status_line="✅ Updated and pushed"
@@ -207,12 +227,13 @@ jobs:
207227 echo "**Step outcomes:**"
208228 echo "- update: \`${UPDATE_OUTCOME:-n/a}\`"
209229 echo "- ci_checks: \`${CI_CHECKS_OUTCOME:-n/a}\`"
230+ echo "- e2e_checks: \`${E2E_CHECKS_OUTCOME:-n/a}\`"
210231 echo "- verify_oci: \`${VERIFY_OCI_OUTCOME:-n/a}\`"
211232 echo "- commit_push: \`${COMMIT_PUSH_OUTCOME:-n/a}\`"
212233 } >> "${GITHUB_STEP_SUMMARY}"
213234
214235 - name : Create issue on CI failure
215- if : failure() && steps.ci_checks.outcome == 'failure'
236+ if : failure() && ( steps.ci_checks.outcome == 'failure' || steps.e2e_checks.outcome == 'failure')
216237 env :
217238 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
218239 LATEST_COMMIT : ${{ steps.update.outputs.latest_commit }}
@@ -225,11 +246,11 @@ jobs:
225246 commit_url="${SUBMODULE_REPO_URL:-}/commit/${LATEST_COMMIT:-unknown}"
226247 branch="${SUBMODULE_BRANCH:-dev}"
227248
228- body="## Automated submodule update failed CI checks
249+ body="## Automated submodule update failed CI/e2e checks
229250
230251 The [update-opencode-commit workflow](${run_url}) attempted to update the
231252 opencode submodule to [\`${commit_short}\`](${commit_url}) from the
232- \`${branch}\` branch, but \`just ci- checks\` failed after auto-formatting.
253+ \`${branch}\` branch, but checks failed after auto-formatting.
233254
234255 ### What to do
235256
@@ -238,6 +259,7 @@ jobs:
238259 - **TypeScript typecheck failure** in a fork-* package — fix in the opencode fork and push to \`dev\`
239260 - **Rust clippy/build failure** in opencode-broker — fix in the fork
240261 - **Formatting issue** that \`just fmt\` couldn't resolve — manual fix needed
262+ - **E2E test failure** — UI regression in the web app, check Playwright report
241263 3. After fixing, the next scheduled run (every 2 hours) will retry automatically
242264
243265 ### Context
0 commit comments