Skip to content

setup test env (#18) #60

setup test env (#18)

setup test env (#18) #60

Workflow file for this run

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