diff --git a/.circleci/config.yml b/.circleci/config.yml index 1c5d91c0..995110be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -186,7 +186,7 @@ jobs: git add -f $file done - $(date +%s) >> timestamp + echo $(date +%s) >> timestamp git add timestamp git commit -m "Add screenshot diff" diff --git a/.github/workflows_disable/SaveScreenshot.yml b/.github/workflows_disable/SaveScreenshot.yml index ef6b6a05..bdd79786 100644 --- a/.github/workflows_disable/SaveScreenshot.yml +++ b/.github/workflows_disable/SaveScreenshot.yml @@ -1,68 +1,68 @@ ## ref: https://github.com/kosenda/hiragana-converter/blob/develop/REFERENCE.md -# -#name: SaveScreenshot -# -#on: -# pull_request: -# types: -# - closed -# paths-ignore: -# - README.md -# -#jobs: -# save-screenshot: -# if: github.event.pull_request.merged == true -# runs-on: ubuntu-latest -# steps: -# - name: Checkout sources -# uses: actions/checkout@v4 -# -# - name: Setup -# uses: ./.github/actions/setup -# with: -# api-key: ${{ secrets.API_KEY }} -# -# - name: create screenshots -# run: ./gradlew recordRoborazziProdDebug --stacktrace -# -# - name: Upload screenshots -# uses: actions/upload-artifact@v4 -# with: -# name: screenshots -# path: ./app/build/outputs/roborazzi/ -# retention-days: 1 -# -# - name: Save screenshots branch name -# run: echo "SCREENSHOTS_BRANCH_NAME=screenshots_${{ github.base_ref }}" >> $GITHUB_ENV -# -# - name: Checkout main branch -# uses: actions/checkout@v4 -# with: -# ref: main -# -# - name: Checkout screenshots branch -# run: | -# git branch -D ${{ env.SCREENSHOTS_BRANCH_NAME }} || true -# git checkout --orphan ${{ env.SCREENSHOTS_BRANCH_NAME }} -# git rm -rf . -# mkdir -p ./app/build/outputs/roborazzi -# -# - name: Download screenshots -# uses: actions/download-artifact@v4 -# with: -# name: screenshots -# path: ./app/build/outputs/roborazzi/ -# -# - name: Push screenshots to screenshots branch -# id: push-screenshot-diff -# run: | -# git add -A -# git config --global user.name ScreenshotBot -# git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com -# git commit -m "Add screenshots" -# git push origin HEAD:${{ env.SCREENSHOTS_BRANCH_NAME }} -f -# -# - name: Checkout pr branch -# uses: actions/checkout@v4 -# with: -# ref: ${{ github.event.workflow_run.head_branch }} \ No newline at end of file + +name: SaveScreenshot + +on: + pull_request: + types: + - closed + paths-ignore: + - README.md + +jobs: + save-screenshot: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + with: + api-key: ${{ secrets.API_KEY }} + + - name: create screenshots + run: ./gradlew recordRoborazziProdDebug --stacktrace + + - name: Upload screenshots + uses: actions/upload-artifact@v4 + with: + name: screenshots + path: ./app/build/outputs/roborazzi/ + retention-days: 1 + + - name: Save screenshots branch name + run: echo "SCREENSHOTS_BRANCH_NAME=screenshots_${{ github.base_ref }}" >> $GITHUB_ENV + + - name: Checkout main branch + uses: actions/checkout@v4 + with: + ref: main + + - name: Checkout screenshots branch + run: | + git branch -D ${{ env.SCREENSHOTS_BRANCH_NAME }} || true + git checkout --orphan ${{ env.SCREENSHOTS_BRANCH_NAME }} + git rm -rf . + mkdir -p ./app/build/outputs/roborazzi + + - name: Download screenshots + uses: actions/download-artifact@v4 + with: + name: screenshots + path: ./app/build/outputs/roborazzi/ + + - name: Push screenshots to screenshots branch + id: push-screenshot-diff + run: | + git add -A + git config --global user.name ScreenshotBot + git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + git commit -m "Add screenshots" + git push origin HEAD:${{ env.SCREENSHOTS_BRANCH_NAME }} -f + + - name: Checkout pr branch + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }} \ No newline at end of file diff --git a/.github/workflows_disable/Test.yml b/.github/workflows_disable/Test.yml index 14be3455..c43bf755 100644 --- a/.github/workflows_disable/Test.yml +++ b/.github/workflows_disable/Test.yml @@ -1,274 +1,274 @@ ## ref: https://github.com/kosenda/hiragana-converter/blob/develop/REFERENCE.md -# -#name: Test -# -#on: -# pull_request: -# paths-ignore: -# - README.md -# types: [ opened, synchronize, reopened, closed ] -# -#concurrency: -# group: ${{ github.workflow }}-${{ github.ref }} -# cancel-in-progress: true -# -#permissions: -# contents: write -# actions: read -# pull-requests: write -#jobs: -# test-prod: -# runs-on: ubuntu-latest -# steps: -# - name: Checkout sources -# uses: actions/checkout@v4 -# with: -# # ref: https://github.com/danger/danger/issues/913 -# fetch-depth: 100 -# -# - name: Setup -# uses: ./.github/actions/setup -# with: -# api-key: ${{ secrets.API_KEY }} -# -# - name: ktlint-check -# run: ./gradlew --continue ktlintCheck -# -# - name: Test ProdDebug -# run: ./gradlew testProdDebugUnitTest -# -# - name: Report jacoco -# run: ./gradlew jacocoTestReport -# -# - name: jacoco-report to zip -# run: zip -r jacocoTestReport.zip ./build/reports/jacoco/jacocoTestReport/html -# -# - name: Archive jacoco report -# uses: actions/upload-artifact@v4 -# with: -# name: jacocoTestReport -# path: ./build/reports/jacoco/jacocoTestReport/html -# -# - name: Setup Ruby -# uses: ruby/setup-ruby@v1 -# with: -# ruby-version: 3.2.2 -# bundler-cache: true -# -# - name: Danger -# uses: MeilCli/danger-action@v5 -# with: -# plugins_file: Gemfile -# install_path: vendor/bundle -# danger_file: Dangerfile -# danger_id: danger-pr -# env: -# DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }} -# -# - name: Slack notify -# uses: ./.github/actions/incoming-webhook -# with: -# slack-webhook-url: ${{ secrets.SLACK_INCOMING_WEBHOOK_URL }} -# -# compile-mock: -# runs-on: ubuntu-latest -# steps: -# - name: Checkout sources -# uses: actions/checkout@v4 -# -# - name: Setup -# uses: ./.github/actions/setup -# with: -# api-key: ${{ secrets.API_KEY }} -# -# - name: Compile MockDebug -# run: ./gradlew compileMockDebugSource -# -# compare-screnshots: -# if: github.event.pull_request.merged == false && github.event_name == 'pull_request' -# runs-on: ubuntu-latest -# steps: -# - name: Checkout sources -# uses: actions/checkout@v4 -# -# - name: Check exist screenshots branch -# id: check-exist-screenshots -# run: | -# echo is_exist=$( -# git fetch origin screenshots_${{ github.base_ref }} && -# echo true || echo false -# ) >> "$GITHUB_OUTPUT" -# -# - name: Checkout screenshots branch -# if: steps.check-exist-screenshots.outputs.is_exist == 'true' -# uses: actions/checkout@v4 -# with: -# ref: screenshots_${{ github.base_ref }} -# -# - name: Make screenshots directory -# run: mkdir -p ./app/build/outputs/roborazzi -# -# - name: Upload screenshots -# if: steps.check-exist-screenshots.outputs.is_exist == 'true' -# uses: actions/upload-artifact@v4 -# with: -# name: screenshots -# path: ./app/build/outputs/roborazzi/ -# retention-days: 1 -# -# - name: Checkout pr branch -# if: steps.check-exist-screenshots.outputs.is_exist == 'true' -# uses: actions/checkout@v4 -# with: -# ref: ${{ github.head_ref }} -# -# - name: Setup -# uses: ./.github/actions/setup -# with: -# api-key: ${{ secrets.API_KEY }} -# -# - name: Download screenshots from PR number directory -# continue-on-error: true -# uses: actions/download-artifact@v4 -# with: -# name: screenshots -# path: ./app/build/outputs/roborazzi/ -# -# - name: Compare screenshots -# run: ./gradlew compareRoborazziProdDebug --stacktrace -# -# - name: Check screenshot diff -# id: check-screenshot-diff -# run: | -# # To avoid "No such file or directory" -# mkdir -p ./app/build/outputs/roborazzi -# -# file_size=$(find ./app/build/outputs/roborazzi -type f | grep -e '.*_compare.png' | wc -l | sed -e 's/[^0-9]//g') -# is_exist_screenshot_diff="false" -# if [ $file_size -ne 0 ]; then -# echo "file_size=$file_size" -# is_exist_screenshot_diff="true" -# fi -# echo "is_exist=${is_exist_screenshot_diff}" >> "$GITHUB_OUTPUT" -# -# - name: Make PR number directory for saving screenshots -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# run: mkdir -p ./pr/${{ github.event.number }} -# -# - name: Move screenshots to PR number directory -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# run: | -# # delete except *_compare.png -# find ./app/build/outputs/roborazzi -type f | grep -v -e '.*_compare.png' | xargs rm -rf -# mv ./app/build/outputs/roborazzi ./pr/${{ github.event.number }}/ -# ls ./pr/${{ github.event.number }} -# -# - name: Save screenshots -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# uses: actions/upload-artifact@v4 -# with: -# name: pr directory -# path: pr/${{ github.event.number }}/ -# -# - name: Save pr number and branch name -# run: | -# echo "PR_NUMBER=${{ github.event.number }}" >> $GITHUB_ENV -# echo "COMPANION_BRANCH_NAME=companion_${{ github.head_ref }}" >> $GITHUB_ENV -# -# - name: Checkout main branch -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# uses: actions/checkout@v4 -# with: -# ref: main -# -# - name: Checkout companion branch -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# run: | -# git branch -D ${{ env.COMPANION_BRANCH_NAME }} || true -# git checkout --orphan ${{ env.COMPANION_BRANCH_NAME }} -# git rm -rf . -# -# - name: Download screenshots from PR number directory -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# uses: actions/download-artifact@v4 -# with: -# name: pr directory -# -# - name: Push screenshots to companion branch -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# id: push-screenshot-diff -# run: | -# files_to_add=$(find . -type f -name "*_compare.png") -# -# for file in $files_to_add; do -# if [[ $file =~ ^[a-zA-Z0-9_./-]+$ ]]; then -# git add $file -# fi -# done -# git config --global user.name ScreenshotBot -# git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com -# git commit -m "Add screenshot diff" -# git push origin HEAD:${{ env.COMPANION_BRANCH_NAME }} -f -# -# - name: Create comments -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# id: create-comments -# run: | -# files=$(find . -type f -name "*_compare.png") -# delimiter="$(openssl rand -hex 8)" -# { -# echo "reports<<${delimiter}" -# -# echo "Snapshot diff report" -# echo "| File name | Image |" -# echo "|-------|-------|" -# } >> "$GITHUB_OUTPUT" -# -# for file in $files; do -# fileName=$(basename "$file" | sed -r 's/(.{20})/\1
/g') -# echo "| [$fileName](https://github.com/${{ github.repository }}/blob/${{ env.COMPANION_BRANCH_NAME }}/$file) | ![](https://github.com/${{ github.repository }}/blob/${{ env.COMPANION_BRANCH_NAME }}/$file?raw=true) |" >> "$GITHUB_OUTPUT" -# done -# echo "${delimiter}" >> "$GITHUB_OUTPUT" -# -# - name: Find comment -# continue-on-error: true -# uses: peter-evans/find-comment@v3 -# id: fc -# with: -# issue-number: ${{ github.event.number }} -# comment-author: 'github-actions[bot]' -# body-includes: Snapshot diff report -# -# - name: Add or update comment on PR (exist screenshot diff) -# if: steps.check-screenshot-diff.outputs.is_exist == 'true' -# uses: peter-evans/create-or-update-comment@v4 -# with: -# comment-id: ${{ steps.fc.outputs.comment-id }} -# issue-number: ${{ env.PR_NUMBER }} -# body: ${{ steps.create-comments.outputs.reports }} -# edit-mode: replace -# -# - name: Add or update comment on PR (not exist screenshot diff) -# if: steps.check-screenshot-diff.outputs.is_exist == 'false' -# uses: peter-evans/create-or-update-comment@v4 -# with: -# comment-id: ${{ steps.fc.outputs.comment-id }} -# issue-number: ${{ env.PR_NUMBER }} -# body: Snapshot diff report -# edit-mode: replace -# -# - name: Cleanup outdated companion or screenshots branches -# run: | -# git branch -r --format="%(refname:lstrip=3)" | grep -e companion_ -e screenshots_ | while read -r branch; do -# last_commit_date_timestamp=$(git log -1 --format=%ct "origin/$branch") -# now_timestamp=$(date +%s) -# maximum_seconds_past=2592000 # 30 days -# if [ $((now_timestamp - last_commit_date_timestamp)) -gt maximum_seconds_past ]; then -# git push origin --delete "$branch" -# fi -# done -# -# - name: Checkout pr branch -# uses: actions/checkout@v4 -# with: -# ref: ${{ github.event.workflow_run.head_branch }} + +name: Test + +on: + pull_request: + paths-ignore: + - README.md + types: [ opened, synchronize, reopened, closed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + actions: read + pull-requests: write +jobs: + test-prod: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + with: + # ref: https://github.com/danger/danger/issues/913 + fetch-depth: 100 + + - name: Setup + uses: ./.github/actions/setup + with: + api-key: ${{ secrets.API_KEY }} + + - name: ktlint-check + run: ./gradlew --continue ktlintCheck + + - name: Test ProdDebug + run: ./gradlew testProdDebugUnitTest + + - name: Report jacoco + run: ./gradlew jacocoTestReport + + - name: jacoco-report to zip + run: zip -r jacocoTestReport.zip ./build/reports/jacoco/jacocoTestReport/html + + - name: Archive jacoco report + uses: actions/upload-artifact@v4 + with: + name: jacocoTestReport + path: ./build/reports/jacoco/jacocoTestReport/html + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.2.2 + bundler-cache: true + + - name: Danger + uses: MeilCli/danger-action@v5 + with: + plugins_file: Gemfile + install_path: vendor/bundle + danger_file: Dangerfile + danger_id: danger-pr + env: + DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }} + + - name: Slack notify + uses: ./.github/actions/incoming-webhook + with: + slack-webhook-url: ${{ secrets.SLACK_INCOMING_WEBHOOK_URL }} + + compile-mock: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + with: + api-key: ${{ secrets.API_KEY }} + + - name: Compile MockDebug + run: ./gradlew compileMockDebugSource + + compare-screnshots: + if: github.event.pull_request.merged == false && github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Check exist screenshots branch + id: check-exist-screenshots + run: | + echo is_exist=$( + git fetch origin screenshots_${{ github.base_ref }} && + echo true || echo false + ) >> "$GITHUB_OUTPUT" + + - name: Checkout screenshots branch + if: steps.check-exist-screenshots.outputs.is_exist == 'true' + uses: actions/checkout@v4 + with: + ref: screenshots_${{ github.base_ref }} + + - name: Make screenshots directory + run: mkdir -p ./app/build/outputs/roborazzi + + - name: Upload screenshots + if: steps.check-exist-screenshots.outputs.is_exist == 'true' + uses: actions/upload-artifact@v4 + with: + name: screenshots + path: ./app/build/outputs/roborazzi/ + retention-days: 1 + + - name: Checkout pr branch + if: steps.check-exist-screenshots.outputs.is_exist == 'true' + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Setup + uses: ./.github/actions/setup + with: + api-key: ${{ secrets.API_KEY }} + + - name: Download screenshots from PR number directory + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: screenshots + path: ./app/build/outputs/roborazzi/ + + - name: Compare screenshots + run: ./gradlew compareRoborazziProdDebug --stacktrace + + - name: Check screenshot diff + id: check-screenshot-diff + run: | + # To avoid "No such file or directory" + mkdir -p ./app/build/outputs/roborazzi + + file_size=$(find ./app/build/outputs/roborazzi -type f | grep -e '.*_compare.png' | wc -l | sed -e 's/[^0-9]//g') + is_exist_screenshot_diff="false" + if [ $file_size -ne 0 ]; then + echo "file_size=$file_size" + is_exist_screenshot_diff="true" + fi + echo "is_exist=${is_exist_screenshot_diff}" >> "$GITHUB_OUTPUT" + + - name: Make PR number directory for saving screenshots + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + run: mkdir -p ./pr/${{ github.event.number }} + + - name: Move screenshots to PR number directory + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + run: | + # delete except *_compare.png + find ./app/build/outputs/roborazzi -type f | grep -v -e '.*_compare.png' | xargs rm -rf + mv ./app/build/outputs/roborazzi ./pr/${{ github.event.number }}/ + ls ./pr/${{ github.event.number }} + + - name: Save screenshots + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + uses: actions/upload-artifact@v4 + with: + name: pr directory + path: pr/${{ github.event.number }}/ + + - name: Save pr number and branch name + run: | + echo "PR_NUMBER=${{ github.event.number }}" >> $GITHUB_ENV + echo "COMPANION_BRANCH_NAME=companion_${{ github.head_ref }}" >> $GITHUB_ENV + + - name: Checkout main branch + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + uses: actions/checkout@v4 + with: + ref: main + + - name: Checkout companion branch + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + run: | + git branch -D ${{ env.COMPANION_BRANCH_NAME }} || true + git checkout --orphan ${{ env.COMPANION_BRANCH_NAME }} + git rm -rf . + + - name: Download screenshots from PR number directory + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + uses: actions/download-artifact@v4 + with: + name: pr directory + + - name: Push screenshots to companion branch + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + id: push-screenshot-diff + run: | + files_to_add=$(find . -type f -name "*_compare.png") + + for file in $files_to_add; do + if [[ $file =~ ^[a-zA-Z0-9_./-]+$ ]]; then + git add $file + fi + done + git config --global user.name ScreenshotBot + git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + git commit -m "Add screenshot diff" + git push origin HEAD:${{ env.COMPANION_BRANCH_NAME }} -f + + - name: Create comments + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + id: create-comments + run: | + files=$(find . -type f -name "*_compare.png") + delimiter="$(openssl rand -hex 8)" + { + echo "reports<<${delimiter}" + + echo "Snapshot diff report" + echo "| File name | Image |" + echo "|-------|-------|" + } >> "$GITHUB_OUTPUT" + + for file in $files; do + fileName=$(basename "$file" | sed -r 's/(.{20})/\1
/g') + echo "| [$fileName](https://github.com/${{ github.repository }}/blob/${{ env.COMPANION_BRANCH_NAME }}/$file) | ![](https://github.com/${{ github.repository }}/blob/${{ env.COMPANION_BRANCH_NAME }}/$file?raw=true) |" >> "$GITHUB_OUTPUT" + done + echo "${delimiter}" >> "$GITHUB_OUTPUT" + + - name: Find comment + continue-on-error: true + uses: peter-evans/find-comment@v3 + id: fc + with: + issue-number: ${{ github.event.number }} + comment-author: 'github-actions[bot]' + body-includes: Snapshot diff report + + - name: Add or update comment on PR (exist screenshot diff) + if: steps.check-screenshot-diff.outputs.is_exist == 'true' + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ env.PR_NUMBER }} + body: ${{ steps.create-comments.outputs.reports }} + edit-mode: replace + + - name: Add or update comment on PR (not exist screenshot diff) + if: steps.check-screenshot-diff.outputs.is_exist == 'false' + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ env.PR_NUMBER }} + body: Snapshot diff report + edit-mode: replace + + - name: Cleanup outdated companion or screenshots branches + run: | + git branch -r --format="%(refname:lstrip=3)" | grep -e companion_ -e screenshots_ | while read -r branch; do + last_commit_date_timestamp=$(git log -1 --format=%ct "origin/$branch") + now_timestamp=$(date +%s) + maximum_seconds_past=2592000 # 30 days + if [ $((now_timestamp - last_commit_date_timestamp)) -gt maximum_seconds_past ]; then + git push origin --delete "$branch" + fi + done + + - name: Checkout pr branch + uses: actions/checkout@v4 + with: + ref: ${{ github.event.workflow_run.head_branch }}