{"id":50032,"date":"2026-06-23T07:20:44","date_gmt":"2026-06-23T07:20:44","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=50032"},"modified":"2026-06-23T07:20:47","modified_gmt":"2026-06-23T07:20:47","slug":"openshift-build-your-application-from-source-code","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-build-your-application-from-source-code\/","title":{"rendered":"OpenShift Lab 11: Build and Deploy an Application from Source Code Using the OpenShift Web Console"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lab Objective<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, you will build and deploy a web application from source code stored in a Git repository using the OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You will use OpenShift Local, also known as CRC, as the local OpenShift environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lab replaces the older Developer Sandbox-based lab and updates the steps for a local OpenShift learning environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By the end of this lab, you will understand how OpenShift takes application source code from Git, builds a container image using Source-to-Image, deploys the application, creates a Service, creates a Route, and makes the application accessible from a browser.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What You Will Learn<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You will learn how to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start OpenShift Local.<\/li>\n\n\n\n<li>Log in to the OpenShift web console.<\/li>\n\n\n\n<li>Create a new OpenShift project.<\/li>\n\n\n\n<li>Import application source code from a Git repository.<\/li>\n\n\n\n<li>Use OpenShift Source-to-Image, also called S2I.<\/li>\n\n\n\n<li>Build a container image from application source code.<\/li>\n\n\n\n<li>Deploy the built image as a Kubernetes Deployment.<\/li>\n\n\n\n<li>Expose the application internally using a Service.<\/li>\n\n\n\n<li>Expose the application externally using a Route.<\/li>\n\n\n\n<li>View the application in a browser.<\/li>\n\n\n\n<li>Inspect BuildConfig, Build, ImageStream, Deployment, Pod, Service, and Route resources.<\/li>\n\n\n\n<li>View build logs and pod logs.<\/li>\n\n\n\n<li>Trigger a rebuild manually.<\/li>\n\n\n\n<li>Troubleshoot common build and deployment issues.<\/li>\n\n\n\n<li>Clean up the lab environment.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab Architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The lab follows this flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Git Repository\n     |\n     v\nOpenShift Import <span class=\"hljs-keyword\">from<\/span> Git\n     |\n     v\nSource-to-Image Build\n     |\n     v\nBuildConfig\n     |\n     v\nBuild Pod\n     |\n     v\nImageStream\n     |\n     v\nDeployment\n     |\n     v\nPod\n     |\n     v\nService\n     |\n     v\nRoute\n     |\n     v\nBrowser\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">OpenShift Resources Created in This Lab<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When you import the application from Git, OpenShift creates several resources automatically.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Project<\/td><td>Isolates the lab resources<\/td><\/tr><tr><td>BuildConfig<\/td><td>Defines how the source code will be built<\/td><\/tr><tr><td>Build<\/td><td>Represents one build execution<\/td><\/tr><tr><td>ImageStream<\/td><td>Tracks the built application image inside OpenShift<\/td><\/tr><tr><td>Deployment<\/td><td>Runs the application as pods<\/td><\/tr><tr><td>ReplicaSet<\/td><td>Maintains the desired number of pods for the Deployment<\/td><\/tr><tr><td>Pod<\/td><td>Runs the application container<\/td><\/tr><tr><td>Service<\/td><td>Provides stable internal access to the pod<\/td><\/tr><tr><td>Route<\/td><td>Provides browser access to the application from outside the cluster<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Important Concept: What Is Source-to-Image?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Source-to-Image, usually called S2I, is an OpenShift build strategy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With S2I, you provide source code from Git. OpenShift combines that source code with a builder image, such as a Node.js builder image, and creates a runnable container image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In simple words:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Source Code + Builder Image = Runnable Application Image\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For this lab:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Node.js source code + Node.js S2I builder image = Node.js application container image\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Important Concept: Why Use Deployment Instead of DeploymentConfig?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Older OpenShift tutorials often used <code>DeploymentConfig<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For current beginner labs, use <code>Deployment<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>Deployment<\/code> is the standard Kubernetes workload resource. It is easier for students to understand because it matches Kubernetes concepts directly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Resource type: Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DeploymentConfig\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lab Environment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This lab is written for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OpenShift Local \/ CRC\nOpenShift Container Platform <span class=\"hljs-number\">4.<\/span>x\nDeveloper user\nOpenShift web <span class=\"hljs-built_in\">console<\/span>\noc CLI\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact OpenShift version may vary depending on the OpenShift Local version installed on your machine.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 1: Prerequisites<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Required Software<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>OpenShift Local installed.<\/li>\n\n\n\n<li>The <code>crc<\/code> command available.<\/li>\n\n\n\n<li>The <code>oc<\/code> command available.<\/li>\n\n\n\n<li>A browser.<\/li>\n\n\n\n<li>Internet access from the OpenShift Local VM to GitHub and container registries.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended Machine Resources<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a smooth student lab, use at least:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Recommended<\/th><\/tr><\/thead><tbody><tr><td>CPU<\/td><td>4 cores or more<\/td><\/tr><tr><td>Memory<\/td><td>12 GB or more<\/td><\/tr><tr><td>Disk<\/td><td>35 GB or more<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If your laptop has limited resources, builds may take longer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 2: Start OpenShift Local<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Open a terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the CRC version:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Set CRC to use the OpenShift preset:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc config <span class=\"hljs-keyword\">set<\/span> preset openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run setup:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc setup\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Start OpenShift Local:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc start\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The startup can take several minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the cluster starts, CRC prints the web console URL and login credentials.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To view the credentials again, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To open the web console, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 3: Configure the <code>oc<\/code> CLI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc oc-env\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">On Linux or macOS, apply the printed command:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">eval<\/span> $(crc oc-env)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">On Windows PowerShell, use the command printed by <code>crc oc-env<\/code> for PowerShell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now log in as the <code>developer<\/code> user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Get the password:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Login command:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login -u developer https:<span class=\"hljs-comment\">\/\/api.crc.testing:6443<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Enter the developer password when prompted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the login:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc whoami\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">developer\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the node:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> nodes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output will look similar to this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">NAME<\/span>                 <span class=\"hljs-selector-tag\">STATUS<\/span>   <span class=\"hljs-selector-tag\">ROLES<\/span>                         <span class=\"hljs-selector-tag\">AGE<\/span>   <span class=\"hljs-selector-tag\">VERSION<\/span>\n<span class=\"hljs-selector-tag\">crc-xxxxx-master-0<\/span>   <span class=\"hljs-selector-tag\">Ready<\/span>    <span class=\"hljs-selector-tag\">control-plane<\/span>,<span class=\"hljs-selector-tag\">master<\/span>,<span class=\"hljs-selector-tag\">worker<\/span>    ...   <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.xx<\/span><span class=\"hljs-selector-class\">.x<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact node name and version will be different in your environment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 4: Create a New Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can create the project from the web console or from the CLI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Option A: Create Project from Web Console<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the OpenShift web console.<\/li>\n\n\n\n<li>Log in as:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Username: developer\n<span class=\"hljs-attr\">Password<\/span>: Use the password <span class=\"hljs-keyword\">from<\/span> crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Switch to the <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Click the <strong>Project<\/strong> dropdown.<\/li>\n\n\n\n<li>Click <strong>Create Project<\/strong>.<\/li>\n\n\n\n<li>Enter the project name:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab11-source-build\n<\/code><\/span><\/pre>\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Optional display name:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Lab 11 Source Build\n<\/code><\/span><\/pre>\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Click <strong>Create<\/strong>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Option B: Create Project from CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab11-source-build\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Now using project <span class=\"hljs-string\">\"lab11-source-build\"<\/span> on server <span class=\"hljs-string\">\"https:\/\/api.crc.testing:6443\"<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using project <span class=\"hljs-string\">\"lab11-source-build\"<\/span> on server <span class=\"hljs-string\">\"https:\/\/api.crc.testing:6443\"<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 5: Import the Application from Git Using the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the OpenShift web console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Make sure you are in the project:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab11-source-build\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Switch to the <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Click <strong>+Add<\/strong>.<\/li>\n\n\n\n<li>Under <strong>Git Repository<\/strong>, click <strong>From Git<\/strong> or <strong>Import from Git<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your OpenShift version, the label may appear as either:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">From Git\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Import <span class=\"hljs-keyword\">from<\/span> Git\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Both refer to the same workflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Git Repository URL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the Git repository URL field, enter:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is a simple Node.js application used for OpenShift S2I demonstration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After entering the URL, OpenShift validates the repository.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Git Options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For this beginner lab, keep the default Git options.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td>Git Repo URL<\/td><td><code>https:\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git<\/code><\/td><\/tr><tr><td>Git Reference<\/td><td>Leave blank<\/td><\/tr><tr><td>Context Dir<\/td><td>Leave blank<\/td><\/tr><tr><td>Source Secret<\/td><td>Leave blank<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use <strong>Git Reference<\/strong> only when you want to build from a specific branch, tag, or commit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <strong>Context Dir<\/strong> only when the application is inside a subdirectory of the Git repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <strong>Source Secret<\/strong> only when the Git repository is private.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 6: Select the Import Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After the Git URL is validated, OpenShift tries to detect the correct build strategy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this lab, use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Import Strategy: Builder Image\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift should detect that the application is a Node.js application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If it does not detect it automatically, select:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Builder<\/span> <span class=\"hljs-selector-tag\">Image<\/span>: <span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use the latest available Node.js builder image version shown in your OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The exact Node.js version available depends on your OpenShift Local version and sample image configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, you might see versions such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span> 18\n<span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span> 20\n<span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span> 22\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Select the latest available stable version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 7: Configure Application Details<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Scroll down to the application configuration section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the following values:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td>Application Name<\/td><td><code>lab11-source-build<\/code><\/td><\/tr><tr><td>Name<\/td><td><code>sandbox-nodejs<\/code><\/td><\/tr><tr><td>Runtime Icon<\/td><td>Node.js<\/td><\/tr><tr><td>Builder Image<\/td><td>Node.js<\/td><\/tr><tr><td>Resource Type<\/td><td>Deployment<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If OpenShift auto-fills the names, you can keep the defaults as long as they are clear and unique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For consistency in this lab, use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application Name: lab11-source-build\nName: sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 8: Configure Resources<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the <strong>Resources<\/strong> section, select:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not select <code>DeploymentConfig<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>Deployment<\/code> is the standard Kubernetes workload resource and is the preferred teaching choice for modern OpenShift labs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 9: Create a Route<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the <strong>Advanced options<\/strong> section, make sure this option is enabled:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Create a route to the application\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A Route gives the application a browser-accessible URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without a Route, the application would still run inside the cluster, but you would not be able to open it easily from your browser.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 10: Create the Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Review the form.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You should have:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Setting<\/th><th>Expected Value<\/th><\/tr><\/thead><tbody><tr><td>Project<\/td><td><code>lab11-source-build<\/code><\/td><\/tr><tr><td>Git Repo URL<\/td><td><code>https:\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git<\/code><\/td><\/tr><tr><td>Import Strategy<\/td><td>Builder Image<\/td><\/tr><tr><td>Builder Image<\/td><td>Node.js<\/td><\/tr><tr><td>Application Name<\/td><td><code>lab11-source-build<\/code><\/td><\/tr><tr><td>Name<\/td><td><code>sandbox-nodejs<\/code><\/td><\/tr><tr><td>Resource Type<\/td><td>Deployment<\/td><\/tr><tr><td>Create Route<\/td><td>Enabled<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Create\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift now starts the build and deployment process.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 11: Watch the Build in the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After you click <strong>Create<\/strong>, OpenShift takes you to the <strong>Topology<\/strong> view.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You should see an application icon for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">During the build, the ring around the application may show a build or progress state.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wait until the application is built and running.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This may take a few minutes on OpenShift Local.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 12: View Build Logs in the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">To view the build logs:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In <strong>Topology<\/strong>, click the <code>sandbox-nodejs<\/code> application.<\/li>\n\n\n\n<li>Look for the related build.<\/li>\n\n\n\n<li>Open the build details.<\/li>\n\n\n\n<li>Click <strong>Logs<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">You should see OpenShift cloning the Git repository, installing dependencies, and assembling the application image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical log stages include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Cloning<\/span> <span class=\"hljs-selector-tag\">source<\/span> <span class=\"hljs-selector-tag\">code<\/span>\n<span class=\"hljs-selector-tag\">Installing<\/span> <span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span> <span class=\"hljs-selector-tag\">dependencies<\/span>\n<span class=\"hljs-selector-tag\">Running<\/span> <span class=\"hljs-selector-tag\">S2I<\/span> <span class=\"hljs-selector-tag\">assemble<\/span> <span class=\"hljs-selector-tag\">process<\/span>\n<span class=\"hljs-selector-tag\">Pushing<\/span> <span class=\"hljs-selector-tag\">image<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">internal<\/span> <span class=\"hljs-selector-tag\">registry<\/span>\n<span class=\"hljs-selector-tag\">Build<\/span> <span class=\"hljs-selector-tag\">completed<\/span> <span class=\"hljs-selector-tag\">successfully<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Exact log text may differ depending on your builder image version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 13: Verify the Application from the Web Console<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In the <strong>Topology<\/strong> view:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wait until the application shows as running.<\/li>\n\n\n\n<li>Click the external link icon on the application.<\/li>\n\n\n\n<li>A browser tab should open.<\/li>\n\n\n\n<li>The Node.js application page should load.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If the page opens successfully, your source-code build and deployment worked.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 14: Verify Resources Using the CLI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now validate the same result using the <code>oc<\/code> CLI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set the project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab11-source-build\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List the main resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> buildconfig,build,imagestream,deployment,pod,service,route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see resources similar to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">buildconfig.build.openshift.io\/sandbox-nodejs\nbuild.build.openshift.io\/sandbox-nodejs-1\nimagestream.image.openshift.io\/sandbox-nodejs\ndeployment.apps\/sandbox-nodejs\npod\/sandbox-nodejs-xxxxx\nservice\/sandbox-nodejs\nroute.route.openshift.io\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact pod and build names may be different.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 15: Check the BuildConfig<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME             TYPE     FROM          LATEST\nsandbox-nodejs   Source   Git           1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the BuildConfig:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe bc sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Look for:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Strategy<\/span>: <span class=\"hljs-selector-tag\">Source<\/span>\n<span class=\"hljs-selector-tag\">Source<\/span>: <span class=\"hljs-selector-tag\">Git<\/span>\n<span class=\"hljs-selector-tag\">Output<\/span> <span class=\"hljs-selector-tag\">to<\/span>: <span class=\"hljs-selector-tag\">ImageStreamTag<\/span> <span class=\"hljs-selector-tag\">sandbox-nodejs<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This confirms that OpenShift created a source build configuration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 16: Check the Build<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">List builds:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME               TYPE     FROM          STATUS     STARTED          DURATION\nsandbox-nodejs-1   Source   Git           Complete   ...              ...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The build status should be:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Complete\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View the build logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the build is already complete, this command still shows the latest BuildConfig logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also view logs for a specific build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs build\/sandbox-nodejs-1\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 17: Check the ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestream\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">NAME             IMAGE REPOSITORY                                                   TAGS     UPDATED\nsandbox-nodejs   <span class=\"hljs-keyword\">default<\/span>-route-openshift-image-registry.apps-crc.testing\/...        latest   ...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The ImageStream tracks the image produced by the build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift uses this image to deploy the application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 18: Check the Deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME             READY   UP-TO-DATE   AVAILABLE   AGE\nsandbox-nodejs   1\/1     1            1           ...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout status:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">deployment <span class=\"hljs-string\">\"sandbox-nodejs\"<\/span> successfully rolled out\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe deployment sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This shows the image, labels, pod template, replica count, and rollout status.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 19: Check the Pod<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME                              READY   STATUS      RESTARTS   AGE\nsandbox-nodejs-xxxxx              1\/1     Running     0          ...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View pod logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output may include Node.js or Express startup logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the pod is not running, describe it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe pod -l app=sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 20: Check the Service<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\nsandbox-nodejs   ClusterIP   ...             <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">none<\/span>&gt;<\/span>        8080\/TCP   ...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Service provides stable internal access to the application inside the cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Service name is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inside the same project, other pods can reach the app using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/sandbox-nodejs:8080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 21: Check the Route<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME             HOST\/PORT                                             PATH   SERVICES         PORT     TERMINATION   WILDCARD\nsandbox-nodejs   sandbox-nodejs-lab11-source-build.apps-crc.testing            sandbox-nodejs   8080                   None\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact hostname may be different.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Store the route URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">APP_URL=<span class=\"hljs-string\">\"http:\/\/$(oc get route sandbox-nodejs -o jsonpath='{.spec.host}')\"<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test the application:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output should include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\">HTTP\/1.1 <span class=\"hljs-number\">200<\/span> OK\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If your application redirects or returns another successful HTTP response, that is also acceptable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the URL in your browser:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">http:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">route-hostname<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 22: Understand What Happened<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When you clicked <strong>Create<\/strong>, OpenShift performed several actions automatically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: OpenShift Pulled Source Code from Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift cloned the repository:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2: OpenShift Selected a Builder Image<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because this is a Node.js application, OpenShift used a Node.js builder image.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: OpenShift Created a BuildConfig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The BuildConfig stores the build definition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It tells OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Where the source code is\nWhich builder image to <span class=\"hljs-keyword\">use<\/span>\n<span class=\"hljs-title\">Where<\/span> <span class=\"hljs-title\">to<\/span> <span class=\"hljs-title\">push<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">built<\/span> <span class=\"hljs-title\">image<\/span>\n<span class=\"hljs-title\">What<\/span> <span class=\"hljs-title\">triggers<\/span> <span class=\"hljs-title\">future<\/span> <span class=\"hljs-title\">builds<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: OpenShift Started a Build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Build object represents one execution of the build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sandbox-nodejs-1\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 5: OpenShift Created an ImageStream<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The ImageStream tracks the resulting image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The app Deployment points to the image produced by the build.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: OpenShift Created a Deployment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Deployment created the running application pod.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: OpenShift Created a Service<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Service provides internal access to the pod.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8: OpenShift Created a Route<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Route provides external browser access to the application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 23: Trigger a New Build Manually<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can manually trigger a rebuild.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">build.build.openshift.io\/sandbox-nodejs-2 started\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch the build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List builds again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME               TYPE     FROM          STATUS\nsandbox-nodejs-1   Source   Git           Complete\nsandbox-nodejs-2   Source   Git           Complete\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This proves that the BuildConfig can be reused to produce a new application image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 24: Scale the Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Even though this lab focuses on building from source code, you can quickly verify that the result is a normal Kubernetes Deployment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scale to 2 pods:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/sandbox-nodejs --replicas=2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Two sandbox-nodejs pods should be running.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Scale back to 1 pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/sandbox-nodejs --replicas=1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">READY   1\/1\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 25: Optional CLI-Only Equivalent<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The main lab uses the web console. However, it is useful to know the CLI equivalent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To create a similar app from source code using the CLI, you could run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git --name=sandbox-nodejs<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then expose it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is not the main method for this lab, but it helps students understand that the web console and CLI both create OpenShift resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 26: Student Validation Checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Students should confirm the following:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Command<\/th><th>Expected Result<\/th><\/tr><\/thead><tbody><tr><td>Current project<\/td><td><code>oc project<\/code><\/td><td><code>lab11-source-build<\/code><\/td><\/tr><tr><td>BuildConfig exists<\/td><td><code>oc get bc<\/code><\/td><td><code>sandbox-nodejs<\/code><\/td><\/tr><tr><td>Build completed<\/td><td><code>oc get builds<\/code><\/td><td>Build status <code>Complete<\/code><\/td><\/tr><tr><td>ImageStream exists<\/td><td><code>oc get is<\/code><\/td><td><code>sandbox-nodejs<\/code><\/td><\/tr><tr><td>Deployment ready<\/td><td><code>oc get deploy<\/code><\/td><td><code>1\/1<\/code> ready<\/td><\/tr><tr><td>Pod running<\/td><td><code>oc get pods<\/code><\/td><td>Pod status <code>Running<\/code><\/td><\/tr><tr><td>Service exists<\/td><td><code>oc get svc<\/code><\/td><td><code>sandbox-nodejs<\/code><\/td><\/tr><tr><td>Route exists<\/td><td><code>oc get route<\/code><\/td><td>Route hostname created<\/td><\/tr><tr><td>Browser works<\/td><td>Open route URL<\/td><td>App page loads<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 27: Full Validation Commands<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run these commands after completing the lab:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc project lab11-source-build\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking BuildConfig...\"<\/span>\noc get bc sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Builds...\"<\/span>\noc get builds\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking ImageStream...\"<\/span>\noc get imagestream sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Deployment...\"<\/span>\noc get deployment sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking rollout status...\"<\/span>\noc rollout status deployment\/sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Pods...\"<\/span>\noc get pods -l app=sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Service...\"<\/span>\noc get svc sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking Route...\"<\/span>\noc get route sandbox-nodejs\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Getting app URL...\"<\/span>\nAPP_URL=<span class=\"hljs-string\">\"http:\/\/$(oc get route sandbox-nodejs -o jsonpath='{.spec.host}')\"<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Testing app...\"<\/span>\ncurl -I <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>BuildConfig exists.<\/li>\n\n\n\n<li>Build status is <code>Complete<\/code>.<\/li>\n\n\n\n<li>ImageStream exists.<\/li>\n\n\n\n<li>Deployment is available.<\/li>\n\n\n\n<li>Pod is running.<\/li>\n\n\n\n<li>Service exists.<\/li>\n\n\n\n<li>Route exists.<\/li>\n\n\n\n<li><code>curl -I<\/code> returns an HTTP response.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 28: Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 1: Git Repository URL Is Not Validated<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The web console does not validate the Git URL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Internet connection issue.<\/li>\n\n\n\n<li>GitHub is blocked by network policy or firewall.<\/li>\n\n\n\n<li>Typo in the repository URL.<\/li>\n\n\n\n<li>OpenShift Local VM cannot reach GitHub.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check the URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Try opening the repository in your browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From CLI, check whether your OpenShift Local cluster is running:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc status\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 2: Builder Image Is Not Detected<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift does not automatically detect Node.js.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Builder images are not available in your local OpenShift environment.<\/li>\n\n\n\n<li>The Cluster Samples Operator did not install sample image streams.<\/li>\n\n\n\n<li>The Git repository was not detected properly.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the Import from Git page, manually select:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Import<\/span> <span class=\"hljs-selector-tag\">Strategy<\/span>: <span class=\"hljs-selector-tag\">Builder<\/span> <span class=\"hljs-selector-tag\">Image<\/span>\n<span class=\"hljs-selector-tag\">Builder<\/span> <span class=\"hljs-selector-tag\">Image<\/span>: <span class=\"hljs-selector-tag\">Node<\/span><span class=\"hljs-selector-class\">.js<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If Node.js is not available, ask the instructor to check cluster sample image streams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The instructor can check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestream -n openshift | grep -i node\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If no Node.js image stream exists, the OpenShift Local sample image configuration may need review.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 3: Build Fails During npm Install<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The build starts but fails while installing Node.js dependencies.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Network issue while downloading npm packages.<\/li>\n\n\n\n<li>Temporary npm registry issue.<\/li>\n\n\n\n<li>Resource constraints in OpenShift Local.<\/li>\n\n\n\n<li>Builder image issue.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check build logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check build status:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the failed build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe build sandbox-nodejs-1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Try the build again:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 4: Pod Is Not Running<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The build succeeds, but the pod does not become ready.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe pod -l app=sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common causes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Application startup error.<\/li>\n\n\n\n<li>Wrong runtime port.<\/li>\n\n\n\n<li>Insufficient memory.<\/li>\n\n\n\n<li>Image pull issue.<\/li>\n\n\n\n<li>CrashLoopBackOff.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 5: Route Opens but Browser Shows Error<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The route exists, but the application page does not load.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check the route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check endpoints:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> endpoints sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If endpoints are empty, the Service is not pointing to a running pod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check pod labels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods --show-labels\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check service selector:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe svc sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 6: <code>curl<\/code> Does Not Work Locally<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The browser works but local <code>curl<\/code> fails, or <code>curl<\/code> works but browser fails.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>DNS issue on local machine.<\/li>\n\n\n\n<li>Browser proxy or VPN issue.<\/li>\n\n\n\n<li>CRC networking issue.<\/li>\n\n\n\n<li>Application not ready yet.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check CRC status:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc status\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Print route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Try again after a minute.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 7: BuildConfig Not Found<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Symptom<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This command fails:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Possible Causes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You are in the wrong project.<\/li>\n\n\n\n<li>The application name is different.<\/li>\n\n\n\n<li>The import failed.<\/li>\n\n\n\n<li>The web console created resources with a different name.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fix<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check current project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch to the correct project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab11-source-build\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List all BuildConfigs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> bc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List all resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 29: Cleanup<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can delete the application only, or delete the whole project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a lab environment, deleting the whole project is easiest.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cleanup from Web Console<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Switch to the <strong>Developer<\/strong> perspective.<\/li>\n\n\n\n<li>Open the project:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab11-source-build\n<\/code><\/span><\/pre>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Go to <strong>Topology<\/strong>.<\/li>\n\n\n\n<li>Right-click the <code>sandbox-nodejs<\/code> application.<\/li>\n\n\n\n<li>Select <strong>Delete Application<\/strong>.<\/li>\n\n\n\n<li>Confirm the deletion.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This removes the application resources but may not remove every project-level object.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cleanup from CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Delete the whole project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab11-source-build\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> project lab11-source-build\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Error<\/span> <span class=\"hljs-keyword\">from<\/span> server (NotFound): projects.project.openshift.io <span class=\"hljs-string\">\"lab11-source-build\"<\/span> not found\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 30: Lab Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, you built and deployed an application from source code using the OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You learned that OpenShift can:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pull source code from Git.<\/li>\n\n\n\n<li>Detect or use a builder image.<\/li>\n\n\n\n<li>Build a runnable container image using S2I.<\/li>\n\n\n\n<li>Store the built image in an ImageStream.<\/li>\n\n\n\n<li>Deploy the image as a Kubernetes Deployment.<\/li>\n\n\n\n<li>Run the application in a Pod.<\/li>\n\n\n\n<li>Expose the application internally using a Service.<\/li>\n\n\n\n<li>Expose the application externally using a Route.<\/li>\n\n\n\n<li>Allow rebuilds using a BuildConfig.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 31: Review Questions<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Question 1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of Source-to-Image?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Source-to-Image builds a runnable container image by combining application source code with a builder image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What does a BuildConfig do?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A BuildConfig defines how OpenShift should build an application, including the source repository, build strategy, builder image, triggers, and output image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of an ImageStream?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An ImageStream tracks container images inside OpenShift and allows OpenShift resources to refer to images using tags such as <code>latest<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Why did we choose Deployment instead of DeploymentConfig?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deployment is the standard Kubernetes workload resource and is the better choice for modern beginner labs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of a Service?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Service provides stable internal network access to application pods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">What is the purpose of a Route?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Route exposes an application outside the OpenShift cluster using a browser-accessible hostname.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 7<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which command shows the latest build logs from a BuildConfig?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which command manually triggers a new build?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build sandbox-nodejs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which command shows the external application URL?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Question 10<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Which command deletes the whole lab project?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Answer<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab11-source-build\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 32: Instructor Notes<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This lab is designed as a modern replacement for older OpenShift source-code build labs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The old lab flow was based on Developer Sandbox. This replacement uses OpenShift Local so that students can practice locally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lab intentionally uses:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DeploymentConfig\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is better for students because it aligns with standard Kubernetes workload concepts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The lab also uses a simple Node.js Git repository so students can focus on the OpenShift build process rather than database setup, application debugging, or complex runtime dependencies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a more advanced course, follow-up labs can cover:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Building from a Dockerfile.<\/li>\n\n\n\n<li>Building from a private Git repository.<\/li>\n\n\n\n<li>Using source clone secrets.<\/li>\n\n\n\n<li>Using Git webhooks.<\/li>\n\n\n\n<li>Setting build triggers.<\/li>\n\n\n\n<li>Setting build CPU and memory limits.<\/li>\n\n\n\n<li>Rolling back deployments.<\/li>\n\n\n\n<li>Using OpenShift Pipelines.<\/li>\n\n\n\n<li>Using GitOps.<\/li>\n\n\n\n<li>Deploying multi-service applications.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 33: Instructor Pre-Validation Checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before giving this lab to students, the instructor should run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc version\ncrc status\noc version\noc whoami\noc <span class=\"hljs-keyword\">get<\/span> nodes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check that the developer user can create projects:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc auth can-i create projects\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check that Node.js builder image streams are available:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestream -n openshift | grep -i node\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a test project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab11-source-build-test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Optionally test the CLI equivalent:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/redhat-developer-demos\/sandbox-nodejs.git --name=sandbox-nodejs<\/span>\noc expose svc\/sandbox-nodejs\noc rollout status deployment\/sandbox-nodejs\noc <span class=\"hljs-keyword\">get<\/span> route sandbox-nodejs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test the route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">APP_URL=<span class=\"hljs-string\">\"http:\/\/$(oc get route sandbox-nodejs -o jsonpath='{.spec.host}')\"<\/span>\ncurl -I <span class=\"hljs-string\">\"$APP_URL\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Clean up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab11-source-build-test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If these checks pass, the lab is ready for students.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Outcome<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You have successfully built and deployed an application from source code using the OpenShift web console.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You now understand the complete OpenShift source-build workflow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Git Repository\n  -&gt; Source-to-Image Build\n  -&gt; BuildConfig\n  -&gt; Build\n  -&gt; ImageStream\n  -&gt; Deployment\n  -&gt; Pod\n  -&gt; Service\n  -&gt; Route\n  -&gt; Browser\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is one of the most important OpenShift developer workflows because it allows developers to go from source code to a running application without manually writing a container image build command.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lab Objective In this lab, you will build and deploy a web application from source code stored in a Git repository using the OpenShift web console. You&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-50032","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=50032"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50032\/revisions"}],"predecessor-version":[{"id":77161,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50032\/revisions\/77161"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=50032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=50032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=50032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}