# Using S2I to deploy Quarkus applications to OpenShift

You can deploy your Quarkus applications to OpenShift by using the Source-to-Image (S2I) method. With S2I, you must provide the source code to the build container through a Git repository or by uploading the source code at build time.

The deployment procedure differs based on the Java version your Quarkus application uses.

## Deploying Quarkus applications to OpenShift with Java 17

You can deploy Quarkus applications that run Java 17 to OpenShift by using the S2I method.

### Prerequisites

- You have a Quarkus application built with Java {jdk-ver-other}.

- Optional: You have a Quarkus project that includes the `quarkus-openshift` extension.

- You are working in the correct OpenShift project namespace.

- Your project is hosted in a Git repository.

### Procedure

1. Open the `pom.xml` file, and set the Java version to 17:

       <maven.compiler.source>17</maven.compiler.source>
       <maven.compiler.target>17</maven.compiler.target>

2. Package your Java 17 application, by entering the following command:

       ./mvnw clean package

3. Create a directory called `.s2i` at the same level as the `pom.xml` file.

4. Create a file called `environment` in the `.s2i` directory and add the following content:

       MAVEN_S2I_ARTIFACT_DIRS=target/quarkus-app
       S2I_SOURCE_DEPLOYMENTS_FILTER=app lib quarkus quarkus-run.jar
       JAVA_OPTIONS=-Dquarkus.http.host=0.0.0.0
       AB_JOLOKIA_OFF=true
       JAVA_APP_JAR=/deployments/quarkus-run.jar

5. Commit and push your changes to the remote Git repository.

6. Import the supported OpenShift image by entering the following command:

       oc import-image ubi9/openjdk-17 --from=registry.access.redhat.com/ubi9/openjdk-17 --confirm

   | If you are using the OpenShift image registry and pulling from image streams in the same project, your pod service account must already have the correct permissions. If you are pulling images across other OpenShift projects or from secured registries, additional configuration steps might be required. For more information, see the Red Hat Openshift Container Platform documentation.

7. Build the project, create the application, and deploy the OpenShift service:

       oc new-app registry.access.redhat.com/ubi9/openjdk-17~<git_path> --name=<project_name>

   - Replace `<git_path>` with the path of the Git repository that hosts your Quarkus project. For example, `oc new-app registry.access.redhat.com/ubi9/openjdk-17~https://github.com/johndoe/code-with-quarkus.git --name=code-with-quarkus`.

     If you do not have SSH keys configured for the Git repository, when specifying the Git path, use the HTTPS URL instead of the SSH URL.

   - Replace `<project_name>` with the name of your application.

8. To deploy an updated version of the project, push changes to the Git repository, and then run:

       oc start-build <project_name>

9. To expose a route to the application, run the following command:

       oc expose svc <project_name>

### Verification

1. List the pods associated with your current OpenShift project:

       oc get pods

2. To get the log output for your application’s pod, run the following command, replacing `<pod_name>` with the name of the latest pod prefixed by your application name:

       oc logs -f <pod_name>

## Deploying Quarkus applications to OpenShift with Java 21

You can deploy Quarkus applications that run Java 21 to OpenShift by using the S2I method.

### Prerequisites

- Optional: You have a Quarkus Maven project that includes the `quarkus-openshift` extension.

- You are working in the correct OpenShift project namespace.

- Your project is hosted in a Git repository.

### Procedure

1. Open the `pom.xml` file, and set the Java version to 21:

       <maven.compiler.source>21</maven.compiler.source>
       <maven.compiler.target>21</maven.compiler.target>

2. Package your Java {jdk-ver-latest} application, by entering the following command:

       ./mvnw clean package

3. Create a directory called `.s2i` at the same level as the `pom.xml` file.

4. Create a file called `environment` in the `.s2i` directory and add the following content:

       MAVEN_S2I_ARTIFACT_DIRS=target/quarkus-app
       S2I_SOURCE_DEPLOYMENTS_FILTER=app lib quarkus quarkus-run.jar
       JAVA_OPTIONS=-Dquarkus.http.host=0.0.0.0
       AB_JOLOKIA_OFF=true
       JAVA_APP_JAR=/deployments/quarkus-run.jar

5. Commit and push your changes to the remote Git repository.

6. Import the supported OpenShift image by entering the following command:

       oc import-image ubi9/openjdk-21 --from=registry.access.redhat.com/ubi9/openjdk-21 --confirm

   | If you are using the OpenShift image registry and pulling from image streams in the same project, your pod service account must already have the correct permissions. If you are pulling images across other OpenShift projects or from secured registries, additional configuration steps might be required. For more information, see the Red Hat Openshift Container Platform documentation. If you are deploying on IBM Z infrastructure, enter `oc import-image ubi9/openjdk-21 --from=registry.redhat.io/ubi9/openjdk-21 --confirm` instead. For information about this image, see {runtimes-openjdk-long} 21.

7. Build the project, create the application, and deploy the OpenShift service:

       oc new-app registry.access.redhat.com/ubi8/openjdk-21~<git_path> --name=<project_name>

   - Replace `<git_path>` with the path of the Git repository that hosts your Quarkus project. For example, `oc new-app registry.access.redhat.com/ubi9/openjdk-21~https://github.com/johndoe/code-with-quarkus.git --name=code-with-quarkus`.

     If you do not have SSH keys configured for the Git repository, when specifying the Git path, use the HTTPS URL instead of the SSH URL.

   - Replace `<project_name>` with the name of your application.

     | If you are deploying on IBM Z infrastructure, enter `oc new-app ubi9/openjdk-21~<git_path> --name=<project_name>` instead.

8. To deploy an updated version of the project, push changes to the Git repository, and then run:

       oc start-build <project_name>

9. To expose a route to the application, run the following command:

       oc expose svc <project_name>

### Verification

1. List the pods associated with your current OpenShift project:

       oc get pods

2. To get the log output for your application’s pod, run the following command, replacing `<pod_name>` with the name of the latest pod prefixed by your application name:

       oc logs -f <pod_name>

## References

- Deploying Quarkus applications to OpenShift