You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Gradle和GitHub Actions发布无时间戳且不重复的GitHub Packages包

解决方案

一、移除资产文件名中的时间戳

Spring Boot的bootJar任务默认会给SNAPSHOT版本的Jar包添加时间戳后缀,要生成标准格式的文件名,直接在build.gradle中显式配置bootJar任务的输出规则:

修改build.gradle,添加以下配置:

tasks.named('bootJar') {
    // 强制生成 "artifactId-version.jar" 格式的文件名
    archiveFileName = "${project.ext.name}-${project.ext.version}.jar"
    // 针对SNAPSHOT版本,可额外禁用内置时间戳逻辑
    version = project.ext.version
}

配置完成后,生成的Jar包文件名会固定为app_name-0.1.0-feature_name-SNAPSHOT.jar这类标准格式,不再包含随机时间戳。

二、禁止重复发布已存在的版本

要彻底避免覆盖或重复创建已发布的版本,需在GitHub Actions工作流中先检查目标版本是否已存在于GitHub Packages,再决定是否执行发布步骤。

修改你的GitHub Actions工作流,在Print App version步骤之后、Validate Gradle wrapper步骤之前,添加版本检查逻辑:

- name: Check if version exists in GitHub Packages
  run: |
    # 拼接GitHub Packages中对应版本的检查URL(替换为实际参数)
    PACKAGE_URL="https://maven.pkg.github.com/org_name/repo_name/com/xx/app_name/${{env.APP_VERSION_NAME}}"
    # 调用GitHub API验证版本是否存在
    RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -u "${{github.actor}}:${{secrets.GITHUB_TOKEN}}" "$PACKAGE_URL")
    if [ "$RESPONSE" -eq 200 ]; then
      echo "版本 ${{env.APP_VERSION_NAME}} 已存在于GitHub Packages,终止发布流程。"
      exit 1
    else
      echo "版本 ${{env.APP_VERSION_NAME}} 不存在,继续执行发布。"
    fi

关键参数替换说明:

  • 将org_name替换为你的GitHub组织/用户名,repo_name替换为仓库名称;
  • com/xx/app_name是groupId(将点替换为斜杠)+ artifactId的组合,需与build.gradle中的配置完全一致。

注:GitHub Packages对正式版本(非SNAPSHOT)默认禁止覆盖,但允许SNAPSHOT版本重复上传,上述检查逻辑对两种版本均适用,能从流程层面彻底阻断重复发布。

内容的提问来源于stack exchange,提问作者Stefano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:13:10