setup test env (#18) #60
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: NekoJS CI/CD Pipeline | |
| on: | |
| push: | |
| branches: [ "master" ] | |
| pull_request: | |
| branches: [ "master" ] | |
| jobs: | |
| # ========================================== | |
| # 阶段 1:分析 Commit 信息,决定发版策略 | |
| # ========================================== | |
| analyze-commit: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| is_release: ${{ steps.match.outputs.is_release }} | |
| version: ${{ steps.match.outputs.version }} | |
| steps: | |
| - name: Extract version from commit message | |
| id: match | |
| run: | | |
| # 开启正则忽略大小写,防止写了 "Update" 导致匹配失败 | |
| shopt -s nocasematch | |
| # 注意:如果是 pull_request,head_commit 可能是空的,这会自动走向 dev 分支 | |
| COMMIT_MSG="${{ github.event.head_commit.message }}" | |
| REGEX="update ([0-9a-zA-Z.-]+)" | |
| if [[ "$COMMIT_MSG" =~ $REGEX ]]; then | |
| echo "Matched version: ${BASH_REMATCH[1]} -> Going for RELEASE" | |
| echo "is_release=true" >> $GITHUB_OUTPUT | |
| echo "version=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT | |
| else | |
| echo "No 'update' pattern found -> Going for DEV BUILD" | |
| echo "is_release=false" >> $GITHUB_OUTPUT | |
| fi | |
| # ========================================== | |
| # 阶段 2:执行构建与分发 | |
| # ========================================== | |
| build-and-distribute: | |
| needs: analyze-commit | |
| runs-on: ubuntu-latest | |
| # 给 Release 写入权限 | |
| permissions: | |
| contents: write | |
| steps: | |
| # --- 下面这部分是公共流程(无论发版还是开发都要走) --- | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # 获取完整历史以生成 Changelog | |
| - name: Set up JDK 25 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' | |
| distribution: 'temurin' | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v3 | |
| - name: Make gradlew executable | |
| run: chmod +x ./gradlew | |
| # 【关键修复】加入 clean,彻底清空可能被误提交的旧 jar | |
| - name: Build Mod | |
| run: ./gradlew clean build | |
| # --- 【仅限开发版】重命名:追加 -dev-hash --- | |
| # 【关键修复】此步骤独立,发版时完全不执行,杜绝误改名 | |
| - name: Rename Dev Artifacts | |
| if: needs.analyze-commit.outputs.is_release == 'false' | |
| run: | | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| cd build/libs | |
| for f in *.jar; do | |
| if [[ $f != *"-sources.jar"* && $f != *"-dev"* && $f != *"-plain.jar"* ]]; then | |
| mv "$f" "${f%.jar}-dev-${SHORT_SHA}.jar" | |
| fi | |
| done | |
| # --- 【仅限开发版】上传产物 --- | |
| - name: Upload Dev Artifact | |
| if: needs.analyze-commit.outputs.is_release == 'false' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: NekoJS-Dev-Build | |
| path: build/libs/*.jar | |
| retention-days: 14 | |
| # --- 【仅限发版】生成更新日志 --- | |
| - name: Generate Changelog | |
| if: needs.analyze-commit.outputs.is_release == 'true' | |
| id: changelog | |
| run: | | |
| PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") | |
| if [ -z "$PREVIOUS_TAG" ]; then | |
| COMMITS=$(git log --pretty=format:"* %s (%h)") | |
| else | |
| COMMITS=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"* %s (%h)") | |
| fi | |
| # 处理多行文本输出的 GitHub Actions 写法 | |
| EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
| echo "notes<<$EOF" >> $GITHUB_OUTPUT | |
| echo "$COMMITS" >> $GITHUB_OUTPUT | |
| echo "$EOF" >> $GITHUB_OUTPUT | |
| # --- 【仅限发版】创建 GitHub Release --- | |
| - name: Create GitHub Release | |
| if: needs.analyze-commit.outputs.is_release == 'true' | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: v${{ needs.analyze-commit.outputs.version }} | |
| name: NekoJS v${{ needs.analyze-commit.outputs.version }} | |
| body: | | |
| ### 📝 更新日志 (Changelog) | |
| ${{ steps.changelog.outputs.notes }} | |
| # 【关键修复】明确排除带 dev 的文件,防止任何意外 | |
| files: | | |
| build/libs/*.jar | |
| !build/libs/*-dev-*.jar | |
| # --- 【仅限发版】自动推送至 CurseForge / Modrinth --- | |
| - name: Publish to Mod Platforms | |
| if: needs.analyze-commit.outputs.is_release == 'true' | |
| env: | |
| CURSEFORGE_KEY: ${{ secrets.CURSEFORGE_KEY }} | |
| MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} | |
| CHANGELOG: ${{ steps.changelog.outputs.notes }} | |
| run: ./gradlew publishUnified |