You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用应用安装令牌对GitHub Package Registry进行身份验证并解决跨仓库Gradle包下载400错误问题?

GitHub Package Registry 应用安装令牌相关问题解答

1. 如何使用应用安装令牌在GitHub Package Registry中完成身份验证?

要使用应用安装令牌完成GitHub Package Registry的身份验证,你可以按以下步骤操作:

  • 创建并配置GitHub App
    先在GitHub上创建一个组织级别的GitHub App,给它分配对应权限:如果只是读取包,勾选Packages权限下的Read;如果需要推送包,就选Read and write。如果你的包关联到特定私有仓库,还要给App分配该仓库的Contents读取权限(按需调整)。

  • 生成应用安装令牌
    将GitHub App安装到你的组织或目标仓库后,你可以在App的安装页面手动生成临时令牌,或者通过GitHub API调用POST /app/installations/{installation_id}/access_tokens来生成,请求体里可以指定具体权限范围,确保包含packages:readpackages:write

  • 在工具中配置令牌
    以Gradle为例,在build.gradlesettings.gradle中配置maven仓库时,注意用户名必须是x-access-token,密码填你的应用安装令牌:

    repositories {
        maven {
            url = uri("https://maven.pkg.github.com/你的组织名/目标仓库名")
            credentials {
                username = "x-access-token"
                password = "你的应用安装令牌"
            }
        }
    }
    

    其他工具(如Maven、npm)的配置逻辑类似,用户名固定为x-access-token,令牌作为密码使用。


2. 解决Gradle使用组织关联应用安装令牌下载包时的400错误

你遇到的400 Bad Request错误,大概率是配置细节或权限问题导致的——毕竟你已经在Terraform中成功使用过同类型令牌,我给你几个排查和解决的方向:

先排查核心配置细节

  • 检查仓库URL正确性
    确保Gradle中配置的仓库URL是https://maven.pkg.github.com/组织名/包所在的仓库名,不能直接写包名,必须指向存储包的具体仓库,URL写错是常见的400诱因。
  • 确认用户名必须是x-access-token
    这是GitHub Package Registry的硬性要求,如果你填了组织名或其他值,肯定会返回400,一定要把credentials里的username设为x-access-token
  • 检查令牌有效期
    应用安装令牌默认有效期只有1小时,如果你是复用了之前生成的令牌,很可能已经过期了。在GitHub Actions中使用的话,一定要动态生成新令牌,不要用静态存储的过期令牌。

验证权限配置

  • 确认GitHub App的权限范围
    登录GitHub,查看你的App安装信息,确保它被授予了目标仓库的Packages: Read权限,以及仓库的Contents: Read权限(如果包是私有仓库的话)。生成令牌时,也要确保请求的权限包含packages:read

GitHub Actions中的最佳实践

在Actions中动态生成令牌可以避免过期问题,推荐使用官方的actions/create-github-app-token Action来生成,示例Workflow如下:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 生成组织级应用安装令牌
        id: generate-token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ secrets.YOUR_APP_ID }}
          private-key: ${{ secrets.YOUR_APP_PRIVATE_KEY }}
          owner: 你的组织名
          repositories: 包所在的仓库名
          permissions: >-
            {
              "packages": "read",
              "contents": "read"
            }
      - name: 构建项目
        env:
          GH_PKG_TOKEN: ${{ steps.generate-token.outputs.token }}
        run: ./gradlew build --refresh-dependencies

对应的Gradle配置可以读取环境变量:

repositories {
    maven {
        url = uri("https://maven.pkg.github.com/你的组织名/包所在仓库名")
        credentials {
            username = "x-access-token"
            password = System.getenv("GH_PKG_TOKEN")
        }
    }
}

最后尝试清理缓存

如果以上都没问题,可以尝试清理Gradle的依赖缓存,避免缓存的旧配置干扰:

./gradlew clean build --refresh-dependencies

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

火山引擎 最新活动