[Feat/#19] 모달 컴포넌트 #53
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PR CI Check | |
| on: | |
| pull_request: | |
| branches: [ develop, main ] | |
| permissions: | |
| contents: read | |
| issues: write | |
| pull-requests: write | |
| concurrency: | |
| group: pr-ci-${{ github.event.pull_request.number }} | |
| cancel-in-progress: true | |
| jobs: | |
| lint: | |
| name: PR CI Check (Lint & Build) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Check for Android changes | |
| uses: dorny/paths-filter@v3 | |
| id: changes | |
| with: | |
| filters: | | |
| android: | |
| - '**/*.kt' | |
| - '**/*.kts' | |
| - '**/*.xml' | |
| - '**/*.gradle' | |
| - '**/*.properties' | |
| - 'gradle/**' | |
| - 'buildSrc/**' | |
| - name: Gradle cache | |
| if: steps.changes.outputs.android == 'true' | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| ${{ runner.os }}-gradle- | |
| - name: Set up JDK 17 | |
| if: steps.changes.outputs.android == 'true' | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Grant permission to gradlew | |
| if: steps.changes.outputs.android == 'true' | |
| run: chmod +x ./gradlew | |
| - name: Create local.properties | |
| if: steps.changes.outputs.android == 'true' | |
| env: | |
| LOCAL_PROPERTIES: ${{ secrets.LOCAL_PROPERTIES }} | |
| run: | | |
| if [ -n "$LOCAL_PROPERTIES" ]; then | |
| echo "${LOCAL_PROPERTIES}" > local.properties | |
| else | |
| echo "poti.base.url=\"https://temp.example.com/\"" > local.properties | |
| fi | |
| - name: Run ktlintCheck | |
| if: steps.changes.outputs.android == 'true' | |
| id: ktlint | |
| continue-on-error: true | |
| run: ./gradlew ktlintCheck | |
| - name: Upload ktlint report | |
| if: steps.ktlint.outcome == 'failure' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ktlint-report | |
| path: '**/build/reports/ktlint/' | |
| retention-days: 7 | |
| - name: Comment PR on ktlint failure | |
| if: steps.ktlint.outcome == 'failure' | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const marker = "<!-- CI:KTLINT -->"; | |
| const body = | |
| `${marker}\n` + | |
| `❌ **Ktlint check failed!**\n\n` + | |
| `Please fix the code style issues:\n` + | |
| "```bash\n" + | |
| "./gradlew ktlintFormat\n" + | |
| "```"; | |
| const { owner, repo } = context.repo; | |
| const issue_number = context.issue.number; | |
| const comments = await github.paginate( | |
| github.rest.issues.listComments, | |
| { owner, repo, issue_number, per_page: 100 } | |
| ); | |
| const existing = comments.find(c => | |
| c?.body?.includes(marker) && c?.user?.login === "github-actions[bot]" | |
| ); | |
| if (existing) { | |
| await github.rest.issues.deleteComment({ | |
| owner, repo, | |
| comment_id: existing.id | |
| }); | |
| } | |
| await github.rest.issues.createComment({ | |
| owner, repo, | |
| issue_number, | |
| body | |
| }); | |
| - name: Fail job if ktlint failed | |
| if: steps.ktlint.outcome == 'failure' | |
| run: exit 1 | |
| - name: Mark ktlint comment as resolved | |
| if: steps.ktlint.outcome == 'success' | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const marker = "<!-- CI:KTLINT -->"; | |
| const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; | |
| const body = | |
| `${marker}\n` + | |
| `✅ **Ktlint check passed.**\n\n` + | |
| `Run: ${runUrl}`; | |
| const { owner, repo } = context.repo; | |
| const issue_number = context.issue.number; | |
| const comments = await github.paginate( | |
| github.rest.issues.listComments, | |
| { owner, repo, issue_number, per_page: 100 } | |
| ); | |
| const existing = comments.find(c => | |
| c?.body?.includes(marker) && c?.user?.login === "github-actions[bot]" | |
| ); | |
| if (existing) { | |
| await github.rest.issues.updateComment({ | |
| owner, repo, | |
| comment_id: existing.id, | |
| body | |
| }); | |
| } | |
| - name: Build Debug APK | |
| id: build | |
| if: steps.changes.outputs.android == 'true' && steps.ktlint.outcome == 'success' | |
| continue-on-error: true | |
| run: ./gradlew :app:assembleDebug | |
| - name: Comment PR on build failure | |
| if: steps.build.outcome == 'failure' | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const marker = "<!-- CI:BUILD -->"; | |
| const body = | |
| `${marker}\n` + | |
| `🔥 **Build Failed!**\n\n` + | |
| `The project build has failed.\n` + | |
| `Please check the error logs and try again.\n` + | |
| "```bash\n" + | |
| "./gradlew :app:assembleDebug\n" + | |
| "```"; | |
| const { owner, repo } = context.repo; | |
| const issue_number = context.issue.number; | |
| const comments = await github.paginate( | |
| github.rest.issues.listComments, | |
| { owner, repo, issue_number, per_page: 100 } | |
| ); | |
| const existing = comments.find(c => | |
| c?.body?.includes(marker) && c?.user?.login === "github-actions[bot]" | |
| ); | |
| if (existing) { | |
| await github.rest.issues.deleteComment({ | |
| owner, repo, | |
| comment_id: existing.id | |
| }); | |
| } | |
| await github.rest.issues.createComment({ | |
| owner, repo, | |
| issue_number, | |
| body | |
| }); | |
| - name: Mark build comment as resolved | |
| if: steps.build.outcome == 'success' | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const marker = "<!-- CI:BUILD -->"; | |
| const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; | |
| const body = | |
| `${marker}\n` + | |
| `✅ **Build passed.**\n\n` + | |
| `Run: ${runUrl}`; | |
| const { owner, repo } = context.repo; | |
| const issue_number = context.issue.number; | |
| const comments = await github.paginate( | |
| github.rest.issues.listComments, | |
| { owner, repo, issue_number, per_page: 100 } | |
| ); | |
| const existing = comments.find(c => | |
| c?.body?.includes(marker) && c?.user?.login === "github-actions[bot]" | |
| ); | |
| if (existing) { | |
| await github.rest.issues.updateComment({ | |
| owner, repo, | |
| comment_id: existing.id, | |
| body | |
| }); | |
| } | |
| - name: Fail job if build failed | |
| if: steps.build.outcome == 'failure' | |
| run: exit 1 |