name: CI on: workflow_dispatch: # push: # branches: # - 'main' # paths-ignore: # - '**.md' # - '**.txt' # - '.github/**' # - '.idea/**' # - '!.github/workflows/CI.yml' jobs: update_version: name: Read and update version runs-on: ubuntu-latest outputs: # 定义输出变量 version,以便在其他job中引用 new_version: ${{ steps.version.outputs.new_version }} steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 #- name: 获取first parent commit次数 # id: get-first-parent-commit-count # run: | # version=$(yq e .version pubspec.yaml | cut -d "+" -f 1) # recent_release_tag=$(git tag -l | grep $version | egrep -v "[-|+]" || true) # if [[ "x$recent_release_tag" == "x" ]]; then # echo "当前版本tag不存在,请手动生成tag." # exit 1 # fi # git log --oneline HEAD # first_parent_commit_count=$(git rev-list --first-parent --count $recent_release_tag..HEAD) # echo "count=$first_parent_commit_count" >> $GITHUB_OUTPUT - name: 从tag获取之前的version_code与beta版本号 id: get-previous-codes run: | version=$(yq e .version pubspec.yaml | cut -d "+" -f 1) last_tag=$(git tag --sort=committerdate | tail -1) if (echo $last_tag | grep -v "+"); then echo "Tag格式不正确" exit 1 elif (echo $last_tag | grep -v $version); then echo "当前版本tag不存在,请手动添加tag." exit 1 fi version_code=$(echo $last_tag | cut -d "+" -f 2) beta_code=$(echo $last_tag | cut -d "+" -f 1 | cut -d "." -f 4) beta_code=${beta_code:-0} echo "beta-code=$beta_code" >> $GITHUB_OUTPUT echo "version-code=$version_code" >> $GITHUB_OUTPUT - name: 更新版本号 id: version run: | # 读取版本号 version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1) let beta_code=${{ steps.get-previous-codes.outputs.beta-code }}+1 let version_code=${{ steps.get-previous-codes.outputs.version-code }}+1 # 构建新版本号 NEW_VERSION=${version_name}-beta.${beta_code}+${version_code} # 输出新版本号 echo "New version: $NEW_VERSION" # 设置新版本号为输出变量 echo "new_version=$NEW_VERSION" >>$GITHUB_OUTPUT android: name: Build CI (Android) needs: update_version runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: 构建Java环境 uses: actions/setup-java@v3 with: distribution: "zulu" java-version: "17" token: ${{secrets.GIT_TOKEN}} - name: 检查缓存 uses: actions/cache@v2 id: cache-flutter with: path: /root/flutter-sdk key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }} - name: 安装Flutter if: steps.cache-flutter.outputs.cache-hit != 'true' uses: subosito/flutter-action@v2 with: flutter-version: 3.24.0 channel: any - name: 下载项目依赖 run: flutter pub get - name: 解码生成 jks run: echo $KEYSTORE_BASE64 | base64 -di > android/app/vvex.jks env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} - name: 更新版本号 id: version run: | # 更新pubspec.yaml文件中的版本号 sed -i "s/version: .*/version: ${{ needs.update_version.outputs.new_version }}/g" pubspec.yaml - name: flutter build apk run: flutter build apk --release --split-per-abi env: KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}} - name: flutter build apk run: | sed -i "s/version: .*/version: ${{ needs.update_version.outputs.new_version }}0/g" pubspec.yaml flutter build apk --release env: KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD}} - name: 重命名应用 run: | version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1) for file in build/app/outputs/flutter-apk/app-*.apk; do if [[ $file =~ app-(.?*)release.apk ]]; then new_file_name="build/app/outputs/flutter-apk/Pili-${BASH_REMATCH[1]}${version_name}.apk" mv "$file" "$new_file_name" fi done - name: 上传 uses: actions/upload-artifact@v3 with: name: Pilipala-CI path: | build/app/outputs/flutter-apk/Pili-*.apk iOS: name: Build CI (iOS) needs: update_version runs-on: macos-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: 安装Flutter if: steps.cache-flutter.outputs.cache-hit != 'true' uses: subosito/flutter-action@v2.10.0 with: cache: true flutter-version: 3.24.0 - name: 更新版本号 id: version run: | # 更新pubspec.yaml文件中的版本号 sed -i "" "s/version: .*/version: ${{ needs.update_version.outputs.new_version }}/g" pubspec.yaml - name: flutter build ipa run: | flutter build ios --release --no-codesign ln -sf ./build/ios/iphoneos Payload zip -r9 app.ipa Payload/runner.app - name: 重命名应用 run: | version_name=$(yq e .version pubspec.yaml | cut -d "+" -f 1) for file in app.ipa; do new_file_name="build/Pili-${version_name}.ipa" mv "$file" "$new_file_name" done - name: 上传 uses: actions/upload-artifact@v3 with: if-no-files-found: error name: Pilipala-CI path: | build/Pili-*.ipa upload: runs-on: ubuntu-latest needs: - update_version - android - iOS steps: - uses: actions/download-artifact@v3 with: name: Pilipala-CI path: ./Pilipala-CI - name: Upload Pre-release uses: ncipollo/release-action@v1 with: name: ${{ needs.update_version.outputs.new_version }} token: ${{ secrets.GIT_TOKEN }} commit: main tag: ${{ needs.update_version.outputs.new_version }} prerelease: true allowUpdates: true artifacts: Pilipala-CI/*