如何通过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
相关产品推荐
相关产品推荐

