web-dev-qa-db-fra.com

déployer sur Github Package Registry à partir de Github Action

Je souhaite déployer dans un registre de packages GitHub à partir d'une action GitHub d'un dépôt public.

J'ai un fichier yml pour un workflow:

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

J'utilise Leiningen pour construire le projet et générer un fichier POM. Ensuite, je voudrais utiliser Maven pour déployer l'artefact dans le registre des packages GitHub.

Cela échoue sur la commande Deploy (j'ai remplacé les informations personnelles par ...):

[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.

Je vois que l'authentification a échoué. J'ai également essayé avec cette étape avec les mêmes résultats:

run: mvn deploy -Dserver.username=... -Dserver.password=${{ secrets.GITHUB_TOKEN }} -DskipTests

Je ne veux pas fournir de nom d'utilisateur/mot de passe ou jeton car il s'agit d'un référentiel public. Y a-t-il un moyen de publier de toute façon?

Merci!

10
erdos

Pour le faire fonctionner, vous devez faire deux choses:

  1. Ajoutez ce qui suit à votre 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>

source: https://help.github.com/en/articles/configuring-Apache-maven-for-use-with-github-package-registry#publishing-a-package

  1. Configurez un fichier de paramètres Maven avec le nom d'utilisateur/mot de passe depuis votre action de génération. Dans mon cas, j'ai fait quelque chose comme ça:
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

Malheureusement, je ne pense pas que vous puissiez transmettre le nom d'utilisateur/mot de passe comme arguments à Maven et vous devez donc configurer le fichier de paramètres à la place. source: Est-il possible de passer un mot de passe dans Maven Deploy en ligne de commande?

Enfin, je confirme que cela ne fonctionne que pour les artefacts non SNAPSHOT. Lorsque j'essaie de déployer une version INSTANTANÉE, il échoue avec une erreur 400 comme décrit.

5
lmsurprenant

J'ai eu un problème similaire pour mon projet. Chaque fois que je courais mvn deploy, il a échoué avec:

Impossible de transférer les métadonnées ... de/vers github ( https://maven.pkg.github.com/.../ .. .): 400

Cependant, sur un coup de tête, j'ai changé le numéro de version de mon projet de 0.0.3-INSTANTANÉ à 0.0. 4 et après cela, cela a fonctionné.

Peut-être que cela fonctionnera aussi pour vous.

3
tawalaya

Eh bien, selon:

Je pense que vous pourriez simplement faire comme ceci:

  1. Ajoutez ci-dessous à votre flux de travail
- name: Deploy to Github Package Registry
    env:
      GITHUB_USERNAME: x-access-token
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    run:
      mvn --settings settings.xml deploy
  1. Et puis ajoutez settings.xml à votre projet
<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>

Cela fonctionne pour moi, j'espère que cela vous aidera.

2
Yur Ree

TL; DR: validez simplement ce qui suit dans .github/workflows/mavenpublish.yml et créez une version via la page Web GitHub pour déclencher le processus:

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}"

Quelques informations supplémentaires:

J'ai construit la même chose avant pour Jenkins et je peux vous dire que vous n'avez pas besoin de créer un settings.xml ni adapter votre pom.xml dans votre repo.

Vous pouvez même éviter d'écrire votre jeton GitHub dans le settings.xml (qui est plus sûr).

De plus, vous n'avez pas besoin d'ajouter manuellement votre référentiel et votre nom d'utilisateur, ceux-ci peuvent être lus à partir de l'environnement.

Si vous voulez qu'il s'appuie sur Push, changez simplement les lignes derrière on: à [Push].

Voici un exemple réel .

0
schnatterer