如何在Docker中借助GITHUB_TOKEN在GHA上运行Maven
解决方案
核心思路
GitHub 提供的secrets.GITHUB_TOKEN可直接用于 Maven 访问 GitHub Packages,无需依赖个人令牌。核心是在 GitHub Action 中动态将该令牌注入 Maven 认证配置,同时确保令牌拥有足够权限。
方案一:动态生成 Maven settings.xml
- 准备配置模板
在仓库根目录创建settings-template.xml,预留用户名和令牌的占位符(需与 pom.xml 中仓库的id保持一致):
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>github</id> <username>${GITHUB_USERNAME}</username> <password>${GITHUB_TOKEN}</password> </server> </servers> </settings>
- 在 Action 中生成有效配置
通过sed命令替换模板占位符,生成可直接使用的 settings.xml:
jobs: build: runs-on: ubuntu-latest permissions: packages: read # 授予GITHUB_TOKEN读取GitHub Packages的权限 contents: read steps: - name: 检出代码 uses: actions/checkout@v4 - name: 生成Maven配置文件 run: | sed -e "s/\${GITHUB_USERNAME}/${{ github.actor }}/" \ -e "s/\${GITHUB_TOKEN}/${{ secrets.GITHUB_TOKEN }}/" \ settings-template.xml > ~/.m2/settings.xml # 后续执行Maven构建或Docker构建步骤
方案二:Docker 构建时传递认证参数
若在 Docker 容器内执行 Maven 构建,可通过 Build Args 直接注入认证信息,无需单独维护配置模板:
- 修改 Dockerfile
FROM maven:3.8.6-openjdk-17 AS build # 接收外部传入的认证参数 ARG GITHUB_USERNAME ARG GITHUB_TOKEN # 动态生成Maven配置 RUN echo '<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><servers><server><id>github</id><username>'"$GITHUB_USERNAME"'</username><password>'"$GITHUB_TOKEN"'</password></server></servers></settings>' > /root/.m2/settings.xml COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # 后续镜像打包步骤...
- 在 Action 中传递参数
- name: 构建并推送Docker镜像到AWS uses: docker/build-push-action@v4 with: context: . push: true tags: <你的AWS ECR仓库地址>:latest build-args: | GITHUB_USERNAME=${{ github.actor }} GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
方案三:Maven 命令行直接传递认证信息
无需修改或生成配置文件,直接通过命令行参数覆盖服务器认证配置:
mvn clean package -DskipTests \ -Dserver.github.username=${{ github.actor }} \ -Dserver.github.password=${{ secrets.GITHUB_TOKEN }}
注意事项
GITHUB_USERNAME可使用${{ github.actor }}(触发 Action 的用户),或固定填写github-actions(GitHub 官方机器人账户),两者均可配合GITHUB_TOKEN完成认证。- 必须在 Workflow 中声明
permissions字段,确保GITHUB_TOKEN拥有packages:read权限(拉取依赖);若需推送 Packages,需添加packages:write权限。
内容的提问来源于stack exchange,提问作者patricK
相关产品推荐
相关产品推荐

