Skip to content

Commit e2c50ed

Browse files
authored
chore: Merge branch dev to main (#380)
2 parents 4aceedd + 0f36137 commit e2c50ed

151 files changed

Lines changed: 11000 additions & 5058 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/scripts/prepare-release.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
VERSION="$1"
5+
6+
echo "Preparing release v${VERSION}..."
7+
8+
# 1. Update the version in app/gradle.properties
9+
sed -i "s/^version\s*=.*/version = ${VERSION}/" app/gradle.properties
10+
echo "Updated app/gradle.properties to version ${VERSION}"
11+
12+
# 2. Build the release APK with the correct version baked in.
13+
# Stop any existing daemon so a fresh one picks up the updated gradle.properties.
14+
chmod +x ./gradlew
15+
./gradlew --stop || true
16+
./gradlew assembleRelease --stacktrace
17+
18+
# 3. Find the built APK and rename it to the expected release name
19+
RELEASE_DIR="app/build/outputs/apk/release"
20+
APK_SRC=$(find "${RELEASE_DIR}" -name '*-release.apk' | head -1)
21+
22+
if [ -z "${APK_SRC}" ]; then
23+
echo "ERROR: No *-release.apk found in ${RELEASE_DIR}"
24+
ls -la "${RELEASE_DIR}" || true
25+
exit 1
26+
fi
27+
28+
APK_DST="${RELEASE_DIR}/morphe-manager-${VERSION}.apk"
29+
mv "${APK_SRC}" "${APK_DST}"
30+
echo "Renamed APK to ${APK_DST}"
31+
32+
# 4. GPG-sign the APK
33+
gpg --armor --detach-sign "${APK_DST}"
34+
echo "Signed ${APK_DST}"
35+
36+
echo "Release v${VERSION} prepared successfully."

.github/workflows/build_pull_request.yml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,39 @@ jobs:
1212

1313
steps:
1414
- name: Checkout code
15-
uses: actions/checkout@v4
15+
uses: actions/checkout@v6
1616

1717
- name: Restore release keystore
1818
run: |
1919
echo "${{ secrets.KEYSTORE_B64 }}" | base64 -d > app/keystore.jks
2020
ls -la app/keystore.jks
2121
22-
- name: Setup JDK 17
23-
uses: actions/setup-java@v4
22+
- name: Setup Java
23+
uses: actions/setup-java@v5
2424
with:
25-
distribution: temurin
26-
java-version: 17
27-
cache: gradle
25+
distribution: 'temurin'
26+
java-version: '17'
27+
28+
- name: Cache Gradle
29+
uses: burrunan/gradle-cache-action@v3
2830

2931
- name: Build and Sign Release APK
3032
env:
3133
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3234
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
3335
KEYSTORE_ENTRY_ALIAS: ${{ secrets.KEYSTORE_ENTRY_ALIAS }}
3436
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
37+
_JAVA_OPTIONS: "-Djava.awt.headless=true"
3538
run: |
3639
chmod +x ./gradlew
3740
./gradlew assembleRelease --stacktrace
3841
42+
- name: Rename APK
43+
run: |
44+
for f in app/build/outputs/apk/release/*-release.apk; do
45+
mv "$f" "${f/-release/}"
46+
done
47+
3948
- name: Upload APK
4049
uses: actions/upload-artifact@v7
4150
with:

.github/workflows/compile_pull_request.yml

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,22 @@ jobs:
1414
runs-on: ubuntu-latest
1515

1616
steps:
17-
- name: Checkout code
18-
uses: actions/checkout@v4
17+
- name: Checkout
18+
uses: actions/checkout@v6
1919

20-
- name: Setup JDK 17
21-
uses: actions/setup-java@v4
20+
- name: Setup Java
21+
uses: actions/setup-java@v5
2222
with:
23-
distribution: temurin
24-
java-version: 17
25-
cache: gradle
23+
distribution: 'temurin'
24+
java-version: '17'
25+
26+
- name: Cache Gradle
27+
uses: burrunan/gradle-cache-action@v3
2628

2729
- name: Build Debug APK
2830
env:
2931
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32+
_JAVA_OPTIONS: "-Djava.awt.headless=true"
3033
run: |
3134
chmod +x ./gradlew
32-
./gradlew assembleDebug --stacktrace
35+
./gradlew assembleDebug -PnoProguard -PsignAsDebug --stacktrace

.github/workflows/crowdin_pull.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ jobs:
5757
- name: Compile Android app to check resources
5858
env:
5959
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
60+
_JAVA_OPTIONS: "-Djava.awt.headless=true"
6061
run: |
6162
chmod +x ./gradlew
62-
./gradlew :app:assembleDebug
63+
./gradlew :app:assembleDebug -PnoProguard -PsignAsDebug
6364
6465
# Step 3: Checkout dev branch to prepare for merging
6566
- name: Checkout dev branch for merge
@@ -80,4 +81,4 @@ jobs:
8081
git config --local user.email "support+bot@crowdin.com"
8182
git merge --squash origin/crowdin
8283
git commit --allow-empty -m "chore: Update translations from Crowdin"
83-
git push origin dev
84+
git push origin dev

.github/workflows/open_pull_request.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
runs-on: ubuntu-latest
1616
steps:
1717
- name: Checkout
18-
uses: actions/checkout@v5
18+
uses: actions/checkout@v6
1919

2020
- name: Open pull request
2121
uses: repo-sync/pull-request@v2

.github/workflows/release.yml

Lines changed: 39 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ jobs:
1919

2020
steps:
2121
- name: Checkout
22-
uses: actions/checkout@v4
22+
uses: actions/checkout@v6
2323

2424
- name: Setup Java
25-
id: setup-java
26-
uses: actions/setup-java@v4
25+
uses: actions/setup-java@v5
2726
with:
28-
distribution: temurin
27+
distribution: 'temurin'
2928
java-version: '17'
3029

3130
- name: Cache Gradle
@@ -35,17 +34,8 @@ jobs:
3534
run: |
3635
echo "${{ secrets.KEYSTORE_B64 }}" | base64 -d > app/keystore.jks
3736
38-
- name: Build
39-
env:
40-
GITHUB_ACTOR: ${{ github.actor }}
41-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42-
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
43-
KEYSTORE_ENTRY_ALIAS: ${{ secrets.KEYSTORE_ENTRY_ALIAS }}
44-
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
45-
run: ./gradlew assembleRelease
46-
4737
- name: Setup Node.js
48-
uses: actions/setup-node@v4
38+
uses: actions/setup-node@v6
4939
with:
5040
node-version: "lts/*"
5141
cache: npm
@@ -61,25 +51,49 @@ jobs:
6151
fingerprint: ${{ vars.GPG_FINGERPRINT }}
6252

6353
- name: Release
54+
uses: cycjimmy/semantic-release-action@v5
6455
id: release
65-
run: |
66-
echo "NEW_TAG=$(npx multi-semantic-release --tag-format 'v${version}' | tee | grep 'Created tag ' | sed -E 's/.*Created tag ([^ ]+).*/\1/')" >> $GITHUB_OUTPUT
6756
env:
6857
GITHUB_ACTOR: ${{ github.actor }}
6958
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7059
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
7160
KEYSTORE_ENTRY_ALIAS: ${{ secrets.KEYSTORE_ENTRY_ALIAS }}
7261
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
7362

63+
- name: Copy release files to legacy path
64+
# TODO: Eventually delete this logic
65+
if: steps.release.outputs.new_release_published == 'true'
66+
run: |
67+
git config user.name "semantic-release-bot"
68+
git config user.email "semantic-release-bot@martynus.net"
69+
70+
# Make sure we're rebasing onto the latest remote branch
71+
git fetch origin
72+
73+
# Hard reset to latest remote branch
74+
git checkout ${GITHUB_REF_NAME}
75+
git reset --hard origin/${GITHUB_REF_NAME}
76+
77+
cp app-release.json app/app-release.json
78+
cp CHANGELOG.md app/CHANGELOG.md
79+
80+
git add app/app-release.json
81+
git add app/CHANGELOG.md
82+
83+
git commit -m "chore: Update legacy release files"
84+
85+
# Push explicitly to the branch that triggered the workflow
86+
git push origin HEAD:${GITHUB_REF_NAME}
87+
7488
- name: Attest
75-
if: steps.release.outputs.NEW_TAG != ''
89+
if: steps.release.outputs.new_release_published == 'true'
7690
uses: actions/attest-build-provenance@v2
7791
with:
78-
subject-name: 'Morphe Manager ${{ steps.release.outputs.NEW_TAG }}'
92+
subject-name: 'Morphe Manager ${{ steps.release.outputs.new_release_git_tag }}'
7993
subject-path: app/build/outputs/apk/release/morphe-manager*.apk
8094

8195
- name: Generate website deploy token
82-
if: steps.release.outputs.NEW_TAG != ''
96+
if: steps.release.outputs.new_release_published == 'true'
8397
id: app-token
8498
uses: actions/create-github-app-token@v1
8599
with:
@@ -88,7 +102,7 @@ jobs:
88102
owner: MorpheApp
89103

90104
- name: Trigger website deploy
91-
if: steps.release.outputs.NEW_TAG != ''
105+
if: steps.release.outputs.new_release_published == 'true'
92106
uses: actions/github-script@v7
93107
with:
94108
github-token: ${{ steps.app-token.outputs.token }}
@@ -99,92 +113,22 @@ jobs:
99113
event_type: 'trigger-deploy'
100114
})
101115
102-
- name: Purge jsDelivr Cache
103-
if: steps.release.outputs.NEW_TAG != ''
104-
run: |
105-
set -e
106-
107-
# ------------------------------
108-
# Build the list of paths to purge
109-
# ------------------------------
110-
PATHS=(
111-
"/gh/${GITHUB_REPOSITORY}@${GITHUB_REF_NAME}/app/app-release.json"
112-
)
113-
114-
# Include dev path if main branch
115-
if [ "${GITHUB_REF_NAME}" = "main" ]; then
116-
PATHS+=("/gh/${GITHUB_REPOSITORY}@dev/app/app-release.json")
117-
fi
118-
119-
# Convert PATHS array to JSON array string
120-
JSON_PATHS=$(printf '%s\n' "${PATHS[@]}" | jq -R . | jq -s .)
121-
122-
echo "Purging jsDelivr cache for paths: ${PATHS[*]}"
123-
124-
# ------------------------------
125-
# Send initial purge request
126-
# ------------------------------
127-
RESPONSE=$(curl -s -X POST https://purge.jsdelivr.net/ \
128-
-H 'Content-Type: application/json' \
129-
-d "{\"path\": $JSON_PATHS}")
130-
131-
PURGE_ID=$(echo "$RESPONSE" | jq -r '.id')
132-
if [ -z "$PURGE_ID" ] || [ "$PURGE_ID" = "null" ]; then
133-
echo "❌ Failed to create purge request: $RESPONSE"
134-
exit 1
135-
fi
136-
echo "Purge ID: $PURGE_ID"
137-
138-
# ------------------------------
139-
# Poll until finished or failed
140-
# ------------------------------
141-
while true; do
142-
STATUS=$(curl -s "https://purge.jsdelivr.net/status/$PURGE_ID")
143-
STATE=$(echo "$STATUS" | jq -r '.status')
144-
echo "Current purge status: $STATE"
145-
146-
if [ "$STATE" = "finished" ]; then
147-
# Check if any paths were throttled
148-
THROTTLED_RESET=$(echo "$STATUS" | jq '[.paths[] | select(.throttled==true) | .throttlingReset] | max // 0')
149-
if [ "$THROTTLED_RESET" -gt 0 ]; then
150-
echo "⚠️ Some paths were throttled. Waiting $THROTTLED_RESET seconds before retry..."
151-
sleep $((THROTTLED_RESET + 1))
152-
# Resend purge request for throttled paths
153-
THROTTLED_PATHS=$(echo "$STATUS" | jq -r '[.paths | to_entries[] | select(.value.throttled==true) | .key] | @json')
154-
echo "Retrying purge for paths: $THROTTLED_PATHS"
155-
RESPONSE=$(curl -s -X POST https://purge.jsdelivr.net/ \
156-
-H 'Content-Type: application/json' \
157-
-d "{\"path\": $THROTTLED_PATHS}")
158-
PURGE_ID=$(echo "$RESPONSE" | jq -r '.id')
159-
continue
160-
fi
161-
echo "✅ Purge finished successfully for all paths"
162-
break
163-
elif [ "$STATE" = "failed" ]; then
164-
echo "❌ Purge failed: $STATUS"
165-
exit 1
166-
else
167-
# Still pending
168-
sleep 2
169-
fi
170-
done
171-
172116
- name: Wait before sending FCM
173-
if: steps.release.outputs.NEW_TAG != ''
174-
run: sleep 300
117+
if: steps.release.outputs.new_release_published == 'true'
118+
run: sleep 480
175119

176120
- name: Setup Python for FCM
177-
if: steps.release.outputs.NEW_TAG != ''
121+
if: steps.release.outputs.new_release_published == 'true'
178122
uses: actions/setup-python@v5
179123
with:
180124
python-version: '3.12'
181125

182126
- name: Send FCM push notification
183-
if: steps.release.outputs.NEW_TAG != ''
127+
if: steps.release.outputs.new_release_published == 'true'
184128
env:
185129
FCM_PROJECT_ID: ${{ secrets.FCM_PROJECT_ID }}
186130
FCM_SERVICE_ACCOUNT_JSON: ${{ secrets.FCM_SERVICE_ACCOUNT_JSON }}
187-
NEW_TAG: ${{ steps.release.outputs.NEW_TAG }}
131+
NEW_TAG: ${{ steps.release.outputs.new_release_git_tag }}
188132
BRANCH: ${{ github.ref_name }}
189133
run: |
190134
pip install cryptography

app/.releaserc renamed to .releaserc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,20 @@
2525
}
2626
}
2727
],
28-
"gradle-semantic-release-plugin",
28+
[
29+
"@semantic-release/exec",
30+
{
31+
"prepareCmd": "chmod +x .github/scripts/prepare-release.sh && .github/scripts/prepare-release.sh ${nextRelease.version}",
32+
"publishCmd": "echo 'Build completed during prepare phase'"
33+
}
34+
],
2935
[
3036
"@semantic-release/git",
3137
{
3238
"assets": [
3339
"CHANGELOG.md",
3440
"app-release.json",
35-
"gradle.properties"
41+
"app/gradle.properties"
3642
],
3743
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
3844
}
@@ -42,14 +48,14 @@
4248
{
4349
"assets": [
4450
{
45-
"path": "build/outputs/apk/release/morphe-manager*.apk?(.asc)"
51+
"path": "app/build/outputs/apk/release/*.apk?(.asc)"
4652
}
4753
],
4854
"successComment": false
4955
}
5056
],
5157
[
52-
"@saithodev/semantic-release-backmerge",
58+
"@cleyrop-org/semantic-release-backmerge",
5359
{
5460
"backmergeBranches": [{"from": "main", "to": "dev"}],
5561
"clearWorkspace": true

0 commit comments

Comments
 (0)