diff --git a/.github/workflows/build-app.yml b/.github/workflows/build-app.yml new file mode 100644 index 0000000000..7fad64b118 --- /dev/null +++ b/.github/workflows/build-app.yml @@ -0,0 +1,189 @@ +name: Build App + +on: + workflow_call: + inputs: + app-type: + description: 'App type (Parent, Student, or Teacher)' + required: true + type: string + app-type-lower: + description: 'App type in lowercase (parent, student, or teacher)' + required: true + type: string + firebase-app-id-secret: + description: 'Name of the Firebase App ID secret' + required: true + type: string + secrets: + ACCESS_TOKEN: + required: true + ANDROID_RELEASE_KEYSTORE_B64: + required: true + FIREBASE_SERVICE_ACCOUNT_KEY: + required: true + FIREBASE_APP_ID: + required: true + +jobs: + build: + name: ${{ inputs.app-type-lower }}-build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: 'recursive' + fetch-depth: 1 + token: ${{ secrets.ACCESS_TOKEN }} + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Cache Gradle packages + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Cache Gradle Build Cache + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches/build-cache-* + .gradle + key: ${{ runner.os }}-gradle-build-cache-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-gradle-build-cache- + + - name: Decode Release Keystore + run: | + echo "${{ secrets.ANDROID_RELEASE_KEYSTORE_B64 }}" | base64 --decode > release.jks + chmod 600 release.jks + + - name: Setup Service account + env: + FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }} + run: | + if [ -z "${FIREBASE_SERVICE_ACCOUNT_KEY}" ]; then + echo "Error: Firebase service account key is not configured" + exit 1 + fi + echo "${FIREBASE_SERVICE_ACCOUNT_KEY}" > service-account-key.json + chmod 600 service-account-key.json + + - name: Build Release Notes + id: get_release_notes + run: | + echo "RELEASE_NOTES<> $GITHUB_OUTPUT + echo "${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Install Firebase CLI + run: npm install -g firebase-tools + + - name: Setup Firebase App Id + run: | + if [ -z "${{ secrets.FIREBASE_APP_ID }}" ]; then + echo "Error: Firebase App ID is not configured" + exit 1 + fi + echo "${{ secrets.FIREBASE_APP_ID }}" > firebase_app_id.txt + + - name: Build debug and test APKs + run: | + ./gradle/gradlew -p apps :${{ inputs.app-type-lower }}:assembleQaDebug \ + :${{ inputs.app-type-lower }}:assembleQaDebugAndroidTest \ + :${{ inputs.app-type-lower }}:assembleDevDebugMinify \ + --build-cache \ + --parallel \ + --max-workers=4 \ + --no-daemon \ + -Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \ + -Dkotlin.compiler.execution.strategy=in-process \ + -Pandroid.injected.signing.store.file=$(pwd)/release.jks + + - name: Upload QA debug APK + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.app-type-lower }}-qa-debug.apk + path: apps/${{ inputs.app-type-lower }}/build/outputs/apk/qa/debug/${{ inputs.app-type-lower }}-qa-debug.apk + + - name: Upload QA test APK + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.app-type-lower }}-qa-debug-androidTest.apk + path: apps/${{ inputs.app-type-lower }}/build/outputs/apk/androidTest/qa/debug/${{ inputs.app-type-lower }}-qa-debug-androidTest.apk + + - name: Upload Dev debug APK + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.app-type-lower }}-dev-debugMinify.apk + path: apps/${{ inputs.app-type-lower }}/build/outputs/apk/dev/debugMinify/${{ inputs.app-type-lower }}-dev-debugMinify.apk + + - name: Distribute app to Firebase App Distribution + env: + GOOGLE_APPLICATION_CREDENTIALS: ${{ github.workspace }}/service-account-key.json + run: | + firebase --version + FIREBASE_APP_ID="$(cat firebase_app_id.txt)" + + if ! firebase appdistribution:distribute "apps/${{ inputs.app-type-lower }}/build/outputs/apk/dev/debugMinify/${{ inputs.app-type-lower }}-dev-debugMinify.apk" \ + --app "$FIREBASE_APP_ID" \ + --release-notes "${{ steps.get_release_notes.outputs.RELEASE_NOTES }}" \ + --groups "Testers" > result.txt 2>&1; then + echo "Firebase distribution failed:" + cat result.txt + exit 1 + fi + cat result.txt + + - name: Prepare Comment Body + id: prepare_comment + run: | + INSTALL_URL=$(grep -o 'https://appdistribution\.firebase[^[:space:]]*' result.txt | head -1) + + if [ -z "$INSTALL_URL" ]; then + echo "Error: Could not extract install URL from Firebase output" + cat result.txt + exit 1 + fi + + INSTALL_URL_ESCAPED=$(printf '%s' "$INSTALL_URL" | sed 's/:/%3A/g; s/\//%2F/g; s/?/%3F/g; s/=/%3D/g; s/&/%26/g') + { + echo "body<" + echo "

${{ inputs.app-type }} Install Page

" + echo "EOF" + } >> $GITHUB_OUTPUT + + - name: Find Previous Comment + id: find_comment + uses: peter-evans/find-comment@v2 + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: '' + + - name: Create or Update Comment + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.find_comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: ${{ steps.prepare_comment.outputs.body }} + edit-mode: replace + + - name: Cleanup sensitive files + if: always() + run: | + rm -f release.jks + rm -f service-account-key.json + rm -f firebase_app_id.txt + rm -f result.txt diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index d756544331..13fa64b9d2 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -58,21 +58,23 @@ jobs: This is an update to an existing PR. You must: 1. Use the GitHub MCP tools to fetch your previous reviews on this PR 2. Fetch the latest PR diff and identify what has changed since your last review - 3. Update your EXISTING review comments - DO NOT create a new review summary - 4. Use checkboxes to track progress on previously identified issues: - - [ ] Unresolved issue - - [x] Resolved issue - 5. For each previously identified issue: - - If it has been addressed: Mark the checkbox as complete [x] and add a note - - If it is still present: Keep the checkbox unchecked [ ] - - If new issues are found: Add new checkboxes [ ] - 6. Update inline comments: - - Resolve or update threads that have been addressed - - Add new inline comments ONLY for new issues that require changes - - Do NOT add inline comments for positive changes or improvements - 7. Keep all positive feedback in the summary section only + 3. Find your previous review summary comment (the one that starts with "## PR Review Summary" or similar) + 4. Post a NEW PR comment (not a review) with an update status that includes: + - Reference to your previous review + - Progress update using checkboxes: + - [x] Previously identified issues that have been resolved + - [ ] Previously identified issues still present + - [ ] New issues found in this update + - Brief summary of what changed + - Any new concerns or positive feedback + 5. For inline review comments: + - Resolve threads where the issue has been fixed + - Update existing review comment threads if partially addressed + - Add new inline review comments ONLY for new issues that require changes + - Do NOT add inline comments for positive feedback + 6. DO NOT create a new review summary - only post a progress update comment - DO NOT create a new review from scratch. Update the existing one.' || ' + Use mcp__github__create_or_update_issue_comment to post the update.' || ' ## NEW REVIEW EVENT This is a new PR or initial review. You must: 1. Use the GitHub MCP tools to fetch the PR diff @@ -85,5 +87,5 @@ jobs: # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options - claude_args: '--allowedTools "mcp__github__create_pending_pull_request_review,mcp__github__add_comment_to_pending_review,mcp__github__submit_pending_pull_request_review,mcp__github__get_pull_request_diff,mcp__github__list_reviews,mcp__github__get_review,mcp__github__list_review_comments,mcp__github__update_review_comment,mcp__github__create_or_update_pull_request_review_comment"' + claude_args: '--allowedTools "mcp__github__create_pending_pull_request_review,mcp__github__add_comment_to_pending_review,mcp__github__submit_pending_pull_request_review,mcp__github__get_pull_request_diff,mcp__github__list_reviews,mcp__github__get_review,mcp__github__list_review_comments,mcp__github__update_review_comment,mcp__github__create_or_update_pull_request_review_comment,mcp__github__create_or_update_issue_comment,mcp__github__list_issue_comments,mcp__github__resolve_review_thread"' diff --git a/.github/workflows/pr-pipeline.yml b/.github/workflows/pr-pipeline.yml index 5faf5418c9..6d7b837445 100644 --- a/.github/workflows/pr-pipeline.yml +++ b/.github/workflows/pr-pipeline.yml @@ -11,232 +11,56 @@ concurrency: cancel-in-progress: true jobs: - build: - name: ${{ matrix.app-type-lower }}-build - runs-on: ubuntu-latest + parent-build: if: >- ( (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) - ) && ( - contains(github.event.pull_request.body, 'Parent') || - contains(github.event.pull_request.body, 'Student') || - contains(github.event.pull_request.body, 'Teacher') - ) - strategy: - fail-fast: true - matrix: - include: - - app-type: Parent - app-type-lower: parent - should_run: ${{ contains(github.event.pull_request.body, 'Parent') }} - - app-type: Student - app-type-lower: student - should_run: ${{ contains(github.event.pull_request.body, 'Student') }} - - app-type: Teacher - app-type-lower: teacher - should_run: ${{ contains(github.event.pull_request.body, 'Teacher') }} - steps: - - name: Dump Pull Request Event Context - run: | - echo "body: ${{ github.event.pull_request.body }}" - echo "${{ toJson(github.event.pull_request) }}" - - - name: Checkout repository - if: ${{ matrix.should_run }} - uses: actions/checkout@v4 - with: - submodules: 'recursive' - fetch-depth: 1 - token: ${{ secrets.ACCESS_TOKEN }} - - - name: Set up JDK 17 - if: ${{ matrix.should_run }} - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - - name: Cache Gradle packages - if: ${{ matrix.should_run }} - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Cache Gradle Build Cache - if: ${{ matrix.should_run }} - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches/build-cache-* - .gradle - key: ${{ runner.os }}-gradle-build-cache-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-gradle-build-cache- - - - name: Decode Release Keystore - if: ${{ matrix.should_run }} - run: | - echo "${{ secrets.ANDROID_RELEASE_KEYSTORE_B64 }}" | base64 --decode > release.jks - chmod 600 release.jks - - - name: Setup Service account - if: ${{ matrix.should_run }} - env: - FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }} - run: | - if [ -z "${FIREBASE_SERVICE_ACCOUNT_KEY}" ]; then - echo "Error: FIREBASE_SERVICE_ACCOUNT_KEY is not set" - exit 1 - fi - echo "${FIREBASE_SERVICE_ACCOUNT_KEY}" > service-account-key.json - chmod 600 service-account-key.json - - - name: Build Release Notes - if: ${{ matrix.should_run }} - id: get_release_notes - run: | - echo "RELEASE_NOTES<> $GITHUB_OUTPUT - echo "${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - - name: Install Firebase CLI - if: ${{ matrix.should_run }} - run: npm install -g firebase-tools - - - name: Setup Parent Firebase App Id - if: ${{ matrix.should_run && matrix.app-type == 'Parent' }} - run: | - if [ -z "${{ secrets.FIREBASE_ANDROID_PARENT_APP_ID }}" ]; then - echo "Error: FIREBASE_ANDROID_PARENT_APP_ID is not set" - exit 1 - fi - echo "${{ secrets.FIREBASE_ANDROID_PARENT_APP_ID }}" > firebase_app_id.txt - - - name: Setup Student Firebase App Id - if: ${{ matrix.should_run && matrix.app-type == 'Student' }} - run: | - if [ -z "${{ secrets.FIREBASE_ANDROID_STUDENT_APP_ID }}" ]; then - echo "Error: FIREBASE_ANDROID_STUDENT_APP_ID is not set" - exit 1 - fi - echo "${{ secrets.FIREBASE_ANDROID_STUDENT_APP_ID }}" > firebase_app_id.txt - - - name: Setup Teacher Firebase App Id - if: ${{ matrix.should_run && matrix.app-type == 'Teacher' }} - run: | - if [ -z "${{ secrets.FIREBASE_ANDROID_TEACHER_APP_ID }}" ]; then - echo "Error: FIREBASE_ANDROID_TEACHER_APP_ID is not set" - exit 1 - fi - echo "${{ secrets.FIREBASE_ANDROID_TEACHER_APP_ID }}" > firebase_app_id.txt - - # Building Artifacts - - name: Build debug and test APKs - if: ${{ matrix.should_run }} - run: | - ./gradle/gradlew -p apps :${{ matrix.app-type-lower }}:assembleQaDebug \ - :${{ matrix.app-type-lower }}:assembleQaDebugAndroidTest \ - :${{ matrix.app-type-lower }}:assembleDevDebugMinify \ - --build-cache \ - --parallel \ - --max-workers=4 \ - --no-daemon \ - -Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \ - -Dkotlin.compiler.execution.strategy=in-process \ - -Pandroid.injected.signing.store.file=$(pwd)/release.jks - - # Uploading Artifacts to GitHub - - name: Upload QA debug APK - if: ${{ matrix.should_run }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.app-type-lower }}-qa-debug.apk - path: apps/${{ matrix.app-type-lower }}/build/outputs/apk/qa/debug/${{ matrix.app-type-lower }}-qa-debug.apk - - - name: Upload QA test APK - if: ${{ matrix.should_run }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.app-type-lower }}-qa-debug-androidTest.apk - path: apps/${{ matrix.app-type-lower }}/build/outputs/apk/androidTest/qa/debug/${{ matrix.app-type-lower }}-qa-debug-androidTest.apk - - - name: Upload Dev debug APK - if: ${{ matrix.should_run }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.app-type-lower }}-dev-debugMinify.apk - path: apps/${{ matrix.app-type-lower }}/build/outputs/apk/dev/debugMinify/${{ matrix.app-type-lower }}-dev-debugMinify.apk - - # Uploading Artifacts to Firebase App Distribution - - name: Distribute app to Firebase App Distribution - if: ${{ matrix.should_run }} - env: - GOOGLE_APPLICATION_CREDENTIALS: ${{ github.workspace }}/service-account-key.json - run: | - firebase --version - FIREBASE_APP_ID=$(cat firebase_app_id.txt) - - if ! firebase appdistribution:distribute "apps/${{ matrix.app-type-lower }}/build/outputs/apk/dev/debugMinify/${{ matrix.app-type-lower }}-dev-debugMinify.apk" \ - --app "$FIREBASE_APP_ID" \ - --release-notes "${{ steps.get_release_notes.outputs.RELEASE_NOTES }}" \ - --groups "Testers" > result.txt 2>&1; then - echo "Firebase distribution failed:" - cat result.txt - exit 1 - fi - cat result.txt - - - name: Prepare Comment Body - if: ${{ matrix.should_run }} - id: prepare_comment - run: | - INSTALL_URL=$(grep -o 'https://appdistribution\.firebase[^[:space:]]*' result.txt | head -1) - - if [ -z "$INSTALL_URL" ]; then - echo "Error: Could not extract install URL from Firebase output" - cat result.txt - exit 1 - fi - - INSTALL_URL_ESCAPED=$(printf '%s' "$INSTALL_URL" | sed 's/:/%3A/g; s/\//%2F/g; s/?/%3F/g; s/=/%3D/g; s/&/%26/g') - { - echo "body<" - echo "

${{ matrix.app-type }} Install Page

" - echo "EOF" - } >> $GITHUB_OUTPUT - - - name: Find Previous Comment - if: ${{ matrix.should_run }} - id: find_comment - uses: peter-evans/find-comment@v2 - with: - issue-number: ${{ github.event.number }} - comment-author: 'github-actions[bot]' - body-includes: '' - - - name: Create or Update Comment - if: ${{ matrix.should_run }} - uses: peter-evans/create-or-update-comment@v4 - with: - comment-id: ${{ steps.find_comment.outputs.comment-id }} - issue-number: ${{ github.event.number }} - body: ${{ steps.prepare_comment.outputs.body }} - edit-mode: replace - - - name: Cleanup sensitive files - if: always() && matrix.should_run - run: | - rm -f release.jks - rm -f service-account-key.json - rm -f firebase_app_id.txt - rm -f result.txt + ) && contains(github.event.pull_request.body, 'Parent') + uses: ./.github/workflows/build-app.yml + with: + app-type: Parent + app-type-lower: parent + firebase-app-id-secret: FIREBASE_ANDROID_PARENT_APP_ID + secrets: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + ANDROID_RELEASE_KEYSTORE_B64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_B64 }} + FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }} + FIREBASE_APP_ID: ${{ secrets.FIREBASE_ANDROID_PARENT_APP_ID }} + + student-build: + if: >- + ( + (github.event.action == 'opened' || github.event.action == 'synchronize') || + (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) + ) && contains(github.event.pull_request.body, 'Student') + uses: ./.github/workflows/build-app.yml + with: + app-type: Student + app-type-lower: student + firebase-app-id-secret: FIREBASE_ANDROID_STUDENT_APP_ID + secrets: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + ANDROID_RELEASE_KEYSTORE_B64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_B64 }} + FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }} + FIREBASE_APP_ID: ${{ secrets.FIREBASE_ANDROID_STUDENT_APP_ID }} + + teacher-build: + if: >- + ( + (github.event.action == 'opened' || github.event.action == 'synchronize') || + (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) + ) && contains(github.event.pull_request.body, 'Teacher') + uses: ./.github/workflows/build-app.yml + with: + app-type: Teacher + app-type-lower: teacher + firebase-app-id-secret: FIREBASE_ANDROID_TEACHER_APP_ID + secrets: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + ANDROID_RELEASE_KEYSTORE_B64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_B64 }} + FIREBASE_SERVICE_ACCOUNT_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_KEY }} + FIREBASE_APP_ID: ${{ secrets.FIREBASE_ANDROID_TEACHER_APP_ID }} submodule-build-and-test: name: submodule-build-and-test @@ -432,7 +256,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Parent') - needs: [build, parent-unit-tests] + needs: [parent-build, parent-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -503,7 +327,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Parent') - needs: [build, parent-unit-tests] + needs: [parent-build, parent-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -574,7 +398,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Student') - needs: [build, student-unit-tests] + needs: [student-build, student-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -645,7 +469,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Student') - needs: [build, student-unit-tests] + needs: [student-build, student-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -716,7 +540,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Teacher') - needs: [build, teacher-unit-tests] + needs: [teacher-build, teacher-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -787,7 +611,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Teacher') - needs: [build, teacher-unit-tests] + needs: [teacher-build, teacher-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -858,7 +682,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Parent') && contains(github.event.pull_request.body, 'Run E2E test suite') - needs: [build, parent-unit-tests] + needs: [parent-build, parent-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -929,7 +753,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Student') && contains(github.event.pull_request.body, 'Run E2E test suite') - needs: [build, student-unit-tests] + needs: [student-build, student-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -1000,7 +824,7 @@ jobs: (github.event.action == 'opened' || github.event.action == 'synchronize') || (github.event.action == 'labeled' && (contains(github.event.pull_request.labels.*.name, 'run-ui-tests') || contains(github.event.pull_request.labels.*.name, 'run-e2e-tests'))) ) && contains(github.event.pull_request.body, 'Teacher') && contains(github.event.pull_request.body, 'Run E2E test suite') - needs: [build, teacher-unit-tests] + needs: [teacher-build, teacher-unit-tests] steps: - name: Checkout repository uses: actions/checkout@v4