diff --git a/app/ios/iosApp/Info.plist b/app/ios/iosApp/Info.plist
index ea62073..c4b7177 100644
--- a/app/ios/iosApp/Info.plist
+++ b/app/ios/iosApp/Info.plist
@@ -17,9 +17,9 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 0.2.1
+ 0.2.2
CFBundleVersion
- 021
+ 022
LSRequiresIPhoneOS
NSAppTransportSecurity
diff --git a/release.sh b/release.sh
index df6693f..91f5499 100755
--- a/release.sh
+++ b/release.sh
@@ -52,7 +52,6 @@ step() { echo -e "\n${CYAN}${BOLD}→${NC} ${BOLD}$1${NC}"; }
substep() { echo -e " ${GREEN}•${NC} $1"; }
echo -e "${MAGENTA}${BOLD}🚀 FromChat KMP Release Pipeline${NC}"
-[[ "$IS_PRERELEASE" == true ]] && info "Prerelease mode enabled via --pre flag"
# --- Настройка памяти для предотвращения OutOfMemory ---
export GRADLE_OPTS="-Dorg.gradle.jvmargs=-Xmx8g -Dkotlin.daemon.jvm.options=-Xmx8g"
@@ -67,13 +66,14 @@ PREVTAG=${TAGS[1]:-$TAG}
substep "Current tag: ${YELLOW}$TAG${NC}"
substep "Previous tag: ${YELLOW}$PREVTAG${NC}"
+# shellcheck disable=SC2001
BUILD_NUMBER=$(echo "$TAG" | sed 's/[^0-9]//g')
[[ -z "$BUILD_NUMBER" ]] && BUILD_NUMBER=1
# --- Сборка Android ---
build_android() {
step "Building Android Release"
- if ./gradlew :app:android:assembleRelease -PbuildNumber="$BUILD_NUMBER" -Dorg.gradle.jvmargs="-Xmx8g"; then
+ if ./gradlew :app:android:assembleRelease; then
APK_SRC=$(find . -name "*release.apk" | head -n 1)
if [[ -f "$APK_SRC" ]]; then
@@ -101,6 +101,7 @@ build_ios() {
fi
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
+ # shellcheck disable=SC2155
[[ ! -d "$DEVELOPER_DIR" ]] && export DEVELOPER_DIR=$(xcode-select -p)
IOS_PROJECT_DIR="app/ios"
@@ -150,6 +151,28 @@ build_ios() {
fi
}
+# --- Подготовка описания ---
+prepare_description() {
+ DESC_FILE=".release_desc.md"
+ echo -e "" > "$DESC_FILE"
+
+ # Открываем nano. Пользователь должен отредактировать файл.
+ nano "$DESC_FILE"
+
+ # Удаляем комментарии и лишние пробелы/пустые строки
+ # Используем perl для многострочного удаления комментариев
+ CLEAN_DESC=$(perl -0777 -pe 's///gs' "$DESC_FILE" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
+
+ rm -f "$DESC_FILE"
+
+ if [[ -n "$CLEAN_DESC" ]]; then
+ echo "$CLEAN_DESC" > .final_notes.md
+ NOTES_ARG=("-F" "./.final_notes.md")
+ else
+ NOTES_ARG=("--generate-notes")
+ fi
+}
+
# --- Публикация в GitHub ---
publish_github() {
step "GitHub Deployment"
@@ -161,36 +184,45 @@ publish_github() {
substep "Pushing tags..."
git push --tags > /dev/null 2>&1 || true
- # Определяем флаг пререлиза на основе тега ИЛИ аргумента --pre
prerelease_flag=""
if [[ "$IS_PRERELEASE" == true ]] || [[ "$TAG" == v*-pre* ]]; then
prerelease_flag="--prerelease"
fi
- # Собираем существующие файлы в массив
ASSETS=()
[[ -f "$ANDROID_ASSET" ]] && ASSETS+=("$ANDROID_ASSET")
[[ -f "$IOS_ASSET" ]] && ASSETS+=("$IOS_ASSET")
if [ ${#ASSETS[@]} -eq 0 ]; then
- error "No assets found to upload. Check build logs."
+ error "No assets found to upload."
return
fi
- # Проверяем наличие релиза и создаем/обновляем
+ # Подготавливаем описание перед созданием
+ prepare_description
+
if gh release view "$TAG" >/dev/null 2>&1; then
substep "Updating existing release ${YELLOW}$TAG${NC}..."
[[ -n "$prerelease_flag" ]] && gh release edit "$TAG" "$prerelease_flag"
+
+ # Если есть кастомные ноты, обновляем их
+ if [[ -f .final_notes.md ]]; then
+ gh release edit "$TAG" -F ./.final_notes.md
+ fi
+
gh release upload "$TAG" "${ASSETS[@]}" --clobber
else
substep "Creating new release ${YELLOW}$TAG${NC}..."
+ # gh release create принимает либо --generate-notes, либо --notes-file
gh release create "$TAG" \
- --generate-notes \
+ "${NOTES_ARG[@]}" \
--notes-start-tag "${PREVTAG:-$TAG}" \
$prerelease_flag \
"${ASSETS[@]}"
fi
- success "Assets uploaded to GitHub Release"
+
+ rm -f .final_notes.md
+ success "Assets and notes uploaded to GitHub Release"
}
# --- Основной процесс ---