Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GitHub packages: Single Maven repository for GitHub organization

I would like to use GitHub packages to store Maven artifacts for several repositories in a GitHub organization. Currently, it appears that for each project, a separate (Maven) repository configuration entry is required to point to that (GitHub) repository's Maven repository:

<repository>
  <id>github</id>
  <name>GitHub OWNER Apache Maven Packages</name>
  <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
</repository>

The corresponding configuration for the Maven project that would be published is:

<distributionManagement>
   <repository>
     <id>github</id>
     <name>GitHub OWNER Apache Maven Packages</name>
     <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
   </repository>
</distributionManagement>

Is there a way to configure the packages to all go to a single REPOSITORY? Setting the REPOSITORY to either a different existing or non-existing (GitHub) repository in the organization fails the build, as does removing the /REPOSITORY entirely

like image 948
Ivan G. Avatar asked Jul 22 '20 19:07

Ivan G.


People also ask

Are GitHub packages free?

About billing for GitHub PackagesGitHub Packages usage is free for public packages. For private packages, each account on GitHub.com receives a certain amount of free storage and data transfer, depending on the product used with the account. Any usage beyond the included amounts is controlled by spending limits.

How do I publish a maven artifact to GitHub?

Create a branch called mvn-repo to host your maven artifacts. Use the github site-maven-plugin to push your artifacts to github. Configure maven to use your remote mvn-repo as a maven repository.


1 Answers

Personal Access Token

secrets.GITHUB_TOKEN is defined by default but it is only sufficient to deploy to the current repository.

To make it work across repositories you'll need to define a new Personal Access Token in:

  • Settings > Developer Settings > Personal Access Tokens.

Select write:packages for the scope and all the repo scopes should be automatically selected for you.

enter image description here

Repository / Organisation secrets

Next, define a secret in your organisation or each of the repositories you need to publish packages from.

Give it a name (i.e. DEPLOY_GITHUB_TOKEN) and set its value to the Personal Access Token created in the previous step.

enter image description here

Repository secrets are defined in repository Settings > Secrets. There's a similar section for the organisation.

GitHub Action

Finally, make sure you pass your Personal Access Token to the deployment step as an environment variable called GITHUB_TOKEN.

In the example below, it's set to the value of the DEPLOY_GITHUB_TOKEN secret defined in the previous step.

name: Build

on:
  release:
    types: [created]
jobs:
  build:
    name: Build & Deploy
    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: Build with Maven
        run: mvn --batch-mode --update-snapshots install

      - name: Deploy to GitHub
        run: mvn --batch-mode -DskipTests -DuseGitHubPackages=true deploy
        env:
          GITHUB_TOKEN: ${{ secrets.DEPLOY_GITHUB_TOKEN }}

Since I used a dedicated Maven profile for the GitHub package repository distribution management, I also activated it with -DuseGitHubPackages=true.

Maven profile

In the profile example below, I configured distribution management to use the external/shared repository vlingo/vlingo-platform just like suggested in @Danny Varod's answer.

<!-- pom.xml -->
<project>
  <!-- ... -->

  <profiles>
    <profile>
      <id>github</id>
      <activation>
        <property>
          <name>useGitHubPackages</name>
          <value>true</value>
        </property>
      </activation>
      <distributionManagement>
        <repository>
          <id>github</id>
          <name>GitHub Packages</name>
          <url>https://maven.pkg.github.com/vlingo/vlingo-platform</url>
        </repository>
      </distributionManagement>
    </profile>
  </profiles>
</project>

Cross posted from: https://dev.to/jakub_zalas/how-to-publish-maven-packages-to-a-single-github-repository-3lkc

A working example can be found in vlingo repositories: https://github.com/vlingo/vlingo-platform/packages

like image 84
Jakub Zalas Avatar answered Oct 02 '22 00:10

Jakub Zalas