{"id":50060,"date":"2026-06-23T06:22:55","date_gmt":"2026-06-23T06:22:55","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=50060"},"modified":"2026-06-23T06:22:57","modified_gmt":"2026-06-23T06:22:57","slug":"openshift-lab-5-install-an-application-from-a-source-code-using-the-oc-cli-tool","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-lab-5-install-an-application-from-a-source-code-using-the-oc-cli-tool\/","title":{"rendered":"Openshift: Lab 5 &#8211; Install an application from a source code using the oc CLI tool"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Lab 5 summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This lab teaches how to use the <strong><code>oc<\/code> CLI<\/strong> from your local machine to deploy an application into OpenShift Developer Sandbox from <strong>source code stored in GitHub<\/strong>. OpenShift uses <code>oc new-app<\/code> to detect the source, select\/create the builder workflow, build a container image, create the app resources, and then you expose it with a Route.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sample application used<\/h2>\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\">https:<span class=\"hljs-comment\">\/\/github.com\/openshift\/ruby-hello-world.git#beta4<\/span>\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<p class=\"wp-block-paragraph\">Main command from the lab:<\/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\">oc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/openshift\/ruby-hello-world.git#beta4<\/span>\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 expected created resources include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">imagestream<\/span><span class=\"hljs-selector-class\">.image<\/span><span class=\"hljs-selector-class\">.openshift<\/span><span class=\"hljs-selector-class\">.io<\/span> \"<span class=\"hljs-selector-tag\">ruby-22-centos7<\/span>\" <span class=\"hljs-selector-tag\">created<\/span>\n<span class=\"hljs-selector-tag\">imagestream<\/span><span class=\"hljs-selector-class\">.image<\/span><span class=\"hljs-selector-class\">.openshift<\/span><span class=\"hljs-selector-class\">.io<\/span> \"<span class=\"hljs-selector-tag\">ruby-hello-world<\/span>\" <span class=\"hljs-selector-tag\">created<\/span>\n<span class=\"hljs-selector-tag\">buildconfig<\/span><span class=\"hljs-selector-class\">.build<\/span><span class=\"hljs-selector-class\">.openshift<\/span><span class=\"hljs-selector-class\">.io<\/span> \"<span class=\"hljs-selector-tag\">ruby-hello-world<\/span>\" <span class=\"hljs-selector-tag\">created<\/span>\n<span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.apps<\/span> \"<span class=\"hljs-selector-tag\">ruby-hello-world<\/span>\" <span class=\"hljs-selector-tag\">created<\/span>\n<span class=\"hljs-selector-tag\">service<\/span> \"<span class=\"hljs-selector-tag\">ruby-hello-world<\/span>\" <span class=\"hljs-selector-tag\">created<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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 lab then tells you to expose the service:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose service\/ruby-hello-world\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\">route.route.openshift.io\/ruby-hello-world exposed\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Main flow<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Action<\/th><th>Command \/ UI<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Open Developer Sandbox web console<\/td><td>Browser<\/td><\/tr><tr><td>2<\/td><td>Get CLI login command<\/td><td><code>?<\/code> icon \u2192 Command Line tools \u2192 Copy login command<\/td><\/tr><tr><td>3<\/td><td>Display token<\/td><td>Click <strong>Display Token<\/strong><\/td><\/tr><tr><td>4<\/td><td>Log in from terminal<\/td><td>Paste copied <code>oc login --token=... --server=...<\/code><\/td><\/tr><tr><td>5<\/td><td>Deploy app from Git source<\/td><td><code>oc new-app https:\/\/github.com\/openshift\/ruby-hello-world.git#beta4<\/code><\/td><\/tr><tr><td>6<\/td><td>Track build logs<\/td><td><code>oc logs -f buildconfig\/ruby-hello-world<\/code><\/td><\/tr><tr><td>7<\/td><td>Expose app<\/td><td><code>oc expose service\/ruby-hello-world<\/code><\/td><\/tr><tr><td>8<\/td><td>Open app<\/td><td>Topology view \u2192 URL\/open icon<\/td><\/tr><tr><td>9<\/td><td>Delete app<\/td><td><code>oc delete all -l app=ruby-hello-world<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Clean CLI version of Lab 5<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Log in using the token command copied from OpenShift web console<\/span>\noc login --token=&lt;your-token&gt; --server=&lt;your-api-server&gt;\n\n<span class=\"hljs-comment\"># Confirm login<\/span>\noc whoami\n\n<span class=\"hljs-comment\"># Check current project<\/span>\noc project\n\n<span class=\"hljs-comment\"># Deploy app from GitHub source code<\/span>\noc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/openshift\/ruby-hello-world.git#beta4<\/span>\n\n<span class=\"hljs-comment\"># Watch the build logs<\/span>\noc logs -f buildconfig\/ruby-hello-world\n\n<span class=\"hljs-comment\"># Check created resources<\/span>\noc get all\n\n<span class=\"hljs-comment\"># Expose the service as a route<\/span>\noc expose service\/ruby-hello-world\n\n<span class=\"hljs-comment\"># Get route<\/span>\noc get route ruby-hello-world\n\n<span class=\"hljs-comment\"># Test the route<\/span>\ncurl -I http:<span class=\"hljs-comment\">\/\/$(oc get route ruby-hello-world -o jsonpath='{.spec.host}')<\/span>\n\n<span class=\"hljs-comment\"># Delete application resources<\/span>\noc delete all -l app=ruby-hello-world\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">Important correction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The PDF text says the selector option is <strong><code>-1<\/code><\/strong>, but that is a typo. The actual <code>oc<\/code> selector flag is lowercase <strong><code>-l<\/code><\/strong>, meaning \u201clabel selector.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct:<\/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\">oc <span class=\"hljs-keyword\">delete<\/span> all -l app=ruby-hello-world\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<p class=\"wp-block-paragraph\">Incorrect:<\/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\">oc <span class=\"hljs-keyword\">delete<\/span> all <span class=\"hljs-number\">-1<\/span> app=ruby-hello-world\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\">The command shown in the PDF is correct, but the explanatory sentence has the typo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Difference from earlier labs<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Lab<\/th><th>Method<\/th><th>Tool<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Lab 2<\/td><td>Source code from GitHub<\/td><td>Web console<\/td><td>Python\/Django source app<\/td><\/tr><tr><td>Lab 3<\/td><td>Container image<\/td><td>Web console<\/td><td>ParksMap image<\/td><\/tr><tr><td>Lab 4<\/td><td>Container image<\/td><td><code>oc<\/code> CLI<\/td><td>Greeter image<\/td><\/tr><tr><td>Lab 5<\/td><td>Source code from GitHub<\/td><td><code>oc<\/code> CLI<\/td><td>Ruby hello-world source app<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So yes: <strong>Lab 5 is basically the CLI version of Lab 2<\/strong>, while <strong>Lab 4 was the CLI version of Lab 3<\/strong>.<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/07\/Openshift-Lab-5.pdf\" type=\"application\/pdf\" style=\"width:100%;height:2000px\" aria-label=\"Embed of Openshift Lab 5.\"><\/object><a id=\"wp-block-file--media-80fe02d9-7bc4-4152-9851-1bd77815f0b1\" href=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/07\/Openshift-Lab-5.pdf\">Openshift Lab 5<\/a><a href=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/07\/Openshift-Lab-5.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-80fe02d9-7bc4-4152-9851-1bd77815f0b1\">Download<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Lab 5 summary This lab teaches how to use the oc CLI from your local machine to deploy an application into OpenShift Developer Sandbox from source code&#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-50060","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50060","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=50060"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50060\/revisions"}],"predecessor-version":[{"id":77148,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/50060\/revisions\/77148"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=50060"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=50060"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=50060"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}