5757 set -euo pipefail
5858 if [ -n "${RELEASE_KEYSTORE_BASE64:-}" ]; then
5959 mkdir -p app/release
60- echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > app/release/release-keystore.jks
61- ls -l app/release/release-keystore.jks
60+ echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > "$PWD/ app/release/release-keystore.jks"
61+ ls -l "$PWD/ app/release/release-keystore.jks"
6262 else
6363 echo "RELEASE_KEYSTORE_BASE64 not set; skipping keystore decode"
6464 fi
@@ -74,16 +74,17 @@ jobs:
7474 GRADLE_OPTS="-Xmx3g"
7575
7676 # If keystore secret is present but file missing, decode it now (defensive)
77- if [ -n "${RELEASE_KEYSTORE_BASE64:-}" ] && [ ! -f app/release/release-keystore.jks ]; then
77+ if [ -n "${RELEASE_KEYSTORE_BASE64:-}" ] && [ ! -f "$PWD/ app/release/release-keystore.jks" ]; then
7878 mkdir -p app/release
79- echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > app/release/release-keystore.jks
80- chmod 600 app/release/release-keystore.jks
79+ echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > "$PWD/ app/release/release-keystore.jks"
80+ chmod 600 "$PWD/ app/release/release-keystore.jks"
8181 fi
8282
8383 # Build with signing properties if keystore exists and passwords provided
84- if [ -f app/release/release-keystore.jks ] && [ -n "${RELEASE_KEYSTORE_KEY:-}" ] && [ -n "${RELEASE_KEYSTORE_SUBKEY:-}" ]; then
84+ STORE_FILE="$PWD/app/release/release-keystore.jks"
85+ if [ -f "$STORE_FILE" ] && [ -n "${RELEASE_KEYSTORE_KEY:-}" ] && [ -n "${RELEASE_KEYSTORE_SUBKEY:-}" ]; then
8586 echo "Keystore found — building signed release APK"
86- ./gradlew assembleRelease -Pandroid.injected.signing.store.file=app/release/release-keystore.jks -Pandroid.injected.signing.store.password="${RELEASE_KEYSTORE_KEY}" -Pandroid.injected.signing.key.password="${RELEASE_KEYSTORE_SUBKEY}" -Pandroid.injected.signing.key.alias=release
87+ ./gradlew assembleRelease -Pandroid.injected.signing.store.file="$STORE_FILE" -Pandroid.injected.signing.store.password="${RELEASE_KEYSTORE_KEY}" -Pandroid.injected.signing.key.password="${RELEASE_KEYSTORE_SUBKEY}" -Pandroid.injected.signing.key.alias=release
8788 else
8889 echo "No keystore/passwords provided — building release APK without injected signing properties"
8990 ./gradlew assembleRelease
9697 # Standard apk paths
9798 DEBUG_APK=app/build/outputs/apk/debug/app-debug.apk
9899 RELEASE_APK=app/build/outputs/apk/release/app-release.apk
99- RELEASE_APK_UNSIGN=app/build/outputs/apk/release/app-release-unsigned.apk
100-
101100
102101 COPIED=0
103102 if [ -f "$DEBUG_APK" ]; then
@@ -112,12 +111,6 @@ jobs:
112111 COPIED=$((COPIED+1))
113112 else
114113 echo "Release APK not found at $RELEASE_APK"
115- if [ -f "$RELEASE_APK" ]; then
116- cp "$RELEASE_APK_UNSIGN" release_artifacts/app-release.apk
117- COPIED=$((COPIED+1))
118- else
119- echo "Release APK not found at $RELEASE_APK_UNSIGN"
120- fi
121114 fi
122115
123116 if [ $COPIED -ne 2 ]; then
@@ -132,6 +125,7 @@ jobs:
132125 run : |
133126 set -euo pipefail
134127
128+ # 1) 获取版本号(优先:app/build.gradle -> app/build.gradle.kts -> gradle.properties)
135129 VERSION=""
136130 if [ -f app/build.gradle ]; then
137131 VERSION=$(grep -m1 "versionName" app/build.gradle | sed -E "s/.*versionName[[:space:]]+['\"]([^'\"]+)['\"].*/\1/" || true)
@@ -144,25 +138,31 @@ jobs:
144138 fi
145139 VERSION=${VERSION:-"build-${GITHUB_RUN_ID}"}
146140
141+ # 2) commit id(短 sha)和 commit history 作为 body
147142 COMMIT_ID=$(git rev-parse --short HEAD)
148143 BODY=$(git log --pretty=format:"%h %ad - %s (%an)" --date=short --no-merges -n 200)
149144
145+ # 3) 构造 JSON payload(使用 jq 确保正确的 JSON 转义)
150146 if ! command -v jq >/dev/null 2>&1; then
151147 echo "jq is required but not installed in runner. Exiting."
152148 exit 1
153149 fi
154150 PAYLOAD=$(jq -n --arg tag "${COMMIT_ID}" --arg name "${VERSION}" --arg body "${BODY}" \
155151 '{ tag_name: $tag, name: $name, body: $body, draft: false, prerelease: false }')
156152
153+ # 4) 调用 GitHub Releases API 创建 release(创建时为最新)
157154 RESPONSE=$(curl -s -X POST \
158155 -H "Authorization: token ${GITHUB_TOKEN}" \
159156 -H "Accept: application/vnd.github+json" \
160157 -H "Content-Type: application/json" \
161158 -d "${PAYLOAD}" \
162159 "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases")
160+
161+ # 输出响应以便日志可见
163162 echo "GitHub release response:"
164163 echo "${RESPONSE}" | jq .
165164
165+ # 5) 从响应中取 upload_url 并导出为步骤输出,供后续 upload-release-asset 使用
166166 UPLOAD_URL=$(echo "${RESPONSE}" | jq -r '.upload_url // empty')
167167 if [ -z "$UPLOAD_URL" ] || [ "$UPLOAD_URL" = "null" ]; then
168168 echo "Failed to create release or upload_url missing. Full response above."
0 commit comments