name: Flutter CI - Basic Setup on: push: branches: - master_sky pull_request: branches: - master_sky jobs: # 基础设置任务:检出代码、提取版本号 basic-setup: name: 🔧 Basic Setup runs-on: sky steps: # 1. 检出代码 - name: Checkout Code uses: actions/checkout@v4 with: fetch-depth: 1 # 2. 提取版本号 - name: Extract Version id: version run: | # 获取最新的tag(按版本号排序,匹配vX.X.X_sky格式) LATEST_TAG=$(git tag --list "v*.*.*_sky" --sort=-version:refname | head -1) # 如果没有找到tag,使用默认值 if [ -z "$LATEST_TAG" ]; then LATEST_TAG="v1.0.0_sky" echo "📌 No tags found, using default: $LATEST_TAG" else echo "📌 Latest tag found: $LATEST_TAG" fi # 提取基础版本号(去除_sky后缀) BASE_VERSION=$(echo "$LATEST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" echo "📌 Base version: $BASE_VERSION" # 解析版本号各部分 MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) echo "📌 Version components: Major=$MAJOR, Minor=$MINOR, Patch=$PATCH" # 计算下一个版本号 echo "📊 Calculating next version..." # 获取当前提交与最新tag之间的所有提交消息 COMMIT_MESSAGES=$(git log --oneline --format=%s $LATEST_TAG..HEAD 2>/dev/null || echo "") # 统计需要递增的提交次数(过滤重复的提交消息) INCREMENT_COUNT=0 if [ -n "$COMMIT_MESSAGES" ]; then # 使用awk过滤重复的提交消息并计数 UNIQUE_MESSAGES=$(echo "$COMMIT_MESSAGES" | awk '!seen[$0]++') INCREMENT_COUNT=$(echo "$UNIQUE_MESSAGES" | wc -l) echo "📝 Found $INCREMENT_COUNT unique commit(s) since last tag" else echo "📝 No new commits since last tag" fi # 计算新的版本号 NEW_PATCH=$((PATCH + INCREMENT_COUNT)) NEW_MINOR=$MINOR NEW_MAJOR=$MAJOR # 处理版本号进位逻辑 if [ $NEW_PATCH -ge 1000 ]; then NEW_MINOR=$((NEW_MINOR + NEW_PATCH / 1000)) NEW_PATCH=$((NEW_PATCH % 1000)) echo "🔄 Patch version overflow, incrementing minor version" fi if [ $NEW_MINOR -ge 10 ]; then NEW_MAJOR=$((NEW_MAJOR + NEW_MINOR / 10)) NEW_MINOR=$((NEW_MINOR % 10)) echo "🔄 Minor version overflow, incrementing major version" fi # 生成下一个版本号 NEXT_VERSION="v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}" NEXT_TAG="${NEXT_VERSION}_sky" echo "🚀 Next version: $NEXT_VERSION" echo "🏷️ Next tag: $NEXT_TAG" echo "📈 Increment count: $INCREMENT_COUNT" # 设置输出变量供后续任务使用(Gitea Actions格式) echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_OUTPUT echo "NEXT_TAG=$NEXT_TAG" >> $GITEA_OUTPUT echo "INCREMENT_COUNT=$INCREMENT_COUNT" >> $GITEA_OUTPUT # 输出版本信息 echo "✅ Version extraction completed" # 5. 任务完成通知 - name: Task Completion run: | echo "🎉 Basic CI setup completed successfully!" echo "" echo "📋 Tasks executed:" echo " ✅ Code checkout" echo " ✅ Version extraction" echo "" echo "🚀 Next steps: Building Flutter artifacts..." # 构建Flutter制品任务 build-artifacts: name: 🏗️ Build Flutter Artifacts runs-on: sky needs: basic-setup steps: # 1. 检出代码 - name: Checkout Code uses: actions/checkout@v4 with: fetch-depth: 1 # 4. 构建APK文件 - name: Build APK run: | echo "🏗️ Building APK artifact..." # 生成当前时间作为build-number(格式:YYYYMMDDHH) BUILD_NUMBER=$(date +%Y%m%d%H) echo "📅 Build number: $BUILD_NUMBER" # 获取版本信息(从basic-setup任务传递) echo "🔍 Getting version info from basic-setup job..." # 设置默认版本号,如果环境变量为空 if [ -z "${{ needs.basic-setup.outputs.NEXT_VERSION }}" ]; then VERSION_FOR_FILENAME="1-0-0" echo "⚠️ Version not found, using default: $VERSION_FOR_FILENAME" else # 格式化版本号用于文件名 VERSION_FOR_FILENAME=$(echo "${{ needs.basic-setup.outputs.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') echo "✅ Version found: $VERSION_FOR_FILENAME" fi # 设置APK文件名 APK_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.apk" echo "📁 APK filename: $APK_FILENAME" # 构建APK,使用新的构建参数 flutter build apk --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.apk" # 重命名APK文件 mv build/app/outputs/flutter-apk/app-sky-release.apk "$APK_FILENAME" echo "✅ APK build completed: $APK_FILENAME" # 5. 构建AAB文件 - name: Build AAB run: | echo "🏗️ Building AAB artifact..." # 生成当前时间作为build-number(格式:YYYYMMDDHH) BUILD_NUMBER=$(date +%Y%m%d%H) echo "📅 Build number: $BUILD_NUMBER" # 获取版本信息(从basic-setup任务传递) echo "🔍 Getting version info from basic-setup job..." # 设置默认版本号,如果环境变量为空 if [ -z "${{ needs.basic-setup.outputs.NEXT_VERSION }}" ]; then VERSION_FOR_FILENAME="1-0-0" echo "⚠️ Version not found, using default: $VERSION_FOR_FILENAME" else # 格式化版本号用于文件名 VERSION_FOR_FILENAME=$(echo "${{ needs.basic-setup.outputs.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') echo "✅ Version found: $VERSION_FOR_FILENAME" fi # 设置AAB文件名 AAB_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.aab" echo "📁 AAB filename: $AAB_FILENAME" # 构建AAB,使用新的构建参数 flutter build appbundle --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.aab" # 重命名AAB文件 mv build/app/outputs/bundle/skyRelease/app-sky-release.aab "$AAB_FILENAME" echo "✅ AAB build completed: $AAB_FILENAME" # 6. 构建iOS IPA文件(如果支持iOS构建) - name: Build iOS IPA if: runner.os == 'macos' run: | echo "🏗️ Building iOS IPA artifact..." # 生成当前时间作为build-number(格式:YYYYMMDDHH) BUILD_NUMBER=$(date +%Y%m%d%H) echo "📅 Build number: $BUILD_NUMBER" # 获取版本信息(从basic-setup任务传递) echo "🔍 Getting version info from basic-setup job..." # 设置默认版本号,如果环境变量为空 if [ -z "${{ needs.basic-setup.outputs.NEXT_VERSION }}" ]; then VERSION_FOR_FILENAME="1-0-0" echo "⚠️ Version not found, using default: $VERSION_FOR_FILENAME" else # 格式化版本号用于文件名 VERSION_FOR_FILENAME=$(echo "${{ needs.basic-setup.outputs.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') echo "✅ Version found: $VERSION_FOR_FILENAME" fi # 设置IPA文件名 IPA_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.ipa" echo "📁 IPA filename: $IPA_FILENAME" # 配置iOS自动签名(CI环境使用自动签名) echo "🔧 Configuring iOS automatic code signing for CI environment..." # 构建iOS IPA,使用自动签名模式 flutter build ipa --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.ipa" --codesign # 重命名IPA文件 mv build/ios/ipa/*.ipa "$IPA_FILENAME" echo "✅ iOS IPA build completed: $IPA_FILENAME" # 7. 上传制品 - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: flutter-artifacts-release path: | sky-star-lock-release-*.apk sky-star-lock-release-*.aab sky-star-lock-release-*.ipa retention-days: 30 # 8. 构建完成通知 - name: Build Completion run: | echo "🎉 Flutter artifacts build completed successfully!" echo "" echo "📦 Artifacts generated:" echo " ✅ APK: sky-star-lock-release-*.apk" echo " ✅ AAB: sky-star-lock-release-*.aab" if [ "${{ runner.os }}" == "macos" ]; then echo " ✅ IPA: sky-star-lock-release-*.ipa" fi echo "" echo "🏷️ Version: ${{ needs.basic-setup.outputs.NEXT_VERSION }}" echo "📁 Files available in artifacts section"