为何Gradle Publish任务无法获取GitHub Action传递的密钥令牌
问题描述
已实现GitHub Workflow Actions将Spring Boot应用发布至GitHub Packages,但遵循官方Gradle文档操作后出现401 Unauthorized错误。核心问题是GitHub Action无法将环境变量传递给Gradle任务,导致无法通过System.getenv("GIT_CICD_TOKEN")获取令牌。
当前Workflow配置
- name: Publish package uses: gradle/gradle-build-action@v2 with: gradle-version: 8.5 arguments: Publish env: GIT_CICD_TOKEN: ${{ secrets.GIT_CICD_TOKEN }}
当前Gradle配置
plugins { id 'maven-publish' id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } publishing { repositories { maven { name = "GitHubPackages" url = "https://maven.pkg.github.com/organization_name/repo_name" credentials { username = 'myUserName' password = System.getenv("GIT_CICD_TOKEN") } } } publications { maven(MavenPublication) { artifact bootJar groupId = 'com.xx' artifactId = 'appName' version = '0.0.1-XXXX-SNAPSHOT' } } }
注:直接在password字段填入令牌字符串可正常发布,说明令牌本身有效。
解决建议
修正Workflow的env缩进问题
你的Workflow配置中env字段缩进错误,它必须与with同级,而非嵌套在with下方。错误的缩进会导致环境变量无法被正确注入Gradle进程。修正后的配置:- name: Publish package uses: gradle/gradle-build-action@v2 with: gradle-version: 8.5 arguments: Publish env: GIT_CICD_TOKEN: ${{ secrets.GIT_CICD_TOKEN }}改用Gradle项目属性传递令牌(更可靠)
放弃环境变量传递,直接通过Gradle的-P参数传入令牌作为项目属性,避免环境变量传递的潜在问题:- 调整Workflow配置:
- name: Publish package uses: gradle/gradle-build-action@v2 with: gradle-version: 8.5 arguments: -PgithubToken=${{ secrets.GIT_CICD_TOKEN }} Publish - 修改Gradle配置中的credentials部分:
credentials { username = 'myUserName' password = project.findProperty("githubToken") ?: System.getenv("GIT_CICD_TOKEN") }
- 调整Workflow配置:
使用GitHub默认的GITHUB_TOKEN
无需自定义令牌,GitHub Action提供的GITHUB_TOKEN默认拥有当前仓库的write:packages权限,无需额外配置权限:- 调整Workflow配置:
- name: Publish package uses: gradle/gradle-build-action@v2 with: gradle-version: 8.5 arguments: -PgithubToken=${{ secrets.GITHUB_TOKEN }} Publish - Gradle配置保持上面的修改即可。
- 调整Workflow配置:
验证令牌权限
若仍使用自定义令牌,确保GIT_CICD_TOKEN已开启write:packages权限,且对于组织仓库,令牌拥有目标仓库的访问权限。
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

