{"id":49335,"date":"2025-05-16T15:43:02","date_gmt":"2025-05-16T15:43:02","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49335"},"modified":"2025-07-12T05:54:57","modified_gmt":"2025-07-12T05:54:57","slug":"openshift-buildconfig-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-buildconfig-tutorial\/","title":{"rendered":"OpenShift BuildConfig Tutorial"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\u2705 What is OpenShift <strong>BuildConfig<\/strong>?<\/h3>\n\n\n\n<p><strong><code>BuildConfig<\/code><\/strong> in OpenShift is a Kubernetes-native custom resource provided by OpenShift that defines <strong>how to build a container image from source code<\/strong>. It automates the end-to-end image build process \u2014 from fetching source code to producing and storing container images \u2014 using <strong>build strategies<\/strong> like Source-to-Image (S2I), Docker, or custom workflows.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcd8 <strong>BuildConfig Definition<\/strong><\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>A <code>BuildConfig<\/code> is a declarative configuration object in OpenShift that defines the strategy, source, triggers, and output for building container images automatically or on-demand.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p>It\u2019s like a <strong>recipe<\/strong> for converting application source code into a deployable container image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2b50 Key Features of BuildConfig<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>\ud83c\udfaf <strong>Multiple Build Strategies<\/strong><\/td><td>Supports <strong>S2I<\/strong>, <strong>Dockerfile<\/strong>, and <strong>Custom<\/strong> strategies.<\/td><\/tr><tr><td>\ud83d\udd17 <strong>Git Integration<\/strong><\/td><td>Pulls source code directly from public\/private Git repositories.<\/td><\/tr><tr><td>\ud83d\udd01 <strong>Automatic Triggers<\/strong><\/td><td>Rebuilds can be triggered by <strong>Git changes<\/strong>, <strong>image changes<\/strong>, or <strong>config changes<\/strong>.<\/td><\/tr><tr><td>\ud83d\udee0 <strong>Custom Build Environment<\/strong><\/td><td>Supports environment variables, secrets, and configmaps during builds.<\/td><\/tr><tr><td>\ud83c\udff7\ufe0f <strong>ImageStream Integration<\/strong><\/td><td>Built images can be pushed to internal <strong>ImageStreams<\/strong> or external registries.<\/td><\/tr><tr><td>\ud83d\udc65 <strong>Webhooks<\/strong><\/td><td>Allows GitHub\/GitLab to trigger builds via webhooks.<\/td><\/tr><tr><td>\ud83d\udd0d <strong>Build Logs &amp; History<\/strong><\/td><td>Easily view build logs, status, and retry failed builds.<\/td><\/tr><tr><td>\ud83d\udd10 <strong>Secure Build Contexts<\/strong><\/td><td>Supports source credentials, secrets, and isolated build pods.<\/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\">\ud83d\udd27 Example Use Cases<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>How BuildConfig Helps<\/th><\/tr><\/thead><tbody><tr><td>CI\/CD automation<\/td><td>Auto-rebuild on Git push or base image update<\/td><\/tr><tr><td>DevOps in hybrid cloud<\/td><td>Works with internal and external image registries<\/td><\/tr><tr><td>Compliance &amp; traceability<\/td><td>Full build history and image tracking<\/td><\/tr><tr><td>S2I app deployment (Node.js, Python, etc.)<\/td><td>Uses language-specific builder images<\/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\">\ud83d\udce6 BuildConfig vs Dockerfile vs Pipelines<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool\/Concept<\/th><th>Role<\/th><\/tr><\/thead><tbody><tr><td><strong>BuildConfig<\/strong><\/td><td>Defines <strong>how to build<\/strong> an image from source<\/td><\/tr><tr><td><strong>Dockerfile<\/strong><\/td><td>Manual build instructions (used in Docker strategy)<\/td><\/tr><tr><td><strong>Pipelines<\/strong><\/td><td>Orchestrates <strong>multiple stages\/jobs<\/strong> (Tekton-based)<\/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\">\ud83d\ude80 BuildConfig Lifecycle<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Developer pushes code to Git<\/li>\n\n\n\n<li>OpenShift triggers a build (via webhook or manually)<\/li>\n\n\n\n<li>Code is fetched and built using specified strategy<\/li>\n\n\n\n<li>Final image is stored (ImageStream or registry)<\/li>\n\n\n\n<li>App is deployed or updated automatically<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u2705 Works on OpenShift 4.13+ (including Azure Red Hat OpenShift)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Goal<\/h2>\n\n\n\n<p>Build a Node.js application using:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Git source<\/li>\n\n\n\n<li>\u2705 External Red Hat base image (<code>ubi8\/nodejs-16<\/code>)<\/li>\n\n\n\n<li>\u2705 OpenShift S2I strategy (using DockerImage)<\/li>\n\n\n\n<li>\u2705 No need for preloaded ImageStreams<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf1 Prerequisites<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Requirement<\/th><th>Details<\/th><\/tr><\/thead><tbody><tr><td>OpenShift cluster<\/td><td>Access to 4.13+ (Azure, local, etc.)<\/td><\/tr><tr><td>Project created<\/td><td>Use <code>oc new-project<\/code> or create via Web UI<\/td><\/tr><tr><td>GitHub repo with app code<\/td><td>e.g., <a href=\"https:\/\/github.com\/sclorg\/nodejs-ex.git\" target=\"_blank\" rel=\"noopener\"><code>sclorg\/nodejs-ex<\/code><\/a><\/td><\/tr><tr><td>OpenShift CLI (optional)<\/td><td><code>oc<\/code> logged in<\/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\">\ud83e\uddfe Option 1: <strong>YAML Method (CLI or Web Console YAML Editor)<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Step-by-Step (Using YAML)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Create\/Open a project<\/strong> <code>oc new-project nodejs-s2i-demo<\/code><\/li>\n\n\n\n<li><strong>Apply this working <code>BuildConfig<\/code> YAML<\/strong>:<\/li>\n<\/ol>\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\">apiVersion: build.openshift.io\/v1\n<span class=\"hljs-attr\">kind<\/span>: BuildConfig\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: nodejs-sample-build\n  <span class=\"hljs-attr\">labels<\/span>:\n    app: nodejs-sample\n<span class=\"hljs-attr\">spec<\/span>:\n  source:\n    type: Git\n    <span class=\"hljs-attr\">git<\/span>:\n      uri: https:<span class=\"hljs-comment\">\/\/github.com\/sclorg\/nodejs-ex.git<\/span>\n      ref: main\n    <span class=\"hljs-attr\">contextDir<\/span>: .\n  strategy:\n    type: Source\n    <span class=\"hljs-attr\">sourceStrategy<\/span>:\n      <span class=\"hljs-keyword\">from<\/span>:\n        kind: DockerImage\n        <span class=\"hljs-attr\">name<\/span>: registry.access.redhat.com\/ubi8\/nodejs<span class=\"hljs-number\">-16<\/span>\n      <span class=\"hljs-attr\">forcePull<\/span>: <span class=\"hljs-literal\">true<\/span>\n  <span class=\"hljs-attr\">output<\/span>:\n    to:\n      kind: ImageStreamTag\n      <span class=\"hljs-attr\">name<\/span>: nodejs-sample:latest\n  <span class=\"hljs-attr\">triggers<\/span>:\n    - type: ConfigChange\n    - type: ImageChange\n  <span class=\"hljs-attr\">runPolicy<\/span>: Serial\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<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Start the build manually<\/strong>: <code>oc start-build nodejs-sample-build --follow<\/code><\/li>\n\n\n\n<li><strong>Deploy the built image<\/strong>: <code>oc new-app nodejs-sample oc expose svc\/nodejs-sample<\/code><\/li>\n\n\n\n<li><strong>Access the app<\/strong>: <code>oc get route<\/code><\/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\">\ud83d\uddb1\ufe0f Option 2: <strong>Using the OpenShift Developer Console UI<\/strong><\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Based on your screenshots \u2014 modern and guided flow<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Step-by-Step (Using Developer Web Console)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Go to Developer \u2192 +Add \u2192 From Git<\/strong><\/li>\n\n\n\n<li><strong>Fill Git Repository info:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Git Repo URL: <code>https:\/\/github.com\/sclorg\/nodejs-ex.git<\/code><\/li>\n\n\n\n<li>Git Reference: <code>main<\/code> (or leave blank)<\/li>\n\n\n\n<li>Context Dir: <code>.<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Builder Image Selection (Build from)<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Select \u201cDocker Image\u201d<\/strong> from the build option dropdown<\/li>\n\n\n\n<li>Input Docker Image: <code>registry.access.redhat.com\/ubi8\/nodejs-16<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Deployment Settings<\/strong>:\n<ul class=\"wp-block-list\">\n<li>App Name: <code>nodejs-sample<\/code><\/li>\n\n\n\n<li>Resources: Deployment (leave default)<\/li>\n\n\n\n<li>Create Route: \u2705 (enabled)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Click &#8220;Create&#8221;<\/strong><\/li>\n<\/ol>\n\n\n\n<p>OpenShift will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create <code>BuildConfig<\/code>, <code>ImageStream<\/code>, <code>Deployment<\/code>, and <code>Route<\/code><\/li>\n\n\n\n<li>Trigger an initial build<\/li>\n\n\n\n<li>Watch progress from <strong>Builds<\/strong> or <strong>Topology<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea How to Monitor<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Build logs<\/strong>:<br>Developer \u2192 Builds \u2192 <code>nodejs-sample-build<\/code> \u2192 View Logs<\/li>\n\n\n\n<li><strong>Application route<\/strong>:<br>Developer \u2192 Topology \u2192 Click route link<\/li>\n\n\n\n<li><strong>BuildConfig YAML<\/strong>:<br>Admin \u2192 Builds \u2192 <code>nodejs-sample-build<\/code> \u2192 YAML<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd01 Updating Code<\/h2>\n\n\n\n<p>Just push code to GitHub and trigger a build manually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build nodejs-sample-build\n<\/code><\/span><\/pre>\n\n\n<p>Or setup GitHub webhook using:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe bc nodejs-sample-build\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\">\u2705 Summary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>UI Path<\/th><th>YAML Equivalent<\/th><\/tr><\/thead><tbody><tr><td>Git source<\/td><td>From Git<\/td><td><code>source.git.uri<\/code><\/td><\/tr><tr><td>Docker image<\/td><td>Select \u201cDocker Image\u201d<\/td><td><code>strategy.sourceStrategy.from.kind: DockerImage<\/code><\/td><\/tr><tr><td>Deployment<\/td><td>Auto-created via +Add<\/td><td>Use <code>oc new-app<\/code> after build manually<\/td><\/tr><tr><td>Route<\/td><td>Enabled in UI<\/td><td><code>oc expose svc\/nodejs-sample<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2705 What is OpenShift BuildConfig? BuildConfig in OpenShift is a Kubernetes-native custom resource provided by OpenShift that defines how to build a container image from source code. It automates the&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49335","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49335","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=49335"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49335\/revisions"}],"predecessor-version":[{"id":49336,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49335\/revisions\/49336"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}