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.
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).
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.
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)]
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]
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.
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:
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.
[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.
[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:
With the following output:
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/]
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:
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.
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
- 2. Click Connect Repo using HTTPS button and enter credentials
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
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.
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
[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:
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)]
Next, I clicked on “Settings”.
Then, I clicked on “Projects”.
As You can see above, the Argo CD Project “kubernetes-quickstart” was visible.
Next, I clicked on “Settings | Repositories”.
As you can see above, the connection status was “Failed”.
So, I clicked on the repository.
The following Connection Status Details were visible:
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.
[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.
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.
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]
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:
These permissions were in line with what was mentioned at the Argo CD User Guide, Private Repositories.
[https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/#github-app-credential]
And finally I clicked on button “Generate token”.
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.
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.
