从 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 中的 &lt;id&gt;),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?

通过GitHub Action自动部署Maven项目

将web前端项目部署到github,在hbuilderx中部署github中的项目对Github加速

将web前端项目部署到github,在hbuilderx中部署github中的项目对Github加速

项目部署github实现线上阅览