<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://che.eclipseprojects.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://che.eclipseprojects.io/" rel="alternate" type="text/html" /><updated>2026-01-07T11:10:21+00:00</updated><id>https://che.eclipseprojects.io/feed.xml</id><title type="html">Eclipse Che Blog</title><subtitle>Eclipse Che runs IDEs in Kubernetes.</subtitle><entry><title type="html">Running Open VSX On-Premises</title><link href="https://che.eclipseprojects.io/2025/09/09/@svor-running-open-vsx-on-premises.html" rel="alternate" type="text/html" title="Running Open VSX On-Premises" /><published>2025-09-09T00:00:00+00:00</published><updated>2025-09-09T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/09/09/@svor/running-open-vsx-on-premises</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/09/09/@svor-running-open-vsx-on-premises.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Developers love extensions — they customize editors, add new languages, and streamline workflows.
But in enterprise environments, relying on the public <a href="https://open-vsx.org"><strong>Open VSX registry</strong></a> can introduce challenges:
air-gapped environments, compliance rules, or simply the need for a curated list of approved tools.</p>
</div>
<div class="paragraph">
<p>That’s where running <strong>Open VSX On-Premises</strong> comes in.
In this post, we’ll explore how Eclipse&#160;Che makes it easy to deploy and configure your own extension registry, using nothing more than an Eclipse&#160;Che Cloud Development Environment running on the OpenShift cluster.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_step-by-step-preparing-eclipse-open-vsx-with-eclipseche">Step-by-Step: Preparing Eclipse Open VSX with Eclipse&#160;Che</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All the following steps can be executed inside an <strong>Eclipse&#160;Che workspace</strong> provisioned from <a href="https://github.com/eclipse/openvsx/blob/master/.devfile.yaml">the Open VSX repository&#8217;s devfile</a>.
This Devfile automates most of the work — so instead of manually stitching pieces together, you simply run tasks in sequence.</p>
</div>
<div class="sect2">
<h3 id="_prerequisites">Prerequisites:</h3>
<div class="ulist">
<ul>
<li>
<p>You must be running Eclipse&#160;Che on an OpenShift cluster.</p>
</li>
<li>
<p>You must be logged in as a cluster administrator.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_step-1-start-the-open-vsx-workspace">Step 1: Start the Open VSX Workspace</h3>
<div class="paragraph">
<p>Create a workspace using <a href="https://github.com/eclipse/openvsx/tree/master">the Open VSX repository</a>.
This initializes an environment with all required components and tasks.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/dashboard.png" alt="User Dashboard">
</div>
</div>
<div class="paragraph">
<p>Figure 1: User Dashboard</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-2-create-an-openshift-project-for-open-vsx">Step 2: Create an OpenShift project for Open VSX</h3>
<div class="paragraph">
<p>Run the Devfile task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.1. Create Namespace for OpenVSX</code></pre>
</div>
</div>
<div class="paragraph">
<p>This creates a new OpenShift project named openvsx.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/create-namespace.png" alt="Create Open VSX Project">
</div>
</div>
<div class="paragraph">
<p>Figure 2: Open VSX namespace creation</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-3-build-and-publish-the-open-vsx-server-image">Step 3: Build and Publish the Open VSX Server Image</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.2. Build and Publish Open VSX Image</code></pre>
</div>
</div>
<div class="paragraph">
<p>You’ll be prompted for the Open VSX version (defaults to v0.27.0 if left blank). The image is built and pushed to the OpenShift internal registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/server-image-build.png" alt="Build Open VSX Server Image">
</div>
</div>
<div class="paragraph">
<p>Figure 3: Open VSX server image build</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-4-build-and-publish-the-open-vsx-cli-ovsx-image">Step 4: Build and Publish the Open VSX CLI (ovsx) Image</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.3. Build and Publish OpenVSX CLI Image</code></pre>
</div>
</div>
<div class="paragraph">
<p>This prepares the ovsx CLI image and uploads it to the cluster registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/cli-image-build.png" alt="Build Open VSX CLI Image">
</div>
</div>
<div class="paragraph">
<p>Figure 4: Open VSX CLI image build</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-5-deploy-open-vsx-components">Step 5: Deploy Open VSX Components</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.4. Deploy OpenVSX</code></pre>
</div>
</div>
<div class="paragraph">
<p>This command deploys the Open VSX components to an OpenShift project by processing a template file (<a href="https://github.com/eclipse/openvsx/blob/master/deploy/openshift/openvsx-deployment.yml">openvsx-deployment.yml</a>). It creates all required resources defined in the template, which includes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Deployments (PostgreSQL, Elasticsearch, Open VSX server, Open VSX CLI).</p>
</li>
<li>
<p>Services and Routes for accessing components.</p>
</li>
<li>
<p>Secrets for GitHub OAuth credentials and Open VSX personal access token.</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/openvsx-pods.png" alt="Open VSX Pods">
</div>
</div>
<div class="paragraph">
<p>Figure 5: Open VSX pods running in OpenShift console</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-6-add-a-user-with-personal-access-token-pat">Step 6: Add a User with Personal Access Token (PAT)</h3>
<div class="paragraph">
<p>Run the task :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.5. Add OpenVSX user with PAT to the DB</code></pre>
</div>
</div>
<div class="paragraph">
<p>The command will ask for the Open VSX username and user PAT and insert them into the PostgreSQL database. You can just click enter to use the default values.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
❗ The user PAT must match the decoded value of OVSX_PAT_BASE64 specified in the deployment file. If OVSX_PAT_BASE64 has been updated, use the new token’s decoded value as the user PAT.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/openvsx-user-pat.png" alt="Adding User and PAT">
</div>
</div>
<div class="paragraph">
<p>Figure 6: Terminal output after adding a user with a PAT</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-7-configure-eclipseche-to-use-your-internal-registry">Step 7: Configure Eclipse&#160;Che to Use Your Internal Registry</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.6. Configure Che to use the internal OpenVSX registry</code></pre>
</div>
</div>
<div class="paragraph">
<p>This patches the CheCluster CR, updating the <code>pluginRegistry.openVSXURL</code> to point to your internal Open VSX endpoint.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/patched-che-cluster.png" alt="CheCluster CR">
</div>
</div>
<div class="paragraph">
<p>Figure 7: CheCluster custom resource after patching</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-8-publish-extensions-via-vsix-file">Step 8: Publish Extensions via VSIX File</h3>
<div class="paragraph">
<p>At the beginning, the Open VSX registry does not provide any extensions. Once the openvsx-server pod is running and in the Ready state, extensions can be published to the registry. The <code>2.8. Publish a Visual Studio Code Extension from a VSIX file</code> command publishes an extension to the local Open VSX registry directly from a <code>.vsix</code> file. It prompts you to provide the extension’s namespace name and the path to the <code>.vsix</code> file.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/publish-extension.png" alt="Publish Extension from VSIX">
</div>
</div>
<div class="paragraph">
<p>Figure 8: Publish GitLens extension from the local vsix file</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-9-batch-publish-extensions-from-a-list">Step 9: Batch Publish Extensions from a List</h3>
<div class="paragraph">
<p>For multiple extensions, run:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.9. Publish list of Visual Studio Code Extensions</code></pre>
</div>
</div>
<div class="paragraph">
<p>This task reads URLs from <a href="https://github.com/eclipse/openvsx/blob/master/deploy/openshift/extensions.txt">deploy/openshift/extensions.txt</a> and publishes them automatically.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/publish-list-extensions.png" alt="Publish List of Extensions">
</div>
</div>
<div class="paragraph">
<p>Figure 9: Batch publishing from extensions.txt</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-10-verify-integration">Step 10: Verify Integration</h3>
<div class="paragraph">
<p>Start a new Che workspace and open the Extensions view. Confirm that extensions are served from your internal registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/extensions-view.png" alt="Extensions View">
</div>
</div>
<div class="paragraph">
<p>Figure 10: Extensions view</p>
</div>
<div class="paragraph">
<p>Or browse directly to your registry’s route, opening the internal route in the OpenVSX OpenShift project.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/extensions-registry.png" alt="Open VSX Extensions Registry">
</div>
</div>
<div class="paragraph">
<p>Figure 11: Custom Extensions registry</p>
</div>
</div>
<div class="sect2">
<h3 id="_optional-restrict-open-vsx-registry-to-internal-only-access">Optional: Restrict Open VSX Registry to Internal-Only Access</h3>
<div class="paragraph">
<p>To prevent external exposure:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Delete the public route with name <code>internal</code> from <code>openvsx</code> OpenShift project:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>oc delete route internal -n openvsx</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Patch Che to use the in-cluster service DNS:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>oc patch checluster &lt;name&gt; -n &lt;namespace&gt; \
  --type=merge \
  --patch '{"spec":{"components":{"pluginRegistry":{"openVSXURL":"http://openvsx-server.openvsx.svc:8080"}}}}'</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Setting up Open VSX on-premises with Eclipse&#160;Che may sound complex at first, but the Devfile-driven flow makes it straightforward:
You spin up a workspace, run a sequence of tasks, and end up with a fully functional, internal extension registry.</p>
</div>
<hr>
</div>
</div>
<div class="sect1">
<h2 id="_further-reading">Further Reading</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>📘 <a href="https://eclipse.dev/che/docs/stable/administration-guide/running-the-open-vsx-on-premises">Running the Open VSX On-Premises — Eclipse Che documentation</a></p>
</li>
<li>
<p>💻 <a href="https://github.com/eclipse/openvsx">Eclipse Open VSX source code on GitHub</a></p>
</li>
<li>
<p>📚 <a href="https://github.com/eclipse/openvsx/wiki">Eclipse Open VSX Wiki</a></p>
</li>
</ul>
</div>
</div>
</div>]]></content><author><name>Valerii Svydenko</name></author><summary type="html"><![CDATA[Take Control of Your Extensions: Running Open VSX on-Premises with Eclipse Che]]></summary></entry><entry><title type="html">Spec-Driven Development in Action</title><link href="https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi-spec-driven-development-in-action.html" rel="alternate" type="text/html" title="Spec-Driven Development in Action" /><published>2025-08-18T00:00:00+00:00</published><updated>2025-08-18T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi/spec-driven-development-in-action</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi-spec-driven-development-in-action.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>What if the most important skill for a developer was no longer writing code, but writing specifications? The traditional development cycle is a grind of boilerplate, configuration, and repetitive tasks. We spend more time on the "how" than perfecting the "what". But a new paradigm, powered by AI, is shifting that dynamic, and you can try it yourself right now.</p>
</div>
<div class="paragraph">
<p>I&#8217;m talking about <strong>specification-driven development</strong>, a workflow where the developer&#8217;s primary role is to create a detailed, machine-readable blueprint of an application. To prove it, I built a full-stack URL shortener. The vast majority of my time was spent crafting a perfect specification file; then an AI did the rest with a single command.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the-tools-and-the-paradigm">The Tools and the Paradigm</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This experiment relies on a powerful combination of modern tools working in synergy:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://eclipse.dev/che/"><strong>Eclipse Che</strong></a>: A platform for providing Kubernetes-based Cloud Development Environments.</p>
</li>
<li>
<p><a href="https://github.com/ai-christianson/RA.Aid"><strong>RA.Aid</strong></a> &amp; <a href="https://github.com/Aider-AI/aider"><strong>Aider</strong></a>: A pair of open-source AI assistants, both licensed under the <code>Apache 2.0</code>. <strong>RA.Aid</strong> is the master planner, taking a high-level spec and breaking it down into an implementation plan. <strong>Aider</strong> is the hands-on coder, executing the plan and modifying the code.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Together, they enable a shift where you, the developer, transition from a coder to an architect. Your focus is on high-level decisions, defining robust data models, crafting clean API contracts, and designing intuitive user interactions. The specification file becomes the single source of truth that drives the entire development process.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-to-replicate-this-from-repo-to-running-app">How to Replicate This: From Repo to Running App</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can follow these exact steps to see the process for yourself.</p>
</div>
<div class="sect2">
<h3 id="_step-1-the-blueprint-repo">Step 1: The Blueprint Repo</h3>
<div class="paragraph">
<p>Everything you need to start is in this GitHub repository: <a href="https://github.com/che-incubator/demo-spec-driven-development-with-ai">che-incubator/demo-spec-driven-development-with-ai</a></p>
</div>
<div class="paragraph">
<p>This repo contains the blueprint for our entire project. It includes two crucial files: the <code>spec.md</code>, which provides the detailed instructions for the AI, and the <code>devfile.yaml</code>, which defines the Eclipse Che workspace.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-2-launch-the-workspace-with-a-devfile">Step 2: Launch the Workspace with a Devfile</h3>
<div class="paragraph">
<p>The <code>devfile.yaml</code> is the key to a one-click setup. It tells Eclipse Che to create a workspace using a pre-configured container image (<code>quay.io/che-incubator/cli-ai-tools:latest</code>) that already includes <strong>RA.Aid</strong> and <strong>Aider</strong>. This means your development environment comes ready with all the specialized AI tools installed.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-3-secure-your-ais-access">Step 3: Secure Your AI&#8217;s Access</h3>
<div class="paragraph">
<p>To work, the AI assistants need access to a Large Language Model (LLM). <strong>RA.Aid</strong> and <strong>Aider</strong> are flexible and support many different providers, including Gemini, OpenAI, Anthropic, Groq, and more. For this demo, we&#8217;ll use the Gemini API.</p>
</div>
<div class="paragraph">
<p>The recommended way to provide credentials is by creating a Kubernetes <code>Secret</code>. Eclipse Che will then automatically mount this secret as an environment variable inside your workspace. For the Gemini API, the required environment variable is <code>GEMINI_API_KEY</code>.</p>
</div>
<div class="paragraph">
<p>You can create the secret for Gemini with the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="sh">oc apply <span style="color: #f92672">-f</span> - <span style="color: #f92672;font-weight: bold">&lt;&lt;</span><span style="color: #66d9ef">EOF</span><span style="color: #e6db74">
kind: Secret
apiVersion: v1
metadata:
  name: gemini-api-key
  labels:
    controller.devfile.io/mount-to-devworkspace: 'true'
    controller.devfile.io/watch-secret: 'true'
  annotations:
    controller.devfile.io/mount-as: env
data:
  GEMINI_API_KEY: [base64 encoded Gemini API key]
type: Opaque
EOF</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If you prefer to use a different provider, simply consult the <strong>RA.Aid</strong> or <strong>Aider</strong> documentation for the correct environment variable name (e.g., <code>OPENAI_API_KEY</code>) and adapt the secret accordingly.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-4-unleash-the-ai">Step 4: Unleash the AI</h3>
<div class="paragraph">
<p>Once you have crafted the <code>spec.md</code> for the application of your dreams, all it takes is this one command in the terminal to set the AI to work:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="sh">ra-aid <span style="color: #f92672">--use-aider</span> <span style="color: #f92672">--cowboy-mode</span> <span style="color: #f92672">--show-cost</span> <span style="color: #f92672">--track-cost</span> <span style="color: #f92672">--msg-file</span> spec.md</code></pre>
</div>
</div>
<div class="paragraph">
<p>This command tells <strong>RA.Aid</strong> to use your <code>spec.md</code> file as its guide, leverage <strong>Aider</strong> for code modifications, and run autonomously without needing interactive approval (<code>--cowboy-mode</code>).</p>
</div>
<div class="paragraph">
<p>Instantly, the agent will parse the specification and begin building the application right inside your Eclipse Che workspace, just as it did for my URL shortener. See the whole process unfold in the video below.</p>
</div>
<iframe width="560" height="315" src="https://www.youtube.com/embed/L_a1ig1VrxY?si=DGC5q405MhLMnmrY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<div class="paragraph">
<p>As the agent works, you can follow its progress directly in the terminal. The output shows its step-by-step thinking process as it interprets the specification, plans its actions, and executes them.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/1-ra-aid-command-running.png" alt="RA.Aid command running in the terminal" width="showing the AI planning and executing steps for the URL shortener.">
</div>
<div class="title">Figure 1. RA.Aid command running in the terminal, showing the AI planning and executing steps for the URL shortener.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
<div class="paragraph">
<p>It will generate the backend, the frontend, and any necessary scripts. You can see the complete, well-structured project created by the AI in the file explorer.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/2-generated-project-file-structure.png" alt="Generated project file structure for the URL shortener in the Eclipse Che IDE.">
</div>
<div class="title">Figure 2. Generated project file structure for the URL shortener in the Eclipse Che IDE.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-5-working-application">Step 5: Working Application</h3>
<div class="paragraph">
<p>Writing a detailed specification requires deep thought, but that upfront investment pays off massively by automating the hours of coding and debugging. After the agent finishes, you have a fully working application.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
While the demo environment&#8217;s hostname makes the full URL long, the AI correctly built the core feature: generating a short, clean, and predictable path for any link you provide.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/3-url-shortener-running.png" alt="Final URL shortener application is running in a browser tab within Eclipse Che.">
</div>
<div class="title">Figure 3. The final URL shortener application is running in a browser tab within Eclipse Che.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This demonstration is more than just a new way to build a URL shortener; it&#8217;s a glimpse into the future of our profession. The rise of capable AI assistants marks a fundamental shift in the developer&#8217;s workflow, moving us away from the manual, line-by-line construction of applications and toward a new paradigm where we act as architects. Our primary role is evolving to be the designers of robust systems, the authors of clear specifications, and the strategic thinkers who guide AI tools to execute a vision.</p>
</div>
<div class="paragraph">
<p>Spec-driven development is likely just one step on a path of rapid transformation. The world of AI in software engineering is changing fast, and the tools we use tomorrow will be even more powerful.</p>
</div>
<div class="paragraph">
<p>The best way to understand this shift is to experience it firsthand. I encourage you to run the demo yourself and reflect on how this technology could change your own work. The conversation is no longer about whether AI will write code, but about how we will guide it to build better software.</p>
</div>
</div>
</div>]]></content><author><name>Oleksii Kurinnyi</name></author><summary type="html"><![CDATA[Spec-Driven Development in Action: Building a URL Shortener with One Command]]></summary></entry><entry><title type="html">Vibe Coding with Eclipse Che</title><link href="https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk-vibe-coding.html" rel="alternate" type="text/html" title="Vibe Coding with Eclipse Che" /><published>2025-07-23T00:00:00+00:00</published><updated>2025-07-23T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk/vibe-coding</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk-vibe-coding.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Imagine a world where coding isn&#8217;t about meticulous syntax or endless debugging, but about conversation and pure flow. Welcome to "vibe coding" – a revolutionary approach to software development where Large Language Models (LLMs) become your ultimate co-pilot, transforming complex tasks into effortless interactions.</p>
</div>
<div class="paragraph">
<p>This paradigm shift gained significant traction in early February 2025, sparked by Andrej Karpathy&#8217;s insightful <a href="https://x.com/karpathy/status/1886192184808149383">post</a> on X, who actually coined the term:</p>
</div>
<div class="quoteblock">
<blockquote>
There&#8217;s a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It&#8217;s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper so I barely even touch the keyboard. I ask for the dumbest things like "decrease the padding on the sidebar by half" because I&#8217;m too lazy to find it. I "Accept All" always, I don&#8217;t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I&#8217;d have to really read through it for a while. Sometimes the LLMs can&#8217;t fix a bug so I just work around it or ask for random changes until it goes away. It&#8217;s not too bad for throwaway weekend projects, but still quite amusing. I&#8217;m building a project or webapp, but it&#8217;s not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works.
</blockquote>
</div>
<div class="paragraph">
<p>This "AI-First Coding" is rapidly being embraced by <a href="https://www.youtube.com/watch?v=w-Dk7sTba2I">Big Tech</a> and is quickly becoming the new norm:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/big-tech-embraces-vibe-coding.png" alt="Big Tech embraces Vibe Coding">
</div>
</div>
<div class="paragraph">
<p>Figure 1: Big Tech embraces Vibe Coding (the screenshot was taken from the <a href="https://www.youtube.com/@CNBCtelevision">CNBC Television YouTube Channel</a>)</p>
</div>
<div class="paragraph">
<p>In this article, we will delve into the innovative solutions and tools that are transforming vibe coding from a concept to a powerful new reality for developers everywhere. We will also explore why Cloud Development Environments (CDEs) are the ideal playground for the "AI-First Coding" unlike the local IDEs.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_open-source-tools-for-the-vibe-coder">Open-Source Tools for the Vibe Coder</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To truly embrace Vibe Coding, you need the right tools. While many closed-source assistants exist—such as <a href="https://cursor.sh/">Cursor</a>, <a href="https://www.windsurf.ai/">Windsurf</a>, and <a href="https://kiro.dev/">Kiro</a> (all effectively forks of the <a href="https://github.com/microsoft/vscode">Visual Studio Code - Open Source ("Code - OSS")</a>), the open-source community offers powerful alternatives that provide greater control and transparency.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
A significant drawback of local-first AI tools is their potential to disrupt your local development environment if the AI assistant misbehaves. Cloud Development Environments (CDEs), however, offer a crucial advantage for AI assistants: they provide isolated, repeatable, and on-demand workspaces. This means developers don’t have to worry about misbehaving AI tools, MCP agents, or other integrations breaking their local setup, as any issues remain contained within a pod/namespace itself (assuming proper RBAC setup for the developer persona on the Kubernetes cluster).
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Let&#8217;s explore a few awesome open-source extensions available on <a href="https://open-vsx.org/">Open VSX</a> that make vibe coding a reality today.</p>
</div>
<div class="sect2">
<h3 id="_continue">Continue</h3>
<div class="paragraph">
<p><a href="https://continue.dev/">Continue</a> is an open-source autopilot for software development, available under the Apache 2.0 license. Continue enables developers to create, share, and use custom AI code assistants with open-source VS Code and JetBrains extensions, as well as a hub of models, rules, prompts, documentation, and other building blocks. The <a href="https://open-vsx.org/extension/Continue/continue">extension</a> allows you to connect to any LLM, local or hosted, to receive coding assistance directly within the IDE.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Learn more about integrating a private AI coding assistant into your Cloud Development Environments using Ollama and Continue in the dedicated <a href="https://developers.redhat.com/learn/openshift-ai/integrate-private-ai-coding-assistant-your-cde-using-ollama-continue-openshift-dev-spaces">article</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_cline">Cline</h3>
<div class="paragraph">
<p><a href="https://cline.bot/">Cline</a> is an open-source extension for Visual Studio Code, available under the Apache 2.0 license. Cline (pronounced /klaɪn/, like “Klein”), an AI assistant that can use your <strong>CLI</strong> a<strong>N</strong>d <strong>E</strong>ditor. <a href="https://open-vsx.org/extension/saoudrizwan/claude-dev">Cline extension</a> is an autonomous coding agent right in the IDE, capable of creating/editing files, executing commands, using the browser, and more with your permission every step of the way.</p>
</div>
</div>
<div class="sect2">
<h3 id="_roo-code">Roo Code</h3>
<div class="paragraph">
<p><a href="https://open-vsx.org/extension/RooVeterinaryInc/roo-cline">Roo Code</a> is yet another open-source extension for Visual Studio Code, available under the Apache 2.0 license. As a <a href="https://github.com/RooCodeInc/Roo-Code">fork of Cline</a>, Roo Code builds upon its foundation to provide an AI coding assistant that integrates directly into the IDE. It excels at understanding your intentions, offering intelligent code completions, refactoring suggestions, and explaining complex code blocks. Designed to thrive in CDEs, Roo Code provides a secure, reproducible environment to push the boundaries of AI-powered development. With Roo, you can request broad changes, refactor entire functions with a single prompt, and let the AI handle repetitive tasks, freeing you to focus on the creative aspects of coding. Roo Code is an AI-powered autonomous coding agent that lives in your editor. It can:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Communicate in natural language</p>
</li>
<li>
<p>Read and write files directly in your workspace</p>
</li>
<li>
<p>Run terminal commands</p>
</li>
<li>
<p>Automate browser actions</p>
</li>
<li>
<p>Integrate with any OpenAI-compatible or custom API/model</p>
</li>
<li>
<p>Adapt its “personality” and capabilities through Custom Modes</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Whether you’re seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, <a href="https://roocode.com/">Roo Code</a> can help you build software more efficiently.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_experience-vibe-coding-now">Experience Vibe Coding Now!</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ready to experience the future of coding? All you need is a browser!</p>
</div>
<div class="paragraph">
<p>You can start Vibe Coding in minutes using <a href="https://eclipse.dev/che/docs/stable/hosted-che/hosted-che/">Eclipse Che hosted by Red Hat</a> on the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Register for a <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox for Red Hat OpenShift account</a>.</p>
</li>
<li>
<p>Go to <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a></p>
</li>
<li>
<p>Start an <code>Empty Workspace</code> from the <strong>Getting Started Samples</strong> or import your pet project from Git:</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/dashboard.png" alt="User Dashboard">
</div>
</div>
<div class="paragraph">
<p>Figure 2: User Dashboard</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Install the <code>Roo Code</code> extension from the marketplace:</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/marketplace.png" alt="Open VSX Marketplace">
</div>
</div>
<div class="paragraph">
<p>Figure 3: Open VSX Marketplace</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can add the <code>Roo Code</code> extension to the <a href="https://github.com/eclipse-che/blog/blob/main/.vscode/extensions.json">.vscode/extensions.json</a> file in the Git repository, and it will be installed automatically after workspace startup:
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Choose LLM and Configure the API Key in the Roo Code "Settings".</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/roo-settings.png" alt="Roo Code Settings">
</div>
</div>
<div class="paragraph">
<p>Figure 4: Roo Code Settings</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
For some Gemini models e.g. <code>gemini-2.5-flash</code> you can generate a free API Key on the <a href="https://aistudio.google.com/">Google AI Studio</a>. You only need to set up the API key once in the extension; it will be persisted in your browser settings for future workspaces.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>And&#8230;&#8203; start vibe coding - put the wildest ideas in the chat window, and Roo Code will do it&#8217;s best to make it come true!</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/roo.png" alt="Roo Code">
</div>
</div>
<div class="paragraph">
<p>Figure 5: Roo Code Extension</p>
</div>
<div class="paragraph">
<p>This iterative, conversational approach allows you to rapidly prototype and build, focusing on the desired outcome rather than the intricate details of implementation.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vibe coding represents a paradigm shift in software development. It’s about moving away from meticulous, line-by-line implementation and embracing a more intuitive, conversational, and results-driven workflow. This AI-first approach, powered by increasingly sophisticated LLMs, lets developers focus on the "what" rather than the "how," accelerating innovation and making development more accessible.</p>
</div>
<div class="paragraph">
<p>AI coding assistants are central to this new workflow, providing code suggestions, completions, and contextual help. Combining these assistants with a Cloud Development Environment creates a powerful and secure setup. CDEs offer isolated, on-demand workspaces, allowing your AI assistant to experiment freely without risking your local machine. Any issues are contained within the ephemeral workspace, which can be easily discarded and restarted.</p>
</div>
<div class="paragraph">
<p>As we&#8217;ve explored, Cloud Development Environments are the ideal playground for this new era. They provide safe, isolated, and reproducible workspaces where you can unleash powerful AI assistants like <a href="https://open-vsx.org/extension/RooVeterinaryInc/roo-cline">Roo Code</a> without fear of breaking your local setup. The synergy between a CDE and a cutting-edge AI assistant enables a flow state of rapid prototyping and iteration that was previously unimaginable.</p>
</div>
<div class="paragraph">
<p>The journey into vibe coding is just beginning. We encourage you to follow our guide, embrace the flow, and discover how these tools can transform your own development process. The future of coding isn&#8217;t about replacing developers; it&#8217;s about empowering them with tools that amplify their creativity and productivity.</p>
</div>
<div class="paragraph">
<p>Happy Vibe Coding!</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Vibe Coding with Eclipse Che]]></summary></entry><entry><title type="html">Running at Scale</title><link href="https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk-running-at-scale.html" rel="alternate" type="text/html" title="Running at Scale" /><published>2025-04-29T00:00:00+00:00</published><updated>2025-04-29T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk/running-at-scale</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk-running-at-scale.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Even though <a href="https://kubernetes.io/">Kubernetes</a> has emerged as a powerful foundation for deploying and managing containerized workloads at scale, achieving scale with Cloud Development Environments (CDEs), particularly in the range of thousands of concurrent workspaces, presents significant challenges.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
CDE workloads are complex to scale mainly because of the fact that underlying IDE solutions, such as <a href="https://github.com/microsoft/vscode">Visual Studio Code - Open Source ("Code - OSS")</a> or <a href="https://www.jetbrains.com/remote-development/gateway/">JetBrains Gateway</a>, are designed as single-user applications rather than multitenant services.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Such a scale imposes substantial infrastructure demands and introduces potential bottlenecks that can impact the performance and stability of the entire system. Addressing these challenges requires meticulous planning, strategic architectural choices, monitoring, and continuous optimization to ensure a seamless and efficient development experience for a large number of users. In this article, you can find a few important takeaways worth considering when running <a href="https://eclipse.dev/che/">Eclipse Che</a> at scale on Kubernetes.</p>
</div>
<div class="sect2">
<h3 id="_planning-your-environment-according-to-object-maximums">Planning your environment according to object maximums</h3>
<div class="paragraph">
<p>While there is no strict limit on the number of resources in a Kubernetes cluster,
there are certain <a href="https://kubernetes.io/docs/setup/best-practices/cluster-large/">considerations for large clusters</a> to keep in mind.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
More insights about the Kubernetes scalability can be found in the <a href="https://kubernetespodcast.com/episode/111-scalability/">"Scalability, with Wojciech Tyczynski"</a> Kubernetes Podcast.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p><a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">OpenShift Container Platform</a>, which is a certified distribution of Kubernetes, also provides a set of tested maximums for various resources, which can serve as an initial guideline for planning your environment:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Resource type</th>
<th class="tableblock halign-left valign-top">Tested maximum</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of nodes</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of pods</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">150000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of pods per node</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of namespace</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of services</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of secrets</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">80000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of config maps</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">90000</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Table 1: OpenShift Container Platform tested cluster maximums for various resources.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details on the OpenShift Container Platform tested object maximums in the <a href="https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html/scalability_and_performance/planning-your-environment-according-to-object-maximums#planning-your-environment-according-to-object-maximums">official documentation</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>For example, it is generally not recommended to have more than 10,000 namespaces due to potential performance and management overhead. In Eclipse Che, for instance, each user is allocated a namespace. If you expect the user base to be large, consider spreading workloads across multiple "fit-for-purpose" clusters and potentially leveraging solutions for multi-cluster orchestration.</p>
</div>
</div>
<div class="sect2">
<h3 id="_calculating-resource-requirements">Calculating Resource Requirements</h3>
<div class="paragraph">
<p>When deploying Eclipse Che on Kubernetes, it is crucial to accurately calculate the resource requirements and determine memory and CPU / GPU needs for each CDE to come up with the right sizing of the cluster. In general, the CDE size is limited by and can not be bigger than the worker node size. The resource requirements for CDEs can vary significantly based on the specific workloads and configurations. For example, a simple CDE may require only a few hundred megabytes of memory, while a more complex one will need several gigabytes of memory and multiple CPU cores.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about calculating resource requirements in the <a href="https://eclipse.dev/che/docs/stable/administration-guide/calculating-che-resource-requirements/">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_etcd">etcd</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The primary datastore of Kubernetes cluster configuration and state is <a href="https://etcd.io/">etcd</a>. It holds the cluster state and configuration, including information about nodes, pods, services, and custom resources. As a distributed key-value store, etcd does not scale well past a certain threshold, and as the size of etcd grows, so does the load on the cluster, risking its stability.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
The default etcd size is 2 GB, and the recommended maximum is 8 GB. Exceeding the maximum limit can make the Kubernetes cluster unstable and unresponsive.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/running-at-scale/etcd.png" alt="Metrics with the progression of the etcd storage growth that leads to cluster instability">
</div>
</div>
<div class="paragraph">
<p>Figure 1: Metrics with the progression of the etcd storage growth that leads to cluster instability.</p>
</div>
<div class="sect2">
<h3 id="_the-size-of-the-objects-matters">The size of the objects matters</h3>
<div class="paragraph">
<p>Not only the overall number, but also the size of the objects stored in etcd is a critical factor that can significantly impact its performance and stability. Each object stored in etcd consumes space, and as the number of objects increases, the overall size of etcd grows too. The larger the object is, the more space it takes in etcd. For example, etcd can be overloaded with just a few thousand of relatively big Kubernetes objects.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Even though the data stored in a <code>ConfigMap</code> cannot exceed 1 MiB by design, a few thousand of relatively big <code>ConfigMap</code> objects can overload etcd storage.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>In the context of Eclipse Che, by default the operator creates and manages the 'ca-certs-merged' ConfigMap, which contains the Certificate Authorities (CAs) bundle, in every user namespace. With a large number of TLS certificates in the cluster, this results in additional etcd usage.</p>
</div>
<div class="paragraph">
<p>In order to disable mounting the CA bundle using the <code>ConfigMap</code> under the <code>/etc/pki/ca-trust/extracted/pem</code> path, configure the <code>CheCluster</code> Custom Resource by setting the <code>disableWorkspaceCaBundleMount</code> property to <code>true</code>. With this configuration, only custom certificates will be mounted under the path <code>/public-certs</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">spec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">devEnvironments</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">trustedCerts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">disableWorkspaceCaBundleMount</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about importing untrusted TLS certificates in the <a href="https://eclipse.dev/che/docs/stable/administration-guide/importing-untrusted-tls-certificates/">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_devworkspace-objects">DevWorkspace objects</h3>
<div class="paragraph">
<p>For large Kubernetes deployments, particularly those involving a high number of custom resources such as <code>DevWorkspace</code> objects, which represent CDEs, etcd can become a significant performance bottleneck.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Based on the load testing for 6,000 <code>DevWorkspace</code> objects, storage consumption for etcd was around 2.5GB.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Starting from <a href="https://github.com/devfile/devworkspace-operator">DevWorkspace Operator</a> version 0.34.0, you can configure a pruner that would automatically clean up <code>DevWorkspace</code> objects that were not in use for a certain period of time. To set the pruner up, configure the <code>DevWorkspaceOperatorConfig</code> object as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">apiVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">controller.devfile.io/v1alpha1</span>
<span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">DevWorkspaceOperatorConfig</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devworkspace-operator-config</span>
  <span style="color: #a6e22e">namespace</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">crw</span>
<span style="color: #a6e22e">config</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">workspace</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">cleanupCronJob</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">enabled</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span>
      <span style="color: #a6e22e">dryRun</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">false</span>
      <span style="color: #a6e22e">retainTime</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">2592000</span> <span style="color: #75715e;font-style: italic"># By default, if a workspace was not started for more than 30 days it will be marked for deletion</span>
      <span style="color: #a6e22e">schedule</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">“0 0 1 * *”</span> <span style="color: #75715e;font-style: italic"># By default, the pruner will run once per month</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about DevWorkspace Operator Configuration in the <a href="https://github.com/devfile/devworkspace-operator/blob/main/docs/dwo-configuration.md">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_olmconfig">OLMConfig</h3>
<div class="paragraph">
<p>When an operator is installed by the <a href="https://olm.operatorframework.io/">Operator Lifecycle Manager (OLM)</a>, a stripped-down copy of its CSV is created in every namespace the operator is configured to watch. These stripped-down CSVs are known as “Copied CSVs” and communicate to users which controllers are actively reconciling resource events in a given namespace. On especially large clusters, with namespaces and installed operators tending in the hundreds or thousands, Copied CSVs consume an untenable amount of resources; e.g. OLM’s memory usage, cluster etcd limits, networking, etc. In order to eliminate the CSVs copied to every namespace, configure the <code>OLMConfig</code> object accordingly:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">apiVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">operators.coreos.com/v1</span>
<span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">OLMConfig</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">cluster</span>
<span style="color: #a6e22e">spec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">features</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">disableCopiedCSVs</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Additional information about the <code>disableCopiedCSVs</code> feature can be found in its original <a href="https://github.com/operator-framework/enhancements/blob/master/enhancements/olm-toggle-copied-csvs.md">enhancement proposal</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The primary impact of the <code>disableCopiedCSVs</code> property on etcd is related to resource consumption. In clusters with a large number of namespaces and many cluster-wide Operators, the creation and maintenance of numerous Copied CSVs can lead to increased etcd storage usage and memory consumption. By disabling Copied CSVs, the amount of data stored in etcd is significantly reduced, which can help improve overall cluster performance and stability.</p>
</div>
<div class="paragraph">
<p>This is particularly important for large clusters where the number of namespaces and operators can quickly add up to a significant amount of data. Disabling Copied CSVs can help reduce the load on etcd, leading to improved performance and responsiveness of the cluster.
Additionally, it can help reduce the memory footprint of OLM, as it no longer needs to maintain and manage these additional resources.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about "Disabling Copied CSVs" in the <a href="https://olm.operatorframework.io/docs/advanced-tasks/configuring-olm/#disabling-copied-csvs">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_cluster-autoscaling">Cluster Autoscaling</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Although cluster autoscaling is a powerful Kubernetes feature, you cannot always fall back on it. You should always consider predictive scaling by analyzing load data on your environment to detect daily or weekly usage patterns. If your workloads follow a pattern and there are dramatic peaks throughout the day, you should consider provisioning worker nodes accordingly. For example, if you have a predictable load pattern where the number of workspaces increases during business hours and decreases during off-hours, you can use predictive scaling to adjust the number of worker nodes based on the expected load.
This can help ensure that you have enough resources available to handle the peak load while minimizing costs during off-peak hours.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Consider leveraging open-source solutions like <a href="https://karpenter.sh/">Karpenter</a> for configuration and lifecycle management of the worker nodes. Karpenter can dynamically provision and optimize worker nodes based on the specific requirements of the workloads, helping to improve resource utilization and reduce costs.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_multi-cluster">Multi-cluster</h2>
<div class="sectionbody">
<div class="paragraph">
<p>By design, Eclipse Che is not multi-cluster aware, and you can only have one instance per cluster. However, you can run Eclipse Che in a multi-cluster environment by deploying Eclipse Che in each different cluster and using a load balancer or DNS-based routing to direct traffic to the appropriate instance based on the user’s location or other criteria. This approach can help improve performance and reliability by distributing the workload across multiple clusters and providing redundancy in case of cluster failures.</p>
</div>
<div class="paragraph">
<p>One example of a multi-cluster architecture is <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a>, which is part of the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.</p>
</div>
<div class="paragraph">
<p>From the infrastructure perspective, the Developer Sandbox consists of multiple <a href="https://www.redhat.com/en/technologies/cloud-computing/openshift/aws">ROSA</a> clusters. On each cluster, the productized version of Eclipse Che is installed and configured using <a href="https://argo-cd.readthedocs.io/en/stable/">Argo CD</a>. Since the user base is spread across multiple clusters, <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a> is used as a single entry point to the productized Eclipse Che instances. You can find implementation details about the multicluster redirector in the following <a href="https://github.com/codeready-toolchain/crw-multicluster-redirector">GitHub repository</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/running-at-scale/developer-sandbox.png" alt="Multi-cluster solution for running the productized version of Eclipse Che on the Developer Sandbox">
</div>
</div>
<div class="paragraph">
<p>Figure 2: Multi-cluster solution for running the productized version of Eclipse Che on the Developer Sandbox.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
The solution for <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a> is a Developer Sandbox-specific solution that can not be reused as-is in other environments. However, you can use it as a reference for implementing a similar solution well-tailored to your specific multicluster needs.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Running Eclipse Che at scale on Kubernetes presents unique challenges that require careful planning and consideration of various factors. By understanding the limitations of Kubernetes, accurately calculating resource requirements, and implementing best practices for managing etcd and OLM, you can build a robust and scalable CDE platform that meets the needs of your users. Additionally, leveraging predictive scaling and considering multicluster architectures can further enhance the performance and reliability of Eclipse Che deployments. By following these guidelines and continuously monitoring and optimizing the environment, you can provide a reliable and efficient CDE, ensure a seamless and efficient development experience for a large number of users while maintaining responsiveness, and prevent performance degradation of the cluster.</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Running Eclipse Che at scale on Kubernetes]]></summary></entry><entry><title type="html">Working locally in the cloud: Develop in local Visual Studio Code with Eclipse Che as your Cloud Development Environment</title><link href="https://che.eclipseprojects.io/2025/02/27/@vgulyy-use-desktop-visual-studio-code.html" rel="alternate" type="text/html" title="Working locally in the cloud: Develop in local Visual Studio Code with Eclipse Che as your Cloud Development Environment" /><published>2025-02-27T00:00:00+00:00</published><updated>2025-02-27T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/02/27/@vgulyy/use-desktop-visual-studio-code</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/02/27/@vgulyy-use-desktop-visual-studio-code.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse Che provides developers with a web version of the <a href="https://github.com/microsoft/vscode">Visual Studio Code OSS</a> editor, which includes most features from the desktop version. The transition to cloud development can feel quite unusual for developers, but Eclipse Che has a feature that will help you feel right at home immediately.
With <a href="https://code.visualstudio.com/docs/editor/command-line">Visual Studio Code Command Line Interface (CLI)</a> you can create a tunnel that allows you to connect your local Visual Studio Code, an editor you may already be familiar with, to your workspace.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_connecting-visual-studio-code-desktop-to-a-new-workspace">Connecting Visual Studio Code desktop to a new workspace</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can connect your local Visual Studio Code to a new workspace with a few clicks.
First, create a workspace from the Che Dashboard and choose Visual Studio Code (desktop) as your editor.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/select-editor.png" alt="Create Workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Wait for the login page to appear and log in with your Microsoft or GitHub account.
Click the <strong>Copy &amp; Continue to Microsoft</strong> or <strong>Copy &amp; Continue to GitHub</strong> button to copy the authentication code to the clipboard and to open the authenticating pop-up.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/login-with-provider.png" alt="Login with GitHub account">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Complete the authentication process, paste the code from the clipboard, and follow the instructions. Upon successful authentication, close the pop-up and wait for the tunnel to your workspace to be created.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/open-visual-studio-code.png" alt="Tunnel to the workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Click <strong>Open in Visual Studio Code desktop</strong> to open your workspace in the desktop version of Visual Studio Code. Confirm opening the desktop application by clicking Open Visual Studio Code - URL Handler.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/confirm-opening-vscode-desktop.png" alt="Open in Visual Studio Code desktop">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Wait for the local Visual Studio Code to load and allow the <strong>Remote - Tunnels</strong> extension to open the URI.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>If Visual Studio Code opens your workspace with a delay, open the <strong>Remote Explorer</strong> view.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_connecting-visual-studio-code-desktop-to-a-running-workspace">Connecting Visual Studio Code desktop to a running workspace</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_prepare-your-local-visual-studio-code">Prepare your local Visual Studio Code.</h3>
<div class="paragraph">
<p>First, you need to install both <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server">Remote - Tunnels</a> and <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer">Remote Explorer</a> extensions to your local Visual Studio Code. It will allow you to connect to a remote machine via a secure tunnel.</p>
</div>
</div>
<div class="sect2">
<h3 id="_install-visual-studio-code-cli">Install Visual Studio Code CLI.</h3>
<div class="paragraph">
<p>Next, you need to install Visual Studio Code CLI in your workspace. Open a terminal and run the following command to install Visual Studio Code CLI in the <code>/checode</code> directory.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code">curl 'https://code.visualstudio.com/sha/download?build=stable&amp;os=cli-alpine-x64' --location -o /tmp/code.tar.gz &amp;&amp; \
tar -xvzf /tmp/code.tar.gz --directory=/checode</code></pre>
</div>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
<div class="paragraph">
<p>If you don&#8217;t have <code>gzip</code> installed in your workspace, you won&#8217;t be able to install the CLI using the command above.</p>
</div>
<div class="paragraph">
<p>In this case you need to:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><a href="https://code.visualstudio.com/Download">download CLI</a> for <strong>Linux x64</strong> architecture to your desktop</p>
</li>
<li>
<p>unpack and upload the extracted binary to your workspace root</p>
</li>
<li>
<p>move the binary to <code>/checode</code> directory and make it executable by <code>mv $PROJECT_SOURCE/code /checode &amp;&amp; chmod +x /checode/code</code></p>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>By placing the Visual Studio Code CLI binary in the <code>/checode</code> directory, it will persist even if the workspace is restarted.</p>
</div>
</div>
<div class="sect2">
<h3 id="_create-a-secure-tunnel-to-the-cloud-development-environment">Create a secure tunnel to the Cloud Development Environment.</h3>
<div class="paragraph">
<p>Open the workspace terminal and launch the Visual Studio Code CLI with the command below.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code">/checode/code tunnel --accept-server-license-terms --name $DEVWORKSPACE_NAME</code></pre>
</div>
</div>
<div class="paragraph">
<p>Log in using your Microsoft or GitHub account.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/cli-create-tunnel.png" alt="Create a secure tunnel to the workpace">
</div>
</div>
<div class="paragraph">
<p>After successful login, you will see the information about the created tunnel and will be prompted to open the workspace in your browser.</p>
</div>
</div>
<div class="sect2">
<h3 id="_open-your-workspace-using-local-visual-studio-code">Open your workspace using local Visual Studio Code.</h3>
<div class="paragraph">
<p>Open your local Visual Studio Code and navigate to the <strong>Remote Explorer</strong> view. A tunnel to your workspace will appear.
With the buttons on the right, open your workspace in the current or a new window.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/vscode-remote-explorer.png" alt="Open your workspace in local Visual Studio Code">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>A tunnel to your workspace will not appear if you are not signed in yet.
Sign in using the same account you used to create the tunnel.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>You are now equipped to develop locally within a Cloud Development Environment.
&#160;<br>
&#160;<br>
Happy coding!</p>
</div>
</div>
</div>
</div>]]></content><author><name>Vitaliy Gulyy</name></author><summary type="html"><![CDATA[Use your local Visual Studio Code as an editor for a Che workspace]]></summary></entry><entry><title type="html">In Kubernetes We Trust</title><link href="https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk-in-kubernetes-we-trust.html" rel="alternate" type="text/html" title="In Kubernetes We Trust" /><published>2024-11-26T00:00:00+00:00</published><updated>2024-11-26T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk/in-kubernetes-we-trust</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk-in-kubernetes-we-trust.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Last year, the <a href="https://youtu.be/eIOZq_e-Fjs?si=lecaEpLC5vEb0-Za">"Pros and cons of using Kubernetes as a development platform"</a>  session was presented at <a href="https://www.eclipse.org/events/2023/eclipsecon/">EclipseCon</a> in Ludwigsburg. The main message was that, indeed, <a href="https://kubernetes.io/">Kubernetes</a> is complex and sometimes there are caveats and tradeoffs to make, but it is evolving rapidly with plenty of new features and opportunities available with every release. Today it is time to reflect a bit more on this topic.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_building-an-application-platform-for-developers">Building an application platform for developers</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you are considering building your own development platform it is recommended to read the brilliant <a href="https://www.oreilly.com/library/view/production-kubernetes/9781492092292/">“Production Kubernetes”</a> book, where a multitude of potential options are described in great detail:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/in-kubernetes-we-trust/multitude-of-options-available-to-provide-an-application-platform-to-developers.png" alt="The multitude of options available to provide an application platform to developers">
</div>
</div>
<div class="paragraph">
<p>Figure 1: The multitude of options available to provide an application platform to developers.</p>
</div>
<div class="paragraph">
<p>Of course, you can always craft your own platform from scratch or even decide that the <a href="https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0">cloud</a>, in general, is not your cup of tea and stop the Cloud Development Environment (CDE) journey right here since local development is good enough for your use-case and works “just fine”. Nevertheless, in <a href="https://eclipse.dev/che/">Eclipse Che</a> we strongly believe in the hybrid cloud strategy, and that Kubernetes is one of the best possible options for building a modern CDE platform for developers because of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Extensibility</p>
</li>
<li>
<p>Scalability</p>
</li>
<li>
<p>Resource Efficiency</p>
</li>
<li>
<p>Consistency</p>
</li>
<li>
<p>High Availability</p>
</li>
<li>
<p>Control</p>
</li>
<li>
<p>Open Source</p>
</li>
<li>
<p>Community</p>
</li>
<li>
<p>Vendor Neutrality</p>
</li>
<li>
<p>Hybrid-Cloud Nature</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>However, there are a lot of subtle details worth considering when using Kubernetes as the pillar for building an application platform for developers. Some of them are described in the dedicated <a href="https://youtu.be/eIOZq_e-Fjs?si=w6_Nx-v4nwg85QgP">EclipseCon session</a> mentioned in the introduction:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Networking</p>
</li>
<li>
<p>Storage</p>
</li>
<li>
<p>Immutability</p>
</li>
<li>
<p>Permissions</p>
</li>
<li>
<p>CPU Throttling</p>
</li>
<li>
<p>OOM Kill</p>
</li>
<li>
<p>Image Pulling</p>
</li>
<li>
<p>Image Building</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In this article you can find a few more.</p>
</div>
<div class="sect2">
<h3 id="_namespaces">Namespaces</h3>
<div class="paragraph">
<p>While there is no strict limit on the number of namespaces in a Kubernetes cluster, having more than 10,000 is generally not recommended due to potential performance and management overhead. In Eclipse Che for instance, each user is allocated a namespace. If you expect the user base to be large, consider spreading workloads across multiple clusters and potentially leveraging solutions for multi-cluster orchestration.</p>
</div>
</div>
<div class="sect2">
<h3 id="_gitops">GitOps</h3>
<div class="paragraph">
<p>Do NOT manage the Kubernetes clusters manually otherwise you will end up with a snowflake environment. Application definitions, configurations, and environments should be declarative and version controlled. Application deployment and lifecycle management should be automated, auditable, and easy to understand. Using a GitOps CD solution for Kubernetes such as <a href="https://argo-cd.readthedocs.io/">Argo CD</a> is a must-have when managing a complex application platform for developers.</p>
</div>
</div>
<div class="sect2">
<h3 id="_root-access">Root Access</h3>
<div class="paragraph">
<p>Containers running as root on a cluster are a major security risk since they significantly increase the attack surface, potentially allowing root access over the host node. That is the main reason why the containers on <a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">OpenShift</a> are running using <a href="https://cookbook.openshift.org/users-and-role-based-access-control/why-do-my-applications-run-as-a-random-user-id.html">Arbitrary User IDs</a> by default. This approach provides additional security against processes escaping the container due to a container engine vulnerability, thereby achieving escalated permissions on the host node. This basic principle applies to CDEs as well. It might look like a trade-off between security and usability, when users cannot easily install OS-scoped packages in the runtime. However, dynamically installing packages in a running workspace is an anti-pattern - containers are supposed to be immutable, and installing anything inside a running container is not recommended since all the packages will vanish after the restart.  There is also the added benefit of maintaining workspace consistency across different users by adhering to the immutable principle for container images used in the CDE.</p>
</div>
</div>
<div class="sect2">
<h3 id="_emptydir-volumes">emptyDir Volumes</h3>
<div class="paragraph">
<p>Volume mounting could be by far the most time-consuming operation during pod startup. Consider leveraging ephemeral workloads whenever relevant which are using  <a href="https://kubernetes.io/docs/concepts/storage/volumes/#emptydir">emptyDir</a> volumes under the hood. In the context of Eclipse Che, those are ephemeral workspaces that could be particularly useful for developer routines like code review, with the dedicated storage type defined on the <a href="https://devfile.io/">devfile</a> level:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>schemaVersion: 2.3.0
metadata:
  generateName: quarkus-api-example
attributes:
  controller.devfile.io/storage-type: ephemeral</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_cluster-autoscaling">Cluster Autoscaling</h3>
<div class="paragraph">
<p>Although <a href="https://kubernetes.io/docs/concepts/cluster-administration/cluster-autoscaling/">Cluster Autoscaling</a> is a powerful Kubernetes feature, you cannot always fall back on it and should always consider predictive scaling by analyzing load data on your environment to detect daily or weekly usage patterns. If your workloads follow a pattern and there are dramatic peaks throughout the day you should consider provisioning worker nodes accordingly (e.g. a lot of users turn on their smart speakers in the morning between 7 - 9 a.m. causing a huge spike in requests that can be predicted and handled in advance on the infrastructure level).</p>
</div>
</div>
<div class="sect2">
<h3 id="_cpu-limits">CPU Limits</h3>
<div class="paragraph">
<p>Setting CPU Limits in general is a contended topic for production workloads, since If you apply them the workloads are throttled by definition. Limits for CPU for soft-tenancy pods are probably not going to be helpful unless you are approaching very dense setups (&gt; 10 pods per core) - otherwise, you will waste more CPU by throttling than you save. CPU Limits definitely increase tail latencies for most non-predictable workloads (almost all request-driven use cases) in a way that will result in a worse overall application environment for most users most of the time (because of how limits are sliced).  At lower pods per core, you are almost certainly trading a false security for a worse quality of service for the workloads you are running on Kubernetes.</p>
</div>
<div class="paragraph">
<p>CPU Limits are most useful when dealing with bad actors on your own platform, and even then, there are far more effective ways of dealing with bad actors like detection and account blocking.  However, in the case of CDEs, you may consider applying the limits on the namespace level to prevent developers from accidentally saturating a compute node. If you apply limits, you must make sure the limits are high enough to allow normal bursts of CPU usage during the inner-loop activities.  Otherwise, developers may experience unexpected performance issues during CPU-intensive activities.</p>
</div>
</div>
<div class="sect2">
<h3 id="_ephemeral-containers">Ephemeral Containers</h3>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/">Ephemeral Containers</a> is a great example of how Kubernetes features are providing new opportunities for building application platforms for developers every release. Last year we talked about Ephemeral Containers at EclipseCon as a potential new opportunity for Cloud Development Environments. This year a <a href="https://github.com/devfile/kubectl-debug-ide">kubectl plugin</a> for debugging Kubernetes pods from a CDE, rather than the CLI has been presented at <a href="https://youtu.be/fg57Zmm4eN4?si=8LyyRsud6lMJg59h">KubeCon</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_dynamic-resource-allocation-dra">Dynamic Resource Allocation (DRA)</h3>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/">Dynamic Resource Allocation (DRA)</a> is yet another striking example of how Kubernetes features are providing new opportunities for developers with every release. With the push for GPU-centric applications, DRA was presented all throughout the last <a href="https://notes.elmiko.dev/2024/11/19/kubecon-na-2024-retrospective.html">KubeCon North America 2024</a>. It speaks to the popularity of AI-related workloads that require specific resources, and while today DRA mostly targets GPUs, it is very well possible that one day we will be talking about DRA for everything from CPUs and memory to customized hardware accelerators in the future.</p>
</div>
</div>
<div class="sect2">
<h3 id="_release-notes">Release Notes</h3>
<div class="paragraph">
<p>To maximize the potential of your Kubernetes-based developer platform, consistently review the <a href="https://kubernetes.io/releases/notes/">Release Notes</a>. They offer a treasury of opportunities for innovative features,  performance enhancements, optimizations, recommended configurations, best practices, and strategic planning based on future roadmap insights.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_adoption">Adoption</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For the last few years, we have seen a spike in the adoption of <a href="https://eclipse.dev/che/">Eclipse Che</a> and the downstream product <a href="https://developers.redhat.com/products/openshift-dev-spaces">Red Hat OpenShift Dev Spaces</a> built on top of it. Multiple success stories when the Kubernetes-based platform for provisioning CDEs to enterprise teams is deployed across public, private, and hybrid environments motivate and encourage us every day. Here are just a few public references:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>EPAM Systems deploys Eclipse Che on <a href="https://che.eclipseprojects.io/2022/07/25/@karatkep-installing-eclipse-che-on-aks.html">Azure Kubernetes Service (AKS)</a>.</p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=NYCFzNDdXTk">Ford Motor Company</a> uses fit-for-purpose OpenShift clusters and a dedicated Kubernetes Operator for managing CDEs.</p>
</li>
<li>
<p><a href="https://www.redhat.com/en/success-stories/capgemini">Capgemini</a> accelerates digital service development for the Federal Information Technology Center (ITZBund) using Red Hat OpenShift Dev Spaces Operator in combination with <a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/index.html">NVIDIA vGPU Operator</a> for managing CDEs in the 100% air-gapped environment, isolated from the internet.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We trust in Kubernetes and do believe in the hybrid cloud. Open Source is in our DNA.</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Building an application platform for developers on Kubernetes]]></summary></entry><entry><title type="html">Boosting CDE Security in a Kubernetes cluster: A Guide to new features</title><link href="https://che.eclipseprojects.io/2024/10/28/@tolusha-boosting-cde-security-on-kubernetes-cluster.html" rel="alternate" type="text/html" title="Boosting CDE Security in a Kubernetes cluster: A Guide to new features" /><published>2024-10-28T00:00:00+00:00</published><updated>2024-10-28T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/10/28/@tolusha/boosting-cde-security-on-kubernetes-cluster</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/10/28/@tolusha-boosting-cde-security-on-kubernetes-cluster.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As organizations transition to cloud-native development, maintaining control, security, and flexibility in development environments becomes critical. Eclipse Che is a powerful Kubernetes-native IDE that offers administrators tools for ensuring security and resource efficiency. In this post, we&#8217;ll look at three new Eclipse Che features that improve security and resource control in your development environments.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_limiting-the-number-of-simultaneous-workspaces">Limiting the Number of Simultaneous Workspaces</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Effective resource management is critical in cloud-based environments, as uncontrolled workspace development can quickly deplete resources and degrade system performance. To mitigate this risk, Eclipse Che now has a functionality that restricts the amount of running workspaces per cluster.</p>
</div>
<div class="paragraph">
<p>Administrators can use this feature to limit the amount of workspaces that can run at the same time, reducing resource misuse, supporting fair allocation of resources among teams, and increasing overall efficiency.</p>
</div>
<div class="paragraph">
<p>In the example below, we set the maximum number of running workspaces per cluster to 20:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">kubectl patch checluster/eclipse-che <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--namespace</span> eclipse-che <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--type</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'merge'</span> <span style="color: #f92672">-p</span> <span style="color: #ae81ff">\</span>
    <span style="color: #e6db74">'{"spec":
        {"devEnvironments":
          {"maxNumberOfRunningWorkspacesPerCluster": 20}
        }
     }'</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If a user exceeds the workspace limit, they will receive a warning message during workspace startup: "Exceeded the cluster limit for running DevWorkspaces"</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/exceeded-the-cluster-limit-for-running-devworkspaces.png" alt="Exceeded the cluster limit for running DevWorkspaces">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>To learn more about configuring workspace limits, follow the <a href="https://eclipse.dev/che/docs/stable/administration-guide/limiting-the-number-of-workspaces-that-all-users-can-run-simultaneously">Eclipse Che documentation</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_untrusted-repository-warning">Untrusted Repository Warning</h2>
<div class="sectionbody">
<div class="paragraph">
<p>It is not recommended to create workspaces from unknown or untrusted repositories automatically. When a user tries to create a workspace in Eclipse Che, a warning window appears on the dashboard, requesting confirmation that they trust the repository before proceeding.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/do-you-trust-the-authors-of-this-repository.png" alt="URL is not permitted for creating a workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configuring-allowed-urls">Configuring Allowed URLs</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This feature ensures that developer workspaces can only be launched from pre-approved, secure URLs. Organizations can prevent workspaces from being started with unwanted URLs by creating a allowlist of trusted domains.</p>
</div>
<div class="paragraph">
<p>In the example below, we configure the allowed URLs to only permit connections to GitLab:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">kubectl patch checluster/eclipse-che <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">--namespace</span> eclipse-che <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">--type</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'merge'</span> <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">-p</span> <span style="color: #ae81ff">\</span>
        <span style="color: #e6db74">'{
           "spec": {
             "devEnvironments": {
               "allowedSources": {
                 "urls": ["https://gitlab.com/*"]
               }
             }
           }
         }'</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If a user attempts to create a workspace with a URL other than GitLab, they will receive an error message: "URL is not permitted for creating a workspace".</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/url-is-not-permitted-for-creating-a-workspace.png" alt="URL is not permitted for creating a workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>To learn more about configuring allowed URLs, follow the <a href="https://eclipse.dev/che/docs/stable/administration-guide/configuring-allowed-urls-for-cloud-development-environments/">Eclipse Che documentation</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse Che&#8217;s new security features, such as limiting simultaneous workspaces and configuring allowed URLs, give administrators greater control over resource usage and workspace security in cloud-native environments. Implementing these updates allows organizations to improve the efficiency and safety of their development workflows, resulting in a secure and well-regulated workspace.</p>
</div>
</div>
</div>]]></content><author><name>Anatolii Bazko</name></author><summary type="html"><![CDATA[Boosting CDE Security on Kubernetes cluster: A Guide to new features]]></summary></entry><entry><title type="html">Writing documentation in Eclipse Che</title><link href="https://che.eclipseprojects.io/2024/08/09/@deerskindoll-writing-docs-with-che.html" rel="alternate" type="text/html" title="Writing documentation in Eclipse Che" /><published>2024-08-09T00:00:00+00:00</published><updated>2024-08-09T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/08/09/@deerskindoll/writing-docs-with-che</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/08/09/@deerskindoll-writing-docs-with-che.html"><![CDATA[<div class="sect1">
<h2 id="_the-quick-and-easy-way-to-create-documentation">The quick and easy way to create documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With Eclipse Che, writing technical documentation is even easier than you think.
Let&#8217;s use the <a href="https://github.com/eclipse-che/che-docs">Eclipse Che documentation repository on GitHub</a>.
The che-docs repository was created with community contribution in mind,
featuring tools you need to create and test your content.
And from the initial draft to submitting a PR,
everything is happening in the environment you&#8217;re already familiar with: an Eclipse Che cloud development environment (CDE).</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/workspace-with-preview.png" alt="An Eclipse Che CDE created from the che-docs repository.">
</div>
<div class="title">Figure 1. An Eclipse Che CDE created from the che-docs repository.</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_getting-started">Getting started</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Click the Developer Workspace button in the che-docs repository <a href="https://github.com/eclipse-che/che-docs?tab=readme-ov-file#eclipse-che-documentation-project">README</a> file.
This opens a clone of the repository in an Eclipse Che workspace hosted
by Red Hat in the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.
Alternatively, you can click right here:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="https://workspaces.openshift.com#https://github.com/eclipse/che-docs"><img src="https://www.eclipse.org/che/contribute.svg" alt="contribute"></a>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-does-it-work">How does it work?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>What about the che-docs repository makes using an Eclipse Che CDE to contribute content so convenient? The following two elements:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://eclipse.dev/che/docs/stable/end-user-guide/devfile-introduction/">devfile</a></p>
</li>
<li>
<p>list of <a href="https://eclipse.dev/che/docs/stable/end-user-guide/microsoft-visual-studio-code-open-source-ide/#automating-installation-of-microsoft-visual-studio-code-extensions-at-workspace-startup">automatically installed Microsoft Visual Studio Code extensions</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Let&#8217;s look at the devfile first.
The che-docs repository contains a simple <a href="https://github.com/eclipse-che/che-docs/blob/main/devfile.yaml">devfile</a>
that defines the basic features of the che-docs workspace.
It also includes a command for building a preview of your newly created content:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code"># sh tools/preview.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>This is helpful not only for checking the layout of the document but also for making sure that embedded images,
links and code blocks are displayed correctly.
Additionally, the preview script features a Vale-based grammar check you can also use separately.
More about this in a moment.</p>
</div>
<div class="paragraph">
<p>By default, the che-docs workspace launches with Visual Studio Code - Open Source ("Code - OSS") as the IDE.
This is relevant for the second file mentioned above.
The che-docs repository features an <a href="https://github.com/eclipse-che/che-docs/blob/main/.vscode/extensions.json">extensions.json</a> file listing Visual Studio Code extensions
you need for writing Eclipse Che content.
When you launch the che-docs workspace for the first time,
these extensions are installed automatically:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/extensions.png" alt="Overview of automatically installed extensions, including the Vale extension.">
</div>
<div class="title">Figure 2. Overview of automatically installed extensions, including the Vale extension.</div>
</div>
<div class="paragraph">
<p>You can start working immediately,
with minimal additional setup required.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_getting-started-2">Getting started</h2>
<div class="sectionbody">
<div class="paragraph">
<p>By launching the che-docs workspace, you&#8217;re almost ready to go:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>You have a clone of the che-docs repository</p>
</li>
<li>
<p>You have an IDE to write in.</p>
</li>
<li>
<p>You have required extensions installed.</p>
</li>
<li>
<p>You have a preview build script.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>There are only three things left to do.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Read the <a href="https://github.com/eclipse-che/che-docs/blob/main/CONTRIBUTING.adoc">contribution guidelines</a>.</p>
</li>
<li>
<p>Read how to <a href="https://redhat-documentation.github.io/supplementary-style-guide/#technical-examples">document commands</a> for Eclipse Che documentation.</p>
</li>
<li>
<p>Update the grammar- and spelling-checking <a href="https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode">Vale extension</a> by running the <code>vale-sync</code> command defined in the <a href="https://github.com/eclipse-che/che-docs/blob/main/devfile.yaml">devfile</a> or directly execute it in the terminal:</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code"># vale sync</code></pre>
</div>
</div>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>The Vale extension included in the che-docs repository follows the grammatical,
spelling and stylistic rules from the <a href="https://redhat-documentation.github.io/supplementary-style-guide/">Red Hat supplementary style guide</a>.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_writing-tips">Writing tips</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A good technical document is easy to read and easy to follow.
Here are a few tips that will help you write great technical content:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Keep it simple. Avoid self-referential language ("this article is about&#8230;&#8203;"), overly long introductions, and deep-dives into the feature&#8217;s history.</p>
</li>
<li>
<p>Keep it accessible. Short paragraphs, sentences and words make your content easy to read.</p>
</li>
<li>
<p>Keep the focus on the user. Write the content around what the user can achieve when they follow your instructions.</p>
</li>
<li>
<p>Keep passive voice to a minimum.</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/pp-hemingway.png" alt="The famous opening lines of Jane Austen&#8217;s Pride and Prejudice novel don&#8217;t follow any of the writing tips listed in this blog post. At grade 16, they also have a very high readability score in the Hemingway Editor. Your technical document should have a readability score between grade 9 and 11.">
</div>
<div class="title">Figure 3. The famous opening lines of Jane Austen&#8217;s Pride and Prejudice novel don&#8217;t follow any of the writing tips listed in this blog post. At grade 16, they also have a very high readability score in the Hemingway Editor. Your technical document should have a readability score between grade 9 and 11.</div>
</div>
<div class="paragraph">
<p>If you want to learn more about technical writing in general,
check out the <a href="https://developers.google.com/style">Google developer documentation style guide</a>.
The readability test is a part of the <a href="https://hemingwayapp.com/">Hemingway Editor</a>.</p>
</div>
<div class="paragraph">
<p>Happy writing!</p>
</div>
</div>
</div>]]></content><author><name>Jana Vrbkova</name></author><summary type="html"><![CDATA[Write documentation using an Eclipse Che CDE.]]></summary></entry><entry><title type="html">IntelliJ IDEA as a desktop editor for Eclipse Che Cloud Development Environment (CDE) running on OpenShift</title><link href="https://che.eclipseprojects.io/2024/07/08/@artem-idea-editor.html" rel="alternate" type="text/html" title="IntelliJ IDEA as a desktop editor for Eclipse Che Cloud Development Environment (CDE) running on OpenShift" /><published>2024-07-08T00:00:00+00:00</published><updated>2024-07-08T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/07/08/@artem/idea-editor</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/07/08/@artem-idea-editor.html"><![CDATA[<div class="paragraph">
<p>In this blog post, we&#8217;ll look at the integration of Eclipse Che with IntelliJ IDEA.</p>
</div>
<div class="paragraph">
<p>It brings the local development experience to the cloud allowing developers to use their familiar IDE when working with the Eclipse Che CDE.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/main.png" alt="Eclipse Che and JetBrains Gateway integration">
</div>
</div>
<div class="sect1">
<h2 id="_why-another-integration-with-jetbrains-ides">Why another integration with JetBrains IDEs?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In addition to Visual Studio Code - Open Source ("Code - OSS"), Eclipse Che also <a href="https://github.com/che-incubator/jetbrains-editor-images/">provides</a> the in-browser variant of IntelliJ IDEA Community Edition as one of the editor options to use when working with your CDE. It&#8217;s based on the JetBrains Projector.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
"Projector is a self-hosted technology that runs IntelliJ-based IDEs and Swing-based apps on the server, allowing you to access them from anywhere using browsers and native apps."&#8201;&#8212;&#8201;From the <a href="https://blog.jetbrains.com/blog/2021/03/11/projector-is-out/">JetBrains blog</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>JetBrains <a href="https://lp.jetbrains.com/projector/">suspended</a> the development and support of the Projector as a standalone project and introduced a new product - <a href="https://www.jetbrains.com/remote-development/gateway/">JetBrains Gateway</a>. It allows the use of the desktop IDE instead of the in-browser web client, and we integrated its support into Eclipse Che.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-to-connect-desktop-intellij-idea-to-your-che-cde">How to connect desktop IntelliJ IDEA to your Che CDE?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>There are a few prerequisites for connecting IntelliJ IDEA to a CDE.</p>
</div>
<div class="paragraph">
<p><strong><em>Prerequisite 1: Gateway application</em></strong>
&#160;<br>
Install the JetBrains Gateway application by following the instructions from the <a href="https://www.jetbrains.com/help/idea/jetbrains-gateway.html">official documentation</a>.</p>
</div>
<div class="paragraph">
<p><strong><em>Prerequisite 2: Gateway plugin</em></strong>
&#160;<br>
Install <a href="https://plugins.jetbrains.com/plugin/24234-openshift-dev-spaces">the Gateway plugin</a> which provides a connector for establishing a connection between your local JetBrains IDE and your remote CDE running on the OpenShift cluster:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>From the Gateway main window, open the <strong>Manage Providers</strong> dialog.</p>
</li>
<li>
<p>Search for the <strong>OpenShift Dev Spaces</strong> plugin on the <strong>Marketplace</strong> tab and install it.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p><strong><em>Prerequisite 3: OpenShift CLI</em></strong>
&#160;<br>
The Gateway plugin relies on the <a href="https://docs.openshift.com/container-platform/4.16/cli_reference/openshift_cli/getting-started-cli.html">OpenShift CLI</a> to access an OpenShift cluster’s API server for managing CDEs.</p>
</div>
<div class="paragraph">
<p>Install the OpenShift CLI following the instructions from the <a href="https://docs.openshift.com/container-platform/4.15/cli_reference/openshift_cli/getting-started-cli.html#installing-openshift-cli">official documentation</a>.</p>
</div>
<div class="sect2">
<h3 id="_usage-scenarios">Usage scenarios</h3>
<div class="paragraph">
<p>JetBrains Gateway provides two main workflows:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Server-to-client flow implies a CDE is running with the specific IDE development server</p>
</li>
<li>
<p>Client-to-server flow implies the user chooses which IDE should be downloaded and running as a development server in a CDE</p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Currently, Eclipse Che supports only server-to-client flow with the IntelliJ IDEA as a remote development server. In the future, we may add support for client-to-server flow as well.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>There are two options for connecting your desktop IDEA to a CDE, depending on your needs:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>using the Eclipse Che User Dashboard</p>
</li>
<li>
<p>using the JetBrains Gateway application</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="_option-1-from-the-eclipse-che-user-dashboard">Option 1: from the Eclipse Che User Dashboard</h4>
<div class="paragraph">
<p>This option suits all needs and doesn&#8217;t require you to use the Gateway application directly.</p>
</div>
<div class="paragraph">
<p>It has one additional prerequisite - your local OpenShift CLI tool (oc) should be logged into your OpenShift cluster. See <a href="https://docs.openshift.com/container-platform/4.15/cli_reference/openshift_cli/getting-started-cli.html#cli-logging-in_cli-developer-commands">official documentaion</a> for all possible ways of logging in or follow the next steps that describe the most common flow:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Go to the <strong>Applications</strong> menu on Eclipse Che User Dashboard and choose the <strong>OpenShift console</strong>.</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/os-console.png" alt="OpenShift console">
</div>
</div>
</li>
<li>
<p>Go to the top-right menu on the opened console page and choose the <strong>Copy login command</strong>.</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/oc-login.png" alt="Copy login command">
</div>
</div>
</li>
<li>
<p>Copy the displayed <strong>oc login</strong> command and execute it in your local terminal.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>How to use it?</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Use the User Dashboard to spin up a new or start an existing Workspace. When running a new Workspace, make sure the right editor is chosen:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/editor-selector.png" alt="Editor Selector">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
</li>
<li>
<p>Wait for the prompt to open your local JetBrains Gateway application to appear:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/open-prompt.png" alt="Open Gateway prompt">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
</li>
<li>
<p>Click the <strong>Open Gateway</strong> button to start your local IDEA connected to your CDE:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/connecting.png" alt="Connecting to remote host">
</div>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p>You can try it out at <a href="https://developers.redhat.com/developer-sandbox/ide">Red Hat Developer Sandbox</a>. Clicking on <a href="https://workspaces.openshift.com/f?url=https://github.com/che-samples/web-nodejs-sample&amp;che-editor=https://eclipse-che.github.io/che-plugin-registry/main/v3/plugins/che-incubator/che-idea-server/next/devfile.yaml&amp;policies.create=peruser">this URL</a> automatically starts a CDE on the Developer Sandbox with a sample project imported. Once the CDE is ready, you’ll be asked to start a local IDEA for connecting to the CDE.</p>
</div>
</div>
<div class="sect3">
<h4 id="_option-2-from-the-jetbrains-gateway-application">Option 2: from the JetBrains Gateway application</h4>
<div class="paragraph">
<p>This option is more suitable when you want to continue working with an existing CDE, without accessing the Eclipse Che User Dashboard.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
When using the JetBrains Gateway application the creation of a new CDE is currently not allowed, and you can only connect to already-created development environments.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>This option has no additional prerequisites like having the local OpenShift CLI tool (<strong>oc</strong>) logged in your OpenShift cluster. But if you do log in, the Gateway application will use the CLI&#8217;s login session which means you will not need to enter your login info from the Gateway application every time you use it.</p>
</div>
<div class="paragraph">
<p>How to use it?</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Open the Gateway application and click the <strong>Connect to Dev Spaces</strong> button:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/gateway-window.png" alt="Gateway window">
</div>
</div>
</li>
<li>
<p>In the next step, the Gateway plugin will try to detect if your local OpenShift CLI tool (<strong>oc</strong>) is logged into your OpenShift cluster to read the OpenShift API server connection parameters from the CLI config file. You can also provide the connection parameters manually:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/login-window.png" alt="Login to API server">
</div>
</div>
<div class="paragraph">
<p>After clicking the <strong>Check connection and continue</strong> button, the plugin will try to read your existing CDEs.</p>
</div>
</li>
<li>
<p>Choose an existing CDE and click the <strong>Connect</strong> button:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/select-ds.png" alt="DevWorkspace selection">
</div>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<div class="title">Warning</div>
</td>
<td class="content">
Currently, all CDEs are listed regardless of the configured editor. As Eclipse Che doesn’t allow the user to switch the editor for an already running CDE, ensure the right one is chosen.
</td>
</tr>
</table>
</div>
</li>
<li>
<p>Clicking the <strong>Connect</strong> button starts the selected CDE and runs your local IntelliJ IDEA connected to your remote development environment:</p>
<div class="imageblock">
<div class="content">
<img src="/assets/img/idea-editor/connecting.png" alt="Connecting to remote host">
</div>
</div>
</li>
</ol>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Integration of Eclipse Che with IntelliJ IDEA Ultimate via JetBrains Gateway enables the user to harness the advantages that remote development provides while retaining the convenience of a local development experience.</p>
</div>
<div class="paragraph">
<p>If you&#8217;re interested in learning more about the technical details of how the described solution works under the hood, check the following links:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://www.jetbrains.com/help/idea/remote-development-overview.html#defs">JetBrains Gateway architecture</a>.</p>
</li>
<li>
<p>Eclipse Che <a href="https://github.com/che-incubator/che-idea-dev-server">editor image</a> that runs InteliJ IDEA dev server.</p>
</li>
<li>
<p>Eclipse Che <a href="https://github.com/eclipse-che/che-operator/blob/main/editors-definitions/che-idea-server-latest.yaml">editor definition for IDEA server</a>.</p>
</li>
<li>
<p><a href="https://github.com/redhat-developer/devspaces-gateway-plugin/">IntelliJ Gateway Connector Plugin</a>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If you found a bug you want to file, or have any idea on improving the described solution, feel free to describe it in <a href="https://github.com/eclipse-che/che/issues">Che&#8217;s main issue tracker</a>.</p>
</div>
<div class="paragraph">
<p>Thank you for reading and happy coding!</p>
</div>
</div>
</div>]]></content><author><name>Artem Zatsarynnyi</name></author><summary type="html"><![CDATA[Integration of Eclipse Che running on OpenShift with IntelliJ IDEA Ultimate using JetBrains Gateway.]]></summary></entry><entry><title type="html">Introducing the Devfile AI Assistant</title><link href="https://che.eclipseprojects.io/2024/06/26/@tolusha-devfile-ai-assistant.html" rel="alternate" type="text/html" title="Introducing the Devfile AI Assistant" /><published>2024-06-26T00:00:00+00:00</published><updated>2024-06-26T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/06/26/@tolusha/devfile-ai-assistant</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/06/26/@tolusha-devfile-ai-assistant.html"><![CDATA[<div class="sect1">
<h2 id="_introducing-the-devfile-ai-assistant">Introducing the Devfile AI Assistant</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In software development, it&#8217;s important to be efficient. Whether you&#8217;re an experienced developer or just starting, setting up your development environment can be complex and time-consuming. That&#8217;s where the <a href="https://chatgpt.com/g/g-Bm20CP2Rp-devfile-assistant">Devfile AI Assistant</a> comes in. It&#8217;s designed to help developers create devfiles easily without needing in-depth knowledge of the devfile syntax or structure. It uses a <a href="https://devfile.io">devfile knowledge base</a> to help you craft a devfile, making sure your development environment is set up right.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Another tool that simplifies creating devfile is the <a href="https://github.com/devfile/vscode-walkthrough-extension">VS Code Walkthrough Extension for Devfile</a>. It provides an interactive guide to help users understand and utilize devfiles within Visual Studio Code. Using a wizard, you can easily create a devfile to customize your Cloud Development Environment.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_what-is-a-devfile">What is a devfile?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Devfiles are configuration files that define development environments. They specify the components, commands, events etc. that make up a development workspace. They play a central role in the workflow of Eclipse Che.</p>
</div>
<div class="paragraph">
<p>In Eclipse Che, devfiles are used to automate the setup of development environments. By providing a devfile, developers can ensure a consistent environment across the team, getting rid of the "works on my machine" problems. When a devfile is applied, Eclipse Che provisions the specified containers, clones the necessary repositories, and sets up the workspace with all the tools and dependencies required for development. This makes them an essential tool for modern cloud-based development.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/devfile-ai-assistant/devfile-eclipse-che-cde.png" alt="Devfile&#8594;Eclipse-Che&#8594;CDE">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_step-by-step-example-of-how-to-create-a-devfile">Step-by-step example of how to create a devfile</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Let&#8217;s check out some real-life examples of how the Devfile AI Assistant can help you in creating devfiles for your projects.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Start by providing a basic devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Provide a basic devfile.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">basic-devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add a project to the devfile.</p>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Even though it is possible to define projects in a devfile explicitly, it is recommended to add <code>.devfile.yaml</code> or <code>devfile.yaml</code> file to the root of the repository which allows skipping the project definition on the devfile level.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add https://github.com/eclipse-che/che-server git project.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">basic-devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add a new component to the devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add PostgreSQL component.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres:latest</span>
      <span style="color: #a6e22e">env</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_DB</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mydatabase</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_USER</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">user</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_PASSWORD</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">password</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add a volume to the devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add 2Gi volume in home user directory to store Maven artifacts.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
      <span style="color: #a6e22e">volumeMounts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
          <span style="color: #a6e22e">path</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/home/user/.m2</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres:latest</span>
      <span style="color: #a6e22e">env</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_DB</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mydatabase</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_USER</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">user</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_PASSWORD</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">password</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
    <span style="color: #a6e22e">volume</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">size</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add command to the devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add command to build a java project.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
      <span style="color: #a6e22e">volumeMounts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
          <span style="color: #a6e22e">path</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/home/user/.m2</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres:latest</span>
      <span style="color: #a6e22e">env</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_DB</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mydatabase</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_USER</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">user</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_PASSWORD</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">password</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
    <span style="color: #a6e22e">volume</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">size</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span>
<span style="color: #a6e22e">commands</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">id</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build-java-project</span>
    <span style="color: #a6e22e">exec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">commandLine</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mvn clean install</span>
      <span style="color: #a6e22e">component</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
      <span style="color: #a6e22e">group</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build</span>
        <span style="color: #a6e22e">isDefault</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span>
      <span style="color: #a6e22e">label</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Build Java Project</span>
      <span style="color: #a6e22e">workingDir</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/projects/che-server</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add resource limits to the devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add resource limits to all components.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devfile</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
      <span style="color: #a6e22e">volumeMounts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
          <span style="color: #a6e22e">path</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/home/user/.m2</span>
      <span style="color: #a6e22e">cpuLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">2</span>
      <span style="color: #a6e22e">memoryLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">4Gi</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres:latest</span>
      <span style="color: #a6e22e">env</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_DB</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mydatabase</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_USER</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">user</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_PASSWORD</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">password</span>
      <span style="color: #a6e22e">cpuLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">1</span>
      <span style="color: #a6e22e">memoryLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
    <span style="color: #a6e22e">volume</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">size</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span>
<span style="color: #a6e22e">commands</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">id</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build-java-project</span>
    <span style="color: #a6e22e">exec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">commandLine</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mvn clean install</span>
      <span style="color: #a6e22e">component</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
      <span style="color: #a6e22e">group</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build</span>
        <span style="color: #a6e22e">isDefault</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span>
      <span style="color: #a6e22e">label</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Build Java Project</span>
      <span style="color: #a6e22e">workingDir</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/projects/che-server</span></code></pre>
</div>
</div>
</li>
<li>
<p>Add metadata to the devfile.</p>
<div class="paragraph">
<p><strong>Request:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Add metadata based on the devfile.</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Response:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">schemaVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2.3.0</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devfile</span>
  <span style="color: #a6e22e">displayName</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Java with PostgreSQL Dev Environment</span>
  <span style="color: #a6e22e">description</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">A development environment for a Java project with PostgreSQL database support.</span>
  <span style="color: #a6e22e">language</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Java</span>
  <span style="color: #a6e22e">projectType</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Java Application</span>
  <span style="color: #a6e22e">version</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">1.0.0</span>
  <span style="color: #a6e22e">provider</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Eclipse Che</span>
  <span style="color: #a6e22e">tags</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #e6db74">java</span>
    <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #e6db74">maven</span>
    <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #e6db74">database</span>
<span style="color: #a6e22e">components</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">quay.io/devfile/universal-developer-image:latest</span>
      <span style="color: #a6e22e">volumeMounts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
          <span style="color: #a6e22e">path</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/home/user/.m2</span>
      <span style="color: #a6e22e">cpuLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">2</span>
      <span style="color: #a6e22e">memoryLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">4Gi</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres</span>
    <span style="color: #a6e22e">container</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">image</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">postgres:latest</span>
      <span style="color: #a6e22e">env</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_DB</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mydatabase</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_USER</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">user</span>
        <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">POSTGRES_PASSWORD</span>
          <span style="color: #a6e22e">value</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">password</span>
      <span style="color: #a6e22e">cpuLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">1</span>
      <span style="color: #a6e22e">memoryLimit</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">maven-artifacts</span>
    <span style="color: #a6e22e">volume</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">size</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">2Gi</span>
<span style="color: #a6e22e">projects</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che-server</span>
    <span style="color: #a6e22e">git</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">remotes</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">origin</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">https://github.com/eclipse-che/che-server.git</span>
<span style="color: #a6e22e">commands</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #f8f8f2;background-color: #49483e">-</span> <span style="color: #a6e22e">id</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build-java-project</span>
    <span style="color: #a6e22e">exec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">commandLine</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">mvn clean install</span>
      <span style="color: #a6e22e">component</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">tools</span>
      <span style="color: #a6e22e">group</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
        <span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">build</span>
        <span style="color: #a6e22e">isDefault</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span>
      <span style="color: #a6e22e">label</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Build Java Project</span>
      <span style="color: #a6e22e">workingDir</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">/projects/che-server</span></code></pre>
</div>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Are you a developer looking to simplify setting up your development environment? The Devfile AI Assistant is here to help! It provides clear and accurate configurations, taking the complexity out of the process. Give the Devfile AI Assistant a try today!</p>
</div>
</div>
</div>]]></content><author><name>Anatolii Bazko</name></author><summary type="html"><![CDATA[The Devfile AI Assistant is an online tool that simplifies the creation of devfiles for developers.]]></summary></entry></feed>