skip to Main Content

I am trying to set a Github Action to check spotless.

My actions.yml

name: Java CI with Maven

on:
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: maven
      - name: Build with Maven
        run: mvn clean

In my pom.xml I have set spotless to trigger with clean lifecycle.

pom.xml (in spotless plugin):

<executions>
  <execution>
    <goals>
      <goal>check</goal>
    </goals>
    <phase>clean</phase>
  </execution>
</executions>

Full pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.sample.demo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-dependencies</artifactId>
                <version>3.2.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>spring-cloud-gcp-starter-data-firestore</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>spring-cloud-gcp-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-secretmanager</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>com.example.internal</groupId>
            <artifactId>internal</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>pl.project13.maven</groupId>
            <artifactId>git-commit-id-plugin</artifactId>
            <version>4.9.10</version>
            <type>maven-plugin</type>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.2.Final</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>artifact-registry</id>
            <url>artifactregistry://maven.pkg.dev/gcp-project-name/private-repo</url>
        </repository>
    </repositories>

    <build>
        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>4.9.10</version>
                <executions>
                    <execution>
                        <id>get-the-git-infos</id>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>validate-the-git-infos</id>
                        <goals>
                            <goal>validateRevision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeOnlyProperties>
                        <property>git.branch</property>
                        <property>git.commit.id</property>
                        <property>git.closest.tag.name</property>
                    </includeOnlyProperties>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.diffplug.spotless</groupId>
                <artifactId>spotless-maven-plugin</artifactId>
                <version>2.22.8</version>
                <configuration>
                    <formats>
                        <format>
                            <includes>
                                <include>src/**/*.java</include>
                            </includes>
                            <trimTrailingWhitespace/>
                            <endWithNewline/>
                            <indent>
                                <spaces>true</spaces>
                                <spacesPerTab>4</spacesPerTab>
                            </indent>
                        </format>
                    </formats>
                    <java>
                        <removeUnusedImports />
                        <googleJavaFormat>
                            <version>1.15.0</version>
                            <style>AOSP</style>
                            <reflowLongStrings>true</reflowLongStrings>
                        </googleJavaFormat>
                    </java>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <phase>clean</phase>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.2.Final</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.24</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>

        <extensions>
            <extension>
                <groupId>com.google.cloud.artifactregistry</groupId>
                <artifactId>artifactregistry-maven-wagon</artifactId>
                <version>2.1.4</version>
            </extension>
        </extensions>
    </build>

</project>

Everything works as it should, except all dependent JARs are being pulled almost every time(cache helps if commits are close together). This is a problem because the project has dependencies from private GCP artifact repo, which the runner cannot access.

This causes what should be a 30s runtime to almost 3 minutes repeatedly attempting to connect to the private maven repository.


I have tried removing the cache for maven, changed to mvn spotless:check hoping to directly trigger spotless but the runner keeps trying to pull the dependencies.


What maven lifecycle should I use to avoid pulling the JARs (atleast from the private repo). Is there a better way to run spotless and speed this up?

2

Answers


  1. I do believe you have misconfigured something in project pom.

    First of all, spotless-maven-plugin does not expect any dependency resolution to occur prior it’s execution, so the only two things need to happen:

    • maven needs to construct project object model, in order to do that it needs to resolve parents and dependency management (resolve imports)
    • maven needs to download plugin and it’s dependencies

    If you have configured your project like:

    <repositories>
        <repository>
            <id>GCP</id>
            <name>GCP</name>
            <url>some url</url>
        </repository>
    </repositories>
    

    you got into typical maven trap: repositories configured via pom.xml or settings.xml always take precedence over maven central, that means that when maven needs to download something it tries to use configured repository first and only in case of failure it will try maven central. The options are:

    1. add maven central first to your repository list
    2. activate your private repositories via maven profile
    Login or Signup to reply.
  2. I was getting the same error [ERROR] Failed to execute goal com.diffplug.spotless:spotless-maven-plugin:2.27.1:check (spotless-check) on project flink-examples-batch_2.12: The following files had format violations: while building Flink examples
    enter image description here
    enter image description here

    I used the below command to check spotless

    E:Flinkflink-master1flink-examples>mvn spotless:check
    

    Then I ran the command ‘mvn spotless:apply‘ to fix these violations.

    E:Flinkflink-master1flink-examples>mvn spotless:apply
    E:Flinkflink-master1flink-examples>mvn clean package
    

    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search