从 Github Action 部署到 Github 包注册表
Posted
技术标签:
【中文标题】从 Github Action 部署到 Github 包注册表【英文标题】:deploy to Github Package Registry from Github Action 【发布时间】:2020-01-02 19:29:14 【问题描述】:我想从公共 repo 的 GitHub Action 部署到 GitHub Package Registry。
我有一个工作流的 yml 文件:
name: My CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install dependencies
run: lein deps
- name: Run tests
run: lein test
- name: Generate pom
run: lein pom
- name: Deploy
run: mvn deploy
我使用 Leiningen 构建项目并生成 POM 文件。然后我想使用 Maven 将工件部署到 GitHub 包注册表。
Deploy
命令失败(我已将个人信息替换为...
):
[WARNING] Could not transfer metadata ... from/to github (https://maven.pkg.github.com/.../...): Not authorized
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.343 s
[INFO] Finished at: 2019-08-29T13:08:42Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project ...: Failed to retrieve remote metadata .../maven-metadata.xml: Could not transfer metadata ... from/to github (https://maven.pkg.github.com/.../...): Not authorized -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
##[error]Process completed with exit code 1.
我看到身份验证失败。我也尝试了这一步,结果相同:
run: mvn deploy -Dserver.username=... -Dserver.password=$ secrets.GITHUB_TOKEN -DskipTests
我不想提供用户名/密码或令牌,因为这是一个公共存储库。有没有办法发布?
谢谢!
【问题讨论】:
是否可以在命令行中指定env: GITHUB_TOKEN=$ secrets.GITHUB_TOKEN
,然后使用$GITHUB_TOKEN
?我还没有进入 GitHub Actions 测试版,所以我无法自己测试。
【参考方案1】:
要让它发挥作用,你需要做两件事:
-
将以下内容添加到您的 pom.xml:
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub OWNER Apache Maven Packages</name>
<url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
</repository>
</distributionManagement>
来源:https://help.github.com/en/articles/configuring-apache-maven-for-use-with-github-package-registry#publishing-a-package
-
使用构建操作中的用户名/密码设置 Maven 设置文件。
就我而言,我做了这样的事情:
name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Deploy to Github Package Registry
env:
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
run: |
mkdir ~/.m2
echo "<settings><servers><server><id>github</id><username>OWNER</username><password>$GITHUB_TOKEN</password></server></servers></settings>" > ~/.m2/settings.xml
mvn deploy
不幸的是,我认为您不能将用户名/密码作为参数传递给 Maven,因此您需要设置设置文件。 来源:Is it possible to pass a password in Maven Deploy in the command line?
最后,我确认这仅适用于非 SNAPSHOT 工件。当我尝试部署 SNAPSHOT 版本时,它会失败并出现 400 错误,如所述。
【讨论】:
【参考方案2】:TL;DR:只需将以下内容提交到 .github/workflows/mavenpublish.yml
并通过 GitHub 网页创建发布以触发流程:
name: Maven Package
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Deploy to Github Package Registry
env:
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
run: |
mkdir -p ~/.m2
echo "<settings><servers><server><id>gh</id><username>$(echo "$GITHUB_REPOSITORY" | awk -F / 'print $1')</username><password>\$env.GITHUB_TOKEN</password></server></servers></settings>" > ~/.m2/settings.xml
REPO="gh::default::https://maven.pkg.github.com/$GITHUB_REPOSITORY"
mvn deploy -DaltReleaseDeploymentRepository="$REPO" -DaltSnapshotDeploymentRepository="$REPO"
更多信息:
我在 for Jenkins 之前已经构建了相同的东西,并且可以告诉你,你不需要创建 settings.xml
也不需要在你的 repo 中调整你的 pom.xml
。
您甚至可以避免将您的 GitHub 令牌写入settings.xml
(这样更安全)。
另外,你不需要手动添加你的 repo 和用户名,这些可以从环境中读取。
如果您希望它基于 push 构建,只需将 on:
后面的行更改为 [push]
。
这是real-life example。
【讨论】:
gh::default::
在 repo URL 中做了什么?
altReleaseDeploymentRepository
系统属性的格式如下:id::layout::url
。也就是说,gh
是 repo 的 id
(匹配 settings.xml
中的 <id>
),default
是布局。见maven.apache.org/plugins/maven-deploy-plugin/…【参考方案3】:
2020有一个更简单的方法。
首先,将分发配置添加到您的 pom.xml:
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub OWNER Apache Maven Packages</name>
<url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
</repository>
</distributionManagement>
id
必须是 github。
其次,在行动中使用actions/setup-java@v1
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Publish to GitHub Packages
env:
GITHUB_TOKEN: $ github.token
run: mvn deploy
【讨论】:
完全正确。您还可以将repository
id
更改为不同于github
的内容 - 您只需在java-version
下方的server-id: yourOtherIdHere
部分中添加另一个配置参数即可。【参考方案4】:
我的项目遇到了类似的问题。
每次我运行mvn deploy
时,都会失败:
无法从/到 github (https://maven.pkg.github.com/.../...) 传输元数据...:400
但是,一时兴起,我将项目的版本号从 0.0.3-SNAPSHOT 更改为 0.0.4 之后,它就起作用了。 p>
也许它也适合你。
【讨论】:
在我的项目中根本不起作用。无论我是部署 SNAPSHOT 还是非 SNAPSHOT 版本:github.com/m-m-m/base 在我看来,带有 github 包的 github 操作似乎是一种 alpha 状态。我已向 github 支持发送请求,但自 3 周以来没有收到任何反馈。【参考方案5】:嗯,根据:
maven command line how to point to a specific settings.xml for a single command? GitHub package registry as Maven repo - trouble uploading artifact我认为你可以这样做:
-
将以下内容添加到您的工作流程中
- name: Deploy to Github Package Registry
env:
GITHUB_USERNAME: x-access-token
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
run:
mvn --settings settings.xml deploy
-
然后将 settings.xml 添加到您的项目中
<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">
<activeProfiles>
<activeProfile>github</activeProfile>
</activeProfiles>
<profiles>
<profile>
<id>github</id>
<repositories>
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>github</id>
<name>GitHub OWNER Apache Maven Packages</name>
<url>https://maven.pkg.github.com/OWNER </url>
</repository>
</repositories>
</profile>
</profiles>
<servers>
<server>
<id>github</id>
<username>$env.GITHUB_USERNAME</username>
<password>$env.GITHUB_TOKEN</password>
</server>
</servers>
</settings>
它对我有用,我希望这会有所帮助。
【讨论】:
以上是关于从 Github Action 部署到 Github 包注册表的主要内容,如果未能解决你的问题,请参考以下文章
CI/CD 平台迁移实践:从 Travis-CI 转移到 Github Action
如何将 Jekyll 站点从 github repo 部署到我的 ftp?
将web前端项目部署到github,在hbuilderx中部署github中的项目对Github加速