Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 52f

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3)

In a series of previous articles, I covered a lot about the “Argo CD Extension for Quarkus”.

As a base for this, I used my already existing Linux demo environment, including Quarkus and K3s (a lightweight certified Kubernetes distribution) and setup via Vagrant.

In my previous article, I described how I used the Argo CD CLI and UI in combination with an example GitHub repository containing a guestbook application.

In this article (part 3), I will continue with the “Getting started” part of the “Argo CD Extension for Quarkus”, in order to generate an Argo CD Application and Project as part of the Quarkus build.

You can also read more about how I:

  • Generated the Quarkus Helm charts out of the target folder.
  • Added files to the Quarkus project (the “kubernetes-quickstart” application) in my GitHub Private repository.
  • Created a GitHub personal access token.
  • Created an Argo CD Project in Kubernetes
  • Created an Argo CD Private Repository (via Declarative Setup) in Kubernetes.

Overview of my Linux demo environment, including Argo CD

Below, you can see an overview of my Linux demo environment, as described in my previous article:
[Quarkus – trying out the “Argo CD Extension for Quarkus” (part 2)]

This includes the Argo CD API Server and Argo CD CLI.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 53

For the Linux demo environment to start, from the Oracle VM VirtualBox Manager on my Windows laptop, I started the appliance (in “Headless Start” mode).

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 54

Once the VM was running, for executing later manual steps, I used vagrant ssh to connect into the running VM.

Using Quarkus Helm and ArgoCD

In my previous article, I already described how I added a project under version control system Git and pushed it on a GitHub Private repository.
[Quarkus – trying out the “Argo CD Extension for Quarkus” (part 1)]

Up till now, only file README.md is part of the project.

So, on my Windows laptop, I copied everything (except README.md and the target directory) from
C:\My\AMIS\MySharedFolder\kubernetes-quickstart
to
C:\My\AMIS\MySharedFolder\github\repositories\private\kubernetes-quickstart

Later on, I will be adding these files to the project in my GitHub Private repository.

Next, I returned to Quarkus and looked at the example: “How to configure a Continuous Delivery (CD) workflow using Quarkus Helm and ArgoCD”.

After configuring the Quarkus Helm extension, the generated Helm charts will be created at target/helm/kubernetes/demo folder and usually the target folder is ignored when pushing changes into GIT, so let’s configure the Quarkus Helm repository to create the Helm charts into another repository.

quarkus.helm.output-directory=../folder

Now, the Quarkus Helm extension will create the charts into the upper level project folder and will create a folder directory name.
[https://docs.quarkiverse.io/quarkus-helm/dev/example-argocd.html]

Looking at the content of file C:\My\AMIS\MySharedFolder\github\repositories\private\kubernetes-quickstart\.gitignore, indeed the target folder is ignored when pushing changes into GIT:
[only showing the first part]

#Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
release.properties
.flattened-pom.xml

…

Generate the Quarkus Helm charts out of the target folder

Up till now, I used a Quarkus project (the “kubernetes-quickstart” application) as described in my previous article about the “Helm Extension for Quarkus”.
[Quarkus – trying out the “Helm Extension for Quarkus”]

With regard to the generated Helm charts, the following directory is present on my Windows laptop:

C:\My\AMIS\MySharedFolder\kubernetes-quickstart\target\helm\kubernetes\kubernetes-quickstart

Next, in this shared folder, I navigated to github\repositories\private\kubernetes-quickstart\src\main\resources and changed the content of file application.properties to:
[in bold, I highlighted the changes]

quarkus.container-image.registry=localhost:8443
quarkus.container-image.username=mylocregusername
quarkus.container-image.password=mylocregpassword
quarkus.container-image.group=quarkus
quarkus.kubernetes.namespace=nl-amis-development
quarkus.kubernetes.ports."ports".container-port=8080
quarkus.kubernetes.ports."ports".host-port=8180
quarkus.kubernetes.ports."ports".node-port=30010
quarkus.kubernetes.replicas=5
quarkus.kubernetes.service-type=node-port
quarkus.helm.output-directory=../helm

Remark about quarkus.helm.output-directory:

Configuration property Type Default
quarkus.helm.output-directory
The output folder in which to place the Helm generated folder. The folder is relative to the target output directory in Quarkus that is also configurable using the property quarkus.package.output-directory. It also supports absolute paths. By default, it will be generated in the folder named “helm“.
Environment variable: QUARKUS_HELM_OUTPUT_DIRECTORY
string helm

[https://docs.quarkiverse.io/quarkus-helm/dev/index.html#quarkus-helm_quarkus-helm-output-directory]

As I did before, in order to generate the Helm resources, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart

mvn clean package -DskipTests

Next, I checked if the following directory was now present on my Windows laptop:

C:\My\AMIS\MySharedFolder\github\repositories\private\kubernetes-quickstart\helm\kubernetes\kubernetes-quickstart

And indeed it was.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 55

By the way, initially I did receive the following error when I ran the maven command:

[FATAL] Non-readable POM /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/pom.xml: no more
data available - expected end tags </activation></profile></profiles></project> to close start tag <activation>
from line 131 and start tag <profile> from line 129 and start tag <profiles> from line 128 and start tag <project>
from line 2, parser stopped on TEXT seen ...</activation>\n            <properties... @136:24 @
 @
[ERROR] The build could not read 1 project -> [Help 1]

Apparently the file pom.xml wasn’t copied correctly (due to the long path) on my Windows laptop, and now some end tags were missing.

In order to check the content of file pom.xml, I used the following command on the Linux Command Prompt:

cat pom.xml

With the following output:
[only showing the last part]

…
    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties

So, in order to avoid this error, I used the following command on the Linux Command Prompt:

cp /mnt/mysharedfolder/kubernetes-quickstart/pom.xml /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/pom.xml

Again, in order to check the content of file pom.xml, I used the following command on the Linux Command Prompt:

cat pom.xml

With the following output:
[only showing the last part]

...
    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties>
                <skipITs>false</skipITs>
                <quarkus.native.enabled>true</quarkus.native.enabled>
            </properties>
        </profile>
    </profiles>
</project>

After this the error did not occur again 😊.

Quarkus Extention “Argocd”

I returned to the Quarkus Argocd extension, I described in my previous article.
[Quarkus – trying out the “Argo CD Extension for Quarkus” (part 1)]

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 56

To add this extension to your project, use the relevant command in your Quarkus project directory:

For example, for maven:

./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.argocd:quarkus-argocd"

[https://quarkus.io/extensions/io.quarkiverse.argocd/quarkus-argocd/]

In order to add the Argo CD extension to my project, I used the following commands on the Linux Command prompt:

cd /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart

mvn quarkus:add-extension -Dextensions="io.quarkiverse.argocd:quarkus-argocd"

With the following output

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- quarkus:3.25.2:add-extension (default-cli) @ kubernetes-quickstart ---
Downloading from registry.quarkus.io: https://registry.quarkus.io/maven/io/quarkus/registry/quarkus-registry-descriptor/1.0-SNAPSHOT/maven-metadata.xml
Downloaded from registry.quarkus.io: https://registry.quarkus.io/maven/io/quarkus/registry/quarkus-registry-descriptor/1.0-SNAPSHOT/maven-metadata.xml (65 kB at 7.7 kB/s)
…
Downloading from central: https://repo.maven.apache.org/maven2/com/vaadin/vaadin-quarkus-extension/24.9.9/vaadin-quarkus-extension-24.9.9-codestarts.jar
Downloaded from central: https://repo.maven.apache.org/maven2/com/vaadin/vaadin-quarkus-extension/24.9.9/vaadin-quarkus-extension-24.9.9-codestarts.jar (9.8 kB at 17 kB/s)
[INFO] [SUCCESS] ✅  Extension io.quarkiverse.argocd:quarkus-argocd:0.3.0 has been installed
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15.189 s
[INFO] Finished at: 2026-01-15T12:00:33Z
[INFO] ------------------------------------------------------------------------

And indeed, my pom.xml was changed to:
[In bold, I highlighted the changes]

<?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>
    <groupId>org.acme</groupId>
    <artifactId>kubernetes-quickstart</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <compiler-plugin.version>3.14.0</compiler-plugin.version>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.25.2</quarkus.platform.version>
        <skipITs>true</skipITs>
        <surefire-plugin.version>3.5.3</surefire-plugin.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-kubernetes</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-container-image-jib</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkiverse.helm</groupId>
            <artifactId>quarkus-helm</artifactId>
            <version>1.2.7</version>
        </dependency>
        <dependency>
            <groupId>io.quarkiverse.argocd</groupId>
            <artifactId>quarkus-argocd</artifactId>
            <version>0.3.0</version>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                            <goal>native-image-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties>
                <skipITs>false</skipITs>
                <quarkus.native.enabled>true</quarkus.native.enabled>
            </properties>
        </profile>
    </profiles>
</project>

So now, I am using Quarkus Argo CD version 0.3.0 that is compatible with my Quarkus version 3.25.2.

Quarkus guide “Quarkus ArgoCD”

Next, I returned to the guide “Quarkus ArgoCD”.
[https://docs.quarkiverse.io/quarkus-argocd/dev/index.html]

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 57

In order to generate the Argo CD resources, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart

mvn clean package -DskipTests

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ kubernetes-quickstart ---
[INFO] Deleting /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ kubernetes-quickstart ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- compiler:3.14.0:compile (default-compile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug parameters release 21] to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code-tests (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ kubernetes-quickstart ---
[INFO] skip non existing resourceDirectory /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/src/test/resources
[INFO]
[INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 21] to target/test-classes
[INFO]
[INFO] --- surefire:3.5.3:test (default-test) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ kubernetes-quickstart ---
[INFO] Building jar: /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus:3.25.2:build (default) @ kubernetes-quickstart ---
[INFO] [io.quarkus.kubernetes.deployment.PropertyUtil] Kubernetes manifests are generated with 'The container port http' having default value '8080'. The app and manifests will get out of sync if the property 'quarkus.http.port' is changed at runtime.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 12632ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  23.681 s
[INFO] Finished at: 2026-01-15T12:26:40Z
[INFO] ------------------------------------------------------------------------

So, I did have to repeat the last command, because as I described in a previous article, I did get an error:

Can’t edit matching ports. No match found.

[Quarkus – Kubernetes extension (reinvestigated, part 7), Live Coding, via the “remote development mode”, of a Java application that is running in a container on a K3s Kubernetes cluster]

After this step the Argo CD yaml files will be generated under the .argocd directory within the project root as part of the build.
[https://docs.quarkiverse.io/quarkus-argocd/dev/index.html#_usage]

So, on my Windows laptop in the shared folder, I navigated to the folder with the Argo CD yaml files:

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 58

As you can see in the directory above, there is a file application-kubernetes-quickstart.yaml and a file appproject-kubernetes-quickstart.yaml.

Below, you can see the content of file application-kubernetes-quickstart.yaml:

---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: kubernetes-quickstart
  namespace: argocd
spec:
  destination:
    server: https://kubernetes.default.svc
  project: kubernetes-quickstart
  source:
    helm:
      valueFiles:
      - values.yaml
    path: .helm/kubernetes/kubernetes-quickstart
    repoURL: https://github.com/marclameriks/kubernetes-quickstart.git
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    retry:
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 10m
    syncOptions:
    - CreateNamespace=true
    - RespectIgnoreDifferences=true
    - ApplyOutOfSyncOnly=true

Below, you can see the content of file appproject-kubernetes-quickstart.yaml:

---
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: kubernetes-quickstart
  namespace: argocd
spec:
  destinations:
  - server: https://kubernetes.default.svc
  sourceRepos:
  - https://github.com/marclameriks/kubernetes-quickstart.git

Argo CD applications, projects and settings can be defined declaratively using Kubernetes manifests. These can be updated using kubectl apply, without needing to touch the argocd command-line tool.
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#declarative-setup]

File application-kubernetes-quickstart.yaml is the generated Kubernetes manifest for an Argo CD Application and file appproject-kubernetes-quickstart.yaml is the generated Kubernetes manifest for an Argo CD AppProject.

For Application and AppProject resources, the name of the resource equals the name of the application or project within Argo CD. This also means that application and project names are unique within a given Argo CD installation – you cannot have the same application name for two different applications.
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#multiple-configuration-objects]

All resources, including Application and AppProject specs, have to be installed in the Argo CD namespace (by default argocd).
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#quick-reference]

Argo CD Applications via Declarative Setup

I had a look at the Argo CD Operator Manual, Declarative Setup, Applications.

The Application CRD (Custom Resource Definition) is the Kubernetes resource object representing a deployed application instance in an environment. It is defined by two key pieces of information:

  • source reference to the desired state in Git (repository, revision, path, environment)
  • destination reference to the target cluster and namespace. For the cluster one of server or name can be used, but not both (which will result in an error). Under the hood when the server is missing, it is calculated based on the name and used for any operations.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 59
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#applications]

Argo CD App of Apps via Declarative Setup

I had a look at the Argo CD Operator Manual, Declarative Setup, App of Apps.

You can create an app that creates other apps, which in turn can create other apps. This allows you to declaratively manage a group of apps that can be deployed and configured in concert.

See cluster bootstrapping.
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#app-of-apps]

Argo CD Projects

I had a look at the Argo CD User Guide, Projects.

Projects
Projects provide a logical grouping of applications, which is useful when Argo CD is used by multiple teams. Projects provide the following features:

  • restrict what may be deployed (trusted Git source repositories)
  • restrict where apps may be deployed to (destination clusters and namespaces)
  • restrict what kinds of objects may or may not be deployed (e.g. RBAC, CRDs, DaemonSets, NetworkPolicy etc…)
  • defining project roles to provide application RBAC (bound to OIDC groups and/or JWT tokens)

The Default Project
Every application belongs to a single project. If unspecified, an application belongs to the default project, which is created automatically and by default, permits deployments from any source repo, to any cluster, and all resource Kinds. When initially created, it’s specification is configured to be the most permissive:

spec:
  sourceRepos:
  - '*'
  destinations:
  - namespace: '*'
    server: '*'
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'

The default project can be modified, but not deleted. The project is useful for initial testing, but it is recommended to create dedicated projects with explicit source, destination, and resource permissions.
[https://argo-cd.readthedocs.io/en/stable/user-guide/projects/]

Argo CD Projects via Declarative Setup

I had a look at the Argo CD Operator Manual, Declarative Setup, Projects.

The AppProject CRD (Custom Resource Definition) is the Kubernetes resource object representing a logical grouping of applications. It is defined by the following key pieces of information:

  • sourceRepos reference to the repositories that applications within the project can pull manifests from.
  • destinations reference to clusters and namespaces that applications within the project can deploy into.
  • roles list of entities with definitions of their access to resources within the project.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 60
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#projects]

Generate the Argo CD resources for the “kubernetes-quickstart” application and build/push the application container image at once

As I did before, in order to generate the Argo CD resources and build/push the application container image at once, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart

mvn clean install -DskipTests -Dquarkus.container-image.build=true -Dquarkus.container-image.push=true

With the following output:

WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::staticFieldBase has been called by com.google.inject.internal.aop.HiddenClassDefiner (file:/opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar)
WARNING: Please consider reporting this to the maintainers of class com.google.inject.internal.aop.HiddenClassDefiner
WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< org.acme:kubernetes-quickstart >-------------------
[INFO] Building kubernetes-quickstart 1.0.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ kubernetes-quickstart ---
[INFO] Deleting /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ kubernetes-quickstart ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- compiler:3.14.0:compile (default-compile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug parameters release 21] to target/classes
[INFO]
[INFO] --- quarkus:3.25.2:generate-code-tests (default) @ kubernetes-quickstart ---
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ kubernetes-quickstart ---
[INFO] skip non existing resourceDirectory /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/src/test/resources
[INFO]
[INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ kubernetes-quickstart ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 2 source files with javac [debug parameters release 21] to target/test-classes
[INFO]
[INFO] --- surefire:3.5.3:test (default-test) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ kubernetes-quickstart ---
[INFO] Building jar: /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- quarkus:3.25.2:build (default) @ kubernetes-quickstart ---
[INFO] [io.quarkus.kubernetes.deployment.PropertyUtil] Kubernetes manifests are generated with 'The container port http' having default value '8080'. The app and manifests will get out of sync if the property 'quarkus.http.port' is changed at runtime.
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Starting (local) container image build for jar using jib.
[WARNING] [io.quarkus.container.image.jib.deployment.JibProcessor] Base image 'registry.access.redhat.com/ubi9/openjdk-21-runtime:1.21' does not use a specific image digest - build may not be reproducible
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest: sha256:360822c35c5741f542ab78fe123e6c4d9b68e0113a88d6e0250bb1f377b17f29
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [/opt/jboss/container/java/run/run-java.sh]
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushed container image localhost:8443/quarkus/kubernetes-quickstart:1.0.0-SNAPSHOT (sha256:4db2c4311d63394b0b36b8a8d45301b74d3b8305c294d028b59496c69b3840ab)

[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 24080ms
[INFO]
[INFO] --- failsafe:3.5.3:integration-test (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- quarkus:3.25.2:native-image-agent (default) @ kubernetes-quickstart ---
[INFO] Missing native-image-agent-base-config directory with native image agent configuration to transform
[INFO]
[INFO] --- failsafe:3.5.3:verify (default) @ kubernetes-quickstart ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- install:3.1.2:install (default-install) @ kubernetes-quickstart ---
[INFO] Installing /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/pom.xml to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.pom
[INFO] Installing /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart/target/kubernetes-quickstart-1.0.0-SNAPSHOT.jar to /home/vagrant/.m2/repository/org/acme/kubernetes-quickstart/1.0.0-SNAPSHOT/kubernetes-quickstart-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  37.199 s
[INFO] Finished at: 2026-01-15T12:43:20Z
[INFO] ------------------------------------------------------------------------

Removing the created Kubernetes objects for the “kubernetes-quickstart” application

Up till now, I used a Quarkus project (the “kubernetes-quickstart” application) as described in my previous article about the “Helm Extension for Quarkus”.
[Quarkus – trying out the “Helm Extension for Quarkus”]

As mentioned in that article, I installed the generated Helm resources to the Kubernetes cluster and created the following Kubernetes objects (in my custom nl-amis-development namespace):

  • Service
  • Deployment
  • Replica Set
  • Pod

Because I wanted to create the Kubernetes objects again via Argo CD, first I had to delete the existing ones.

In order to list all releases for a specific namespaces, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_list]

helm list --namespace nl-amis-development

With the following output:

NAME                            NAMESPACE               REVISION        UPDATED                                 STATUS  CHART                                   APP VERSION
helm-kubernetes-quickstart      nl-amis-development     2               2025-11-19 15:21:02.359823405 +0000 UTC deployedkubernetes-quickstart-1.0.0-SNAPSHOT

Then, I checked whether the Pods were running successfully, with the following command on the Linux Command Prompt:

kubectl get pods -n nl-amis-development

With the following output:

NAME                                    READY   STATUS    RESTARTS      AGE
kubernetes-quickstart-5b7d7db6c-dpqr6   1/1     Running   4 (26d ago)   56d
kubernetes-quickstart-5b7d7db6c-fjfsj   1/1     Running   4 (26d ago)   56d
kubernetes-quickstart-5b7d7db6c-ftt8v   1/1     Running   4 (26d ago)   56d
kubernetes-quickstart-5b7d7db6c-lhhd5   1/1     Running   4 (26d ago)   56d
kubernetes-quickstart-5b7d7db6c-pmbdg   1/1     Running   4 (26d ago)   56d

As you can see in the output above, 5 Pods were running successfully.

Then, in the Web Browser on my Windows laptop, I entered the URL:

http://localhost:8090/hello

With the following output:

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 61

In order to uninstall the Helm release, I used the following command on the Linux Command Prompt:
[https://helm.sh/docs/helm/helm_uninstall/]

helm uninstall helm-kubernetes-quickstart --namespace nl-amis-development

With the following output:

release "helm-kubernetes-quickstart" uninstalled

So, now that the “kubernetes-quickstart” application was uninstalled, I could create the Kubernetes objects again via Argo CD.

Adding files to the project in my GitHub Private repository

As I described before, I had a project under version control system Git and pushed it on a GitHub Private repository. Up till now, only file README.md is part of the project.

On my Windows laptop, I already copied everything (except README.md and the target directory) from
C:\My\AMIS\MySharedFolder\kubernetes-quickstart
to
C:\My\AMIS\MySharedFolder\github\repositories\private\kubernetes-quickstart

So now it was time to add some of these files to the project in my GitHub Private repository, including the generated Argo CD yaml files (application-kubernetes-quickstart.yaml and appproject-kubernetes-quickstart.yaml).

On my Windows laptop, I navigated to folder C:\My\AMIS\MySharedFolder\github\repositories\private\kubernetes-quickstart and used TorsoiseGit to add files to the local working tree.

TortoiseGit is a Windows Shell Interface to Git and based on TortoiseSVN. It’s open source and can fully be build with freely available software.
[https://tortoisegit.org/about/]

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 62

Next, I used TorsoiseGit to commit the files I added to my local working tree. In order to describe the changes I was committing, as a Commit Log Message, I used:

The kubernetes-quickstart application, needed for a Continuous Delivery (CD) workflow using Quarkus Helm and ArgoCD

Then, I used TorsoiseGit Push, in order to push my commit to the project in my GitHub Private repository.

I logged in into github.com with my own GitHub account, in order to check the project in my GitHub Private repository.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 63

As you can see above, the files were added.

Setting up an Argo CD Private Repository

As you already know by now, I am using a GitHub Private repository. I want to use HTTPS username and password credentials in order to connect to it.

So, in order to be able to use it with Argo CD, some work needs to be done.

Argo CD Private Repositories

I had a look at the Argo CD User Guide, Private Repositories.

Credentials
If application manifests are located in private repository then repository credentials have to be configured. Argo CD supports both HTTPS and SSH Git credentials.
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#credentials]

HTTPS Username And Password Credential
Private repositories that require a username and password typically have a URL that start with https:// rather than git@ or ssh://.

Credentials can be configured using Argo CD CLI:

argocd repo add https://github.com/argoproj/argocd-example-apps --username <username> --password <password>

or UI:

  • 1. Navigate to Settings/Repositories

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 64

  • 2. Click Connect Repo using HTTPS button and enter credentials

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 65

Note: username in screenshot is for illustration purposes only , we have no relationship to this GitHub account should it exist.

  • 3. Click Connect to test the connection and have the repository added

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 66
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#https-username-and-password-credential]

Declarative Configuration
See declarative setup
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#declarative-configuration]

Argo CD Repositories via Declarative Setup

I had a look at the Argo CD Operator Manual, Declarative Setup, Repositories.

Repository details are stored in secrets. To configure a repo, create a secret which contains repository details. Consider using bitnami-labs/sealed-secrets to store an encrypted secret definition as a Kubernetes manifest. Each repository must have a url field and, depending on whether you connect using HTTPS, SSH, or GitHub App, username and password (for HTTPS), sshPrivateKey (for SSH), or githubAppPrivateKey (for GitHub App). Credentials can be scoped to a project using the optional project field. When omitted, the credential will be used as the default for all projects without a scoped credential.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 67

Example for HTTPS:

apiVersion: v1
kind: Secret
metadata:
  name: private-repo
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/argoproj/private-repo
  password: my-password
  username: my-username
  project: my-project

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 68
[https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#repositories]

Setting up an Argo CD Private Repository via Declarative Setup

So, I opted for using an Argo CD Private Repository via Declarative Setup, in order to be able to use my GitHub Private repository via HTTPS username and password credentials.

On my Windows laptop, in subdirectory named yaml of my shared folder, I created file secret-argocd-private-repo-kubernetes-quickstart.yaml with the following content:

apiVersion: v1
kind: Secret
metadata:
  name: private-repo-kubernetes-quickstart
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://github.com/marclameriks/kubernetes-quickstart.git
  username: marclameriks
  password: ****NON-READABLE PASSWORD****
  project: kubernetes-quickstart

By the way, I had a look at the metadata part, of the generated Argo CD yaml files (application-kubernetes-quickstart.yaml and appproject-kubernetes-quickstart.yaml).

metadata:
  name: kubernetes-quickstart
  namespace: argocd

I also had a look at the project part of the generated Argo CD yaml file application-kubernetes-quickstart.yaml:

  project: kubernetes-quickstart

In order to be able to use the project, I needed to create it first.

So, in order to create the Argo CD project, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder/github/repositories/private/kubernetes-quickstart

kubectl apply -f .argocd/appproject-kubernetes-quickstart.yaml

With the following output:

appproject.argoproj.io/kubernetes-quickstart created

Next, in order to log in to Argo CD, I used the following command on the Linux Command Prompt:

argocd login --insecure localhost:8086

With the following output:

Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:8086' updated

Then, in order to list Argo CD projects, I used the following command on the Linux Command Prompt:
[https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_proj/]

argocd proj list

With the following output:

NAME                   DESCRIPTION  DESTINATIONS                     SOURCES                                                    CLUSTER-RESOURCE-WHITELIST  NAMESPACE-RESOURCE-BLACKLIST  SIGNATURE-KEYS  ORPHANED-RESOURCES  DESTINATION-SERVICE-ACCOUNTS
default                             *,*                              *                                                          */*                         <none>                        <none>          disabled            <none>
kubernetes-quickstart               https://kubernetes.default.svc,  https://github.com/marclameriks/kubernetes-quickstart.git  <none>                      <none>                        <none>          disabled            <none>

Next, in order to create the Secret, I used the following commands on the Linux Command Prompt:

cd /mnt/mysharedfolder

kubectl apply -f yaml/secret-argocd-private-repo-kubernetes-quickstart.yaml

With the following output:

secret/private-repo-kubernetes-quickstart created

In order to list all secrets in the argocd namespace,, with the following command on the Linux Command Prompt:

kubectl get secrets -n argocd

With the following output:

NAME TYPE DATA AGE
argocd-notifications-secret Opaque 0 11d
argocd-redis Opaque 1 11d
argocd-secret Opaque 5 11d
private-repo-kubernetes-quickstart Opaque 5 4s
sh.helm.release.v1.argo-cd.v1 helm.sh/release.v1 1 11d

Then, I also wanted to check the Argo CD Project via the Argo CD UI.

So, in the Web Browser on my Windows laptop, I entered the URL:

https://localhost:8086

As I did before and described in my previous article, I logged in with the username and password for the Argo CD API Server.
[Quarkus – trying out the “Argo CD Extension for Quarkus” (part 2)]

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 69

Next, I clicked on “Settings”.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 70

Then, I clicked on “Projects”.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 71

As You can see above, the Argo CD Project “kubernetes-quickstart” was visible.

Next, I clicked on “Settings | Repositories”.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 72

As you can see above, the connection status was “Failed”.

So, I clicked on the repository.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 73

The following Connection Status Details were visible:

Unable to connect to repository: rpc error: code = Unknown desc = error testing repository connectivity: unable to ls-remote HEAD on repository: failed to list refs: authentication required: Invalid username or token. Password authentication is not supported for Git operations.

GitHub personal access token

Again, I had a look at the Argo CD User Guide, Private Repositories.

Access Token
Instead of using username and password you might use access token. Following instructions of your Git hosting service to generate the token:

Then, connect the repository using any non-empty string as username and the access token value as a password.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 74
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#access-token]

Because I used a GitHub Private repository, I clicked on the link “GitHub”. This opened the “GitHub Docs, Authentication, Account security, Manage personal access tokens” page.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 75

About personal access tokens
Personal access tokens are an alternative to using passwords for authentication to GitHub when using the GitHub API or the command line.
Personal access tokens are intended to access GitHub resources on behalf of yourself. 
[https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#about-personal-access-tokens]

Types of personal access tokens
GitHub currently supports two types of personal access tokens: fine-grained personal access tokens and personal access tokens (classic). GitHub recommends that you use fine-grained personal access tokens instead of personal access tokens (classic) whenever possible.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 76
[https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#types-of-personal-access-tokens]

I opted for creating a fine-grained personal access token. So, I followed the instructions “Creating a fine-grained personal access token”, you can see below.
[https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token]

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 77
Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 78

Some remarks about the steps described above:

  • As a Token name, I entered: pat-kubernetes-quickstart
  • Under Expiration, I selected a date: 03/01/2026 (Sunday, first of March 2026)
  • Under Repository access, I selected “Only select repositories” and under the Selected repositories dropdown, I select the following repository that I wanted the token to access: marclameriks/kubernetes-quickstart
  • Under Permissions, I selected the following permissions to grant the token:

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 79

These permissions were in line with what was mentioned at the Argo CD User Guide, Private Repositories.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 80
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#github-app-credential]

And finally I clicked on button “Generate token”.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 81

Next, in order to list configured Argo CD repositories, I used the following command on the Linux Command Prompt:
[https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_repo_list/]

argocd repo list

With the following output:

TYPE  NAME  REPO                                                       INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         https://github.com/marclameriks/kubernetes-quickstart.git  false     false  false  false  Successful           kubernetes-quickstart

Then, in order to log out from Argo CD, I used the following command on the Linux Command Prompt:
[https://argo-cd.readthedocs.io/en/latest/user-guide/commands/argocd_logout/]

argocd logout localhost:8086

With the following output:

Logged out from 'localhost:8086'

Finally, I also wanted to check the Argo CD Private Repository via the Argo CD UI.

Quarkus – trying out the “Argo CD Extension for Quarkus” (part 3) lameriks 2026 01 82

As You can see above, the Argo CD Private Repository has the (connection) status “ Successful”.

I conclude this part 3 article.

In this article, I continued with the “Getting started” part of the “Argo CD Extension for Quarkus”, in order to generate an Argo CD Application and Project as part of the Quarkus build.

You can also read more about how I:

  • Generated the Quarkus Helm charts out of the target folder.
  • Added files to the Quarkus project (the “kubernetes-quickstart” application) in my GitHub Private repository.
  • Created a GitHub personal access token.
  • Created an Argo CD Project in Kubernetes
  • Created an Argo CD Private Repository (via Declarative Setup) in Kubernetes.

In my next article (part 4), I will continue with, creating an Argo CD Application in Kubernetes.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.