Github Actions中使用Gradle Jib插件推送镜像至GHCR失败求助
Github Actions + Gradle Jib 推送镜像到GHCR 示例及认证问题解决
完整工作流示例(.github/workflows/jib-ghcr.yml)
name: Build and Push to GHCR on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest # 必须配置推送GHCR的权限 permissions: contents: read packages: write steps: - uses: actions/checkout@v4 - name: 配置JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: 用Jib构建并推送镜像 env: REGISTRY: ghcr.io # 自动使用当前仓库路径作为镜像名 IMAGE_NAME: ${{ github.repository }} # Actions自动生成的令牌,无需手动创建 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./gradlew jib
Gradle配置示例
Kotlin DSL(build.gradle.kts)
plugins { java id("com.google.cloud.tools.jib") version "3.4.0" } jib { from { image = "eclipse-temurin:17-jre" } to { // 读取环境变量拼接镜像地址 image = "${System.getenv("REGISTRY")}/${System.getenv("IMAGE_NAME")}" tags = setOf("latest", project.version.toString()) } container { ports = listOf("8080/tcp") mainClass = "com.example.Main" // 替换为你的主类 } auth { // 使用Actions提供的用户名和令牌认证 username = System.getenv("GITHUB_ACTOR") password = System.getenv("GITHUB_TOKEN") } }
Groovy DSL(build.gradle)
plugins { id 'java' id 'com.google.cloud.tools.jib' version '3.4.0' } jib { from { image = 'eclipse-temurin:17-jre' } to { image = "${System.getenv('REGISTRY')}/${System.getenv('IMAGE_NAME')}" tags = ['latest', "${project.version}"] } container { ports = ['8080/tcp'] mainClass = 'com.example.Main' // 替换为你的主类 } auth { username = System.getenv('GITHUB_ACTOR') password = System.getenv('GITHUB_TOKEN') } }
关键注意事项(解决认证失败问题)
- 权限设置:工作流中必须声明
packages: write权限,否则GITHUB_TOKEN没有推送镜像到GHCR的权限,这是本地成功但CI失败的常见原因。 - 认证信息:直接使用Actions自动生成的
GITHUB_TOKEN和GITHUB_ACTOR,无需手动创建个人访问令牌(PAT),避免权限范围错误或令牌泄露。 - 镜像路径:确保镜像名格式为
ghcr.io/用户名/仓库名,通过${github.repository}可以自动获取正确路径。
内容的提问来源于stack exchange,提问作者Tobias Neubert
相关产品推荐
相关产品推荐

