From 8967b6533d13b4e9120fe5f7b4ff89edec89f494 Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot Date: Wed, 20 Aug 2025 08:32:15 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=94=84=20synced=20local=20'.github/wo?= =?UTF-8?q?rkflows/'=20with=20remote=20'config/workflows/'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nextcloud-android-bot --- .github/workflows/QA_keystore.jks | Bin 0 -> 2236 bytes .github/workflows/QA_keystore.jks.license | 2 + .github/workflows/analysis.yml | 4 +- .github/workflows/codeql.yml | 4 +- .github/workflows/qa.yml | 58 ++++++++++++++++++++++ .github/workflows/scorecard.yml | 2 +- .github/workflows/uploadArtifact.sh | 44 ++++++++++++++++ 7 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/QA_keystore.jks create mode 100644 .github/workflows/QA_keystore.jks.license create mode 100644 .github/workflows/qa.yml create mode 100755 .github/workflows/uploadArtifact.sh diff --git a/.github/workflows/QA_keystore.jks b/.github/workflows/QA_keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..2b8fb9bc231219ab7954a6e0a5fea47b5f4c61f8 GIT binary patch literal 2236 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 UT$x~>$nZXtB6{SH*t-|@7tCJSiU0rr literal 0 HcmV?d00001 diff --git a/.github/workflows/QA_keystore.jks.license b/.github/workflows/QA_keystore.jks.license new file mode 100644 index 000000000..7ec214431 --- /dev/null +++ b/.github/workflows/QA_keystore.jks.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors +SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml index bdaf97fa0..5988dd2c0 100644 --- a/.github/workflows/analysis.yml +++ b/.github/workflows/analysis.yml @@ -70,9 +70,7 @@ jobs: run: | mkdir -p "$HOME/.gradle" { - echo "org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" - echo "org.gradle.caching=true" - echo "org.gradle.parallel=true" + echo "org.gradle.jvmargs=-Xmx5g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" echo "org.gradle.configureondemand=true" echo "kapt.incremental.apt=true" } > "$HOME/.gradle/gradle.properties" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 982bc23ce..1dead8a72 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -43,7 +43,7 @@ jobs: with: swap-size-gb: 10 - name: Initialize CodeQL - uses: github/codeql-action/init@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/init@96f518a34f7a870018057716cc4d7a5c014bd61c # v3.29.10 with: languages: ${{ matrix.language }} - name: Set up JDK 17 @@ -57,4 +57,4 @@ jobs: echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties" ./gradlew assembleDebug - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/analyze@96f518a34f7a870018057716cc4d7a5c014bd61c # v3.29.10 diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml new file mode 100644 index 000000000..95bedbcf2 --- /dev/null +++ b/.github/workflows/qa.yml @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-FileCopyrightText: 2023 Andy Scherzinger +# SPDX-License-Identifier: MIT +name: "QA" + +on: + pull_request: + branches: [ main, master, stable-* ] + +permissions: + pull-requests: write + contents: read + +concurrency: + group: qa-build-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + qa: + runs-on: ubuntu-latest + steps: + - name: Check if secrets are available + run: echo "ok=${{ secrets.KS_PASS != '' }}" >> "$GITHUB_OUTPUT" + id: check-secrets + + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + if: ${{ steps.check-secrets.outputs.ok == 'true' }} + with: + persist-credentials: false + + - name: set up JDK 17 + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + if: ${{ steps.check-secrets.outputs.ok == 'true' }} + with: + distribution: "temurin" + java-version: 17 + + - name: Build QA + if: ${{ steps.check-secrets.outputs.ok == 'true' }} + env: + KS_PASS: ${{ secrets.KS_PASS }} + KEY_PASS: ${{ secrets.KEY_PASS }} + LOG_USERNAME: ${{ secrets.LOG_USERNAME }} + LOG_PASSWORD: ${{ secrets.LOG_PASSWORD }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + mkdir -p $HOME/.gradle + echo "org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" > $HOME/.gradle/gradle.properties + echo "org.gradle.caching=true" >> $HOME/.gradle/gradle.properties + echo "org.gradle.parallel=true" >> $HOME/.gradle/gradle.properties + echo "org.gradle.configureondemand=true" >> $HOME/.gradle/gradle.properties + echo "kapt.incremental.apt=true" >> $HOME/.gradle/gradle.properties + sed -i "/qa/,/\}/ s/versionCode .*/versionCode ${{github.event.number}} /" app/build.gradle + sed -i "/qa/,/\}/ s/versionName .*/versionName \"${{github.event.number}}\"/" app/build.gradle + ./gradlew assembleQaDebug + $(find /usr/local/lib/android/sdk/build-tools/*/apksigner | sort | tail -n1) sign --ks-pass pass:$KS_PASS --key-pass pass:$KEY_PASS --ks-key-alias key0 --ks .github/workflows/QA_keystore.jks app/build/outputs/apk/qa/debug/*qa-debug*.apk + .github/workflows/uploadArtifact.sh $LOG_USERNAME $LOG_PASSWORD ${{github.event.number}} ${{github.event.number}} $GITHUB_TOKEN diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 43b578d17..4e45440f0 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -42,6 +42,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/upload-sarif@96f518a34f7a870018057716cc4d7a5c014bd61c # v3.29.10 with: sarif_file: results.sarif diff --git a/.github/workflows/uploadArtifact.sh b/.github/workflows/uploadArtifact.sh new file mode 100755 index 000000000..4dfab9e9c --- /dev/null +++ b/.github/workflows/uploadArtifact.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# +# SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-FileCopyrightText: 2019-2022 Tobias Kaminsky +# SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only +# + +#1: LOG_USERNAME +#2: LOG_PASSWORD +#3: DRONE_BUILD_NUMBER +#4: DRONE_PULL_REQUEST + + +PUBLIC_URL=https://www.kaminsky.me/nc-dev/android-artifacts +USER=$1 +PASS=$2 +BUILD=$3 +PR=$4 +GITHUB_TOKEN=$5 +DAV_URL=https://nextcloud.kaminsky.me/remote.php/dav/files/$USER/android-artifacts/ + +source scripts/lib.sh +REPO=$(cat scripts/repo) + +if ! test -e app/build/outputs/apk/qa/debug/*qa-debug*.apk ; then + exit 1 +fi +echo "Uploaded artifact to $DAV_URL/$BUILD.apk" + +# delete all old comments, starting with "APK file:" +oldComments=$(curl_gh -X GET https://api.github.com/repos/nextcloud/$REPO/issues/$PR/comments | jq '.[] | (.id |tostring) + "|" + (.user.login | test("github-actions") | tostring) + "|" + (.body | test("APK file:.*") | tostring)' | grep "true|true" | tr -d "\"" | cut -f1 -d"|") + +echo $oldComments | while read comment ; do + curl_gh -X DELETE https://api.github.com/repos/nextcloud/$REPO/issues/comments/$comment +done + +sudo apt-get -y install qrencode + +qrencode -o $PR.png "$PUBLIC_URL/$BUILD.apk" + +curl -u $USER:$PASS -X PUT $DAV_URL/$BUILD.apk --upload-file app/build/outputs/apk/qa/debug/*qa-debug*.apk +curl -u $USER:$PASS -X PUT $DAV_URL/$BUILD.png --upload-file $PR.png +curl_gh -X POST https://api.github.com/repos/nextcloud/$REPO/issues/$PR/comments -d "{ \"body\" : \"APK file: $PUBLIC_URL/$BUILD.apk

![qrcode]($PUBLIC_URL/$BUILD.png)

To test this change/fix you can simply download above APK file and install and test it in parallel to your existing Nextcloud app. \" }" From ff92d1d258a3631b386e46751614ad002303673c Mon Sep 17 00:00:00 2001 From: nextcloud-android-bot Date: Tue, 19 Aug 2025 14:09:19 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=94=84=20synced=20local=20'.github/wo?= =?UTF-8?q?rkflows/'=20with=20remote=20'config/workflows/'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nextcloud-android-bot Signed-off-by: tobiasKaminsky --- app/build.gradle | 6 +++++ .../res/drawable/ic_launcher_foreground.xml | 13 +++++++++++ app/src/qa/res/xml/shortcuts.xml | 23 +++++++++++++++++++ scripts/repo | 1 + 4 files changed, 43 insertions(+) create mode 100644 app/src/qa/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/qa/res/xml/shortcuts.xml create mode 100644 scripts/repo diff --git a/app/build.gradle b/app/build.gradle index 1eba1611a..cbde18020 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,6 +69,12 @@ android { play { dimension "version" } + qa { + applicationIdSuffix ".qa" + dimension "version" + versionCode 11 + versionName "1" + } } testOptions { diff --git a/app/src/qa/res/drawable/ic_launcher_foreground.xml b/app/src/qa/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..9661217b5 --- /dev/null +++ b/app/src/qa/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/qa/res/xml/shortcuts.xml b/app/src/qa/res/xml/shortcuts.xml new file mode 100644 index 000000000..26e880cc3 --- /dev/null +++ b/app/src/qa/res/xml/shortcuts.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/scripts/repo b/scripts/repo new file mode 100644 index 000000000..60102381c --- /dev/null +++ b/scripts/repo @@ -0,0 +1 @@ +notes-android