[Gitlab CI][maven] How to proper configure a maven project to get deploy artifacts in gitlab.com

Hello, I am trying, without success, to use gitlab to host my maven project for public artifact deployments.

here is my .gitlab-ci.yml file

 # This file is a template, and might need editing before it works on your project.
---
# Build JAVA applications using Apache Maven (http://maven.apache.org)
# For docker image tags see https://hub.docker.com/_/maven/
#
# For general lifecycle information see https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
# 
# This template will build and test your projects as well as create the documentation.
# 
# * Caches downloaded dependencies and plugins between invocation.
# * Does only verify merge requests but deploy built artifacts of the
#   master branch.
# * Shows how to use multiple jobs in test stage for verifying functionality
#   with multiple JDKs.
# * Uses site:stage to collect the documentation for multi-module projects.
# * Publishes the documentation for `master` branch.

variables:
  # This will supress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  # `installAtEnd` and `deployAtEnd`are only effective with recent version of the corresponding plugins.
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

# Cache downloaded dependencies and plugins between builds.
cache:
  paths:
    - /root/.m2/repository/

# This will only validate and compile stuff and run e.g. maven-enforcer-plugin. 
# Because some enforcer rules might check dependency convergence and class duplications
# we use `test-compile` here instead of `validate`, so the correct classpath is picked up.
.validate: &validate
  stage: build
  script:
    - 'mvn $MAVEN_CLI_OPTS test-compile'

# For merge requests do not `deploy` but only run `verify`.
# See https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
.verify: &verify
  stage: test
  script:
    - 'mvn $MAVEN_CLI_OPTS verify site site:stage'
  except:
    - master

# Validate merge requests using JDK8
validate:jdk8:
  <<: *validate
  image: maven:3.3.9-jdk-8

# Verify merge requests using JDK8
verify:jdk8:
  <<: *verify
  image: maven:3.3.9-jdk-8


# For `master` branch run `mvn deploy` automatically.
# Here you need to decide whether you want to use JDK7 or 8.
# To get this working you need to define a volume while configuring your gitlab-ci-multi-runner.
# Mount your `settings.xml` as `/root/.m2/settings.xml` which holds your secrets.
# See https://maven.apache.org/settings.html
deploy:jdk8:
  # Use stage test here, so the pages job may later pickup the created site.
  stage: test
  script:
    - 'mvn $MAVEN_CLI_OPTS deploy site site:stage'
  only:
    - master
  # Archive up the built documentation site.
  artifacts:
    paths:
    - target/staging
  image: maven:3.3.9-jdk-8


pages:
  image: busybox:latest
  stage: deploy
  script:
    # Because Maven appends the artifactId automatically to the staging path if you did define a parent pom,
    # you might need to use `mv target/staging/YOUR_ARTIFACT_ID public` instead.
    - mv target/staging public
  dependencies:
    - deploy:jdk8
  artifacts:
    paths:
    - public
  only:
    - master

and here are the relevant parts of my pom file

<distributionManagement>
        <site>
            <id>gitlab-pages-site</id>
            <name>Deployment through GitLab's site deployment plugin</name>
            <url>site/${project.version}</url>
        </site>
        <repository>
            <id>gitlab.public</id>
            <url>site/${project.version}</url>
        </repository>
    </distributionManagement>
<build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>${main-class}</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <skipDeploy>true</skipDeploy>
                </configuration>
            </plugin>
        </plugins>
    </build>

I am obtaining a lot of errors in the runner at gitlab.com

.....
26623 [WARNING] Cannot get the branch information from the git repository: 
Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref
.....
37654 [INFO] ------------------------------------------------------------------------
37659 [INFO] BUILD FAILURE
37659 [INFO] ------------------------------------------------------------------------
.....
37817 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project NMQC_: Failed to deploy artifacts/metadata: Cannot access site/0.5.1 with type default using the available connector factories: BasicRepositoryConnectorFactory: Cannot access site/0.5.1 using the registered transporter factories: WagonTransporterFactory: Unsupported transport protocol -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project NMQC_: Failed to deploy artifacts/metadata: Cannot access site/0.5.1 with type default using the available connector factories: BasicRepositoryConnectorFactory

I think the runner has no access to site, but how can i declare this, I found no guide at all on how to properly configure this

Thanks for your time
Alex

1 Like

Forget automatic maven script, it is made for web applications where you add your own site. The following is the working .gitlab-ci.yml file

image: maven:3.3.9-jdk-8
cache:
  paths:
    - /root/.m2/repository/
before_script:
  - apt-get update -y && apt-get upgrade -y
    
NMQC-build:
  script:
    - mvn install -B
  artifacts:
    name: "NMQC"
    paths:
      - ./target/NMQC*.jar

Thanks!

Did you replace the whole template for what you posted? o you just replaced a part of it?

Alejandro

The whole template, you just need to understand now each line to adapt it to your needs