strategy:
type: "Source"
sourceStrategy:
from:
kind: "ImageStreamTag"
name: "builder-image:latest" (1)
forcePull: true (2)
The following options are specific to the S2I build strategy.
By default, if the builder image specified in the build configuration is
available locally on the node, that image will be used. However, to override the
local image and refresh it from the registry to which the image stream points,
create a BuildConfig
with the forcePull
flag set to true:
strategy:
type: "Source"
sourceStrategy:
from:
kind: "ImageStreamTag"
name: "builder-image:latest" (1)
forcePull: true (2)
1 | The builder image being used, where the local version on the node may not be up to date with the version in the registry to which the image stream points. |
2 | This flag causes the local builder image to be ignored and a fresh version
to be pulled from the registry to which the image stream points. Setting
forcePull to false results in the default behavior of honoring the image
stored locally. |
S2I can perform incremental builds, which means it reuses artifacts from
previously-built images. To create an incremental build, create a
BuildConfig
with the following modification to the strategy definition:
strategy:
type: "Source"
sourceStrategy:
from:
kind: "ImageStreamTag"
name: "incremental-image:latest" (1)
incremental: true (2)
1 | Specify an image that supports incremental builds. Consult the documentation of the builder image to determine if it supports this behavior. |
2 | This flag controls whether an incremental build is attempted. If the builder image does not support incremental builds, the build will still succeed, but you will get a log message stating the incremental build was not successful because of a missing save-artifacts script. |
See the S2I Requirements topic for information on how to create a builder image supporting incremental builds. |
You can override the assemble, run, and save-artifacts S2I scripts provided by the builder image in one of two ways. Either:
Provide an assemble, run, and/or save-artifacts script in the .s2i/bin directory of your application source repository, or
Provide a URL of a directory containing the scripts as part of the strategy definition. For example:
strategy:
type: "Source"
sourceStrategy:
from:
kind: "ImageStreamTag"
name: "builder-image:latest"
scripts: "http://somehost.com/scripts_directory" (1)
1 | This path will have run, assemble, and save-artifacts appended to it. If any or all scripts are found they will be used in place of the same named script(s) provided in the image. |
Files located at the |
There are two ways to make environment variables available to the source build process and resulting image: environment files and BuildConfig environment values.
Source build enables you to set environment values (one per line) inside your application, by specifying them in a .s2i/environment file in the source repository. The environment variables specified in this file are present during the build process and in the final container image. The complete list of supported environment variables is available in the documentation for each image.
If you provide a .s2i/environment file in your source repository, S2I reads this file during the build. This allows customization of the build behavior as the assemble script may use these variables.
For example, if you want to disable assets compilation for your Rails
application, you can add DISABLE_ASSET_COMPILATION=true
in the
.s2i/environment file to cause assets compilation to be skipped during the
build.
In addition to builds, the specified environment variables are also available in
the running application itself. For example, you can add
RAILS_ENV=development
to the .s2i/environment file to cause the Rails
application to start in development
mode instead of production
.
You can add environment variables to the sourceStrategy
definition of the
BuildConfig
. The environment variables defined there are visible during the
assemble script execution and will be defined in the output image, making
them also available to the run script and application code.
For example disabling assets compilation for your Rails application:
sourceStrategy:
...
env:
- name: "DISABLE_ASSET_COMPILATION"
value: "true"
You can also manage environment variables defined in the BuildConfig
with the
oc set env
command.
To add a secret to your build configuration so that it can access a private repository:
Create a new OpenShift Origin project.
Create a secret that contains credentials for accessing a private source code repository.
On the build configuration editor page or in the fromimage page of the web console, set the Source Secret.
Click the Save button.
The following options are specific to the Docker build strategy.
The FROM
instruction of the Dockerfile will be replaced by the from
of the BuildConfig
:
strategy:
type: Docker
dockerStrategy:
from:
kind: "ImageStreamTag"
name: "debian:latest"
By default, Docker builds use a Dockerfile (named Dockerfile) located at the
root of the context specified in the BuildConfig.spec.source.contextDir
field.
The dockerfilePath
field allows the build to use a different path to
locate your Dockerfile, relative to the BuildConfig.spec.source.contextDir
field. It can be simply a different file name other than the default
Dockerfile (for example, MyDockerfile), or a path to a Dockerfile in a
subdirectory (for example, dockerfiles/app1/Dockerfile):
strategy:
type: Docker
dockerStrategy:
dockerfilePath: dockerfiles/app1/Dockerfile
Docker builds normally reuse cached layers found on the host performing the
build. Setting the noCache
option to true forces the build to ignore
cached layers and rerun all steps of the Dockerfile:
strategy:
type: "Docker"
dockerStrategy:
noCache: true
By default, if the builder image specified in the build configuration is
available locally on the node, that image will be used. However, to override the
local image and refresh it from the registry to which the image stream points,
create a BuildConfig
with the forcePull
flag set to true:
strategy:
type: "Docker"
dockerStrategy:
forcePull: true (1)
1 | This flag causes the local builder image to be ignored, and a fresh version
to be pulled from the registry to which the image stream points. Setting
forcePull to false results in the default behavior of honoring the image
stored locally. |
To make environment variables available to the
Docker build
process and resulting image, you can add environment variables to the
dockerStrategy
definition of the BuildConfig
.
The environment variables defined there are inserted as a single ENV
Dockerfile instruction right after the FROM
instruction, so that it can be
referenced later on within the Dockerfile.
The variables are defined during build and stay in the output image, therefore they will be present in any container that runs that image as well.
For example, defining a custom HTTP proxy to be used during build and runtime:
dockerStrategy:
...
env:
- name: "HTTP_PROXY"
value: "http://myproxy.net:5187/"
Cluster administrators can also configure global build settings using Ansible.
You can also manage environment variables defined in the BuildConfig
with the
oc set env
command.
To add a secret to your build configuration so that it can access a private repository"
Create a new OpenShift Origin project.
Create a secret that contains credentials for accessing a private source code repository.
Create a docker build configuration.
On the build configuration editor page or in the fromimage page of the web console, set the Source Secret.
Click the Save button.
To set Docker build arguments, add entries to the BuildArgs
array, which is located in the dockerStrategy
definition of the BuildConfig
. For example:
dockerStrategy:
...
buildArgs:
- name: "foo"
value: "bar"
The build arguments will be passed to Docker when a build is started.
The following options are specific to the Custom build strategy.
Use the customStrategy.from
section to indicate the image to use for the
custom build:
strategy:
type: "Custom"
customStrategy:
from:
kind: "DockerImage"
name: "openshift/sti-image-builder"
In order to allow the running of Docker commands and the building of container
images from inside the container, the build container must be bound to an
accessible socket. To do so, set the exposeDockerSocket
option to true:
strategy:
type: "Custom"
customStrategy:
exposeDockerSocket: true
In addition to secrets for source and images that can be added to all build types, custom strategies allow adding an arbitrary list of secrets to the builder pod.
Each secret can be mounted at a specific location:
strategy:
type: "Custom"
customStrategy:
secrets:
- secretSource: (1)
name: "secret1"
mountPath: "/tmp/secret1" (2)
- secretSource:
name: "secret2"
mountPath: "/tmp/secret2"
1 | secretSource is a reference to a secret in the same namespace as the
build. |
2 | mountPath is the path inside the custom builder where the secret should
be mounted. |
To add a secret to your build configuration so that it can access a private repository:
Create a new OpenShift Origin project.
Create a secret that contains credentials for accessing a private source code repository.
Create a custom build configuration.
On the build configuration editor page or in the fromimage page of the web console, set the Source Secret.
Click the Save button.
By default, when setting up the build pod, the build controller checks if the
image specified in the build configuration is available locally on the node. If
so, that image will be used. However, to override the local image and refresh
it from the registry to which the image stream points, create a BuildConfig
with the forcePull
flag set to true:
strategy:
type: "Custom"
customStrategy:
forcePull: true (1)
1 | This flag causes the local builder image to be ignored, and a fresh version
to be pulled from the registry to which the image stream points. Setting
forcePull to false results in the default behavior of honoring the image
stored locally. |
To make environment variables available to the
Custom build
process, you can add environment variables to the customStrategy
definition
of the BuildConfig
.
The environment variables defined there are passed to the pod that runs the custom build.
For example, defining a custom HTTP proxy to be used during build:
customStrategy:
...
env:
- name: "HTTP_PROXY"
value: "http://myproxy.net:5187/"
Cluster administrators can also configure global build settings using Ansible.
You can also manage environment variables defined in the BuildConfig
with the
oc set env
command.
The following options are specific to the Pipeline build strategy.
You can provide the Jenkinsfile in one of two ways:
Embed the Jenkinsfile in the build configuration.
Include in the build configuration a reference to the Git repository that contains the Jenkinsfile.
kind: "BuildConfig"
apiVersion: "v1"
metadata:
name: "sample-pipeline"
spec:
strategy:
type: "JenkinsPipeline"
jenkinsPipelineStrategy:
jenkinsfile: "node('agent') {\nstage 'build'\nopenshiftBuild(buildConfig: 'ruby-sample-build', showBuildLogs: 'true')\nstage 'deploy'\nopenshiftDeploy(deploymentConfig: 'frontend')\n}"
kind: "BuildConfig"
apiVersion: "v1"
metadata:
name: "sample-pipeline"
spec:
source:
type: "Git"
git:
uri: "https://github.com/openshift/ruby-hello-world"
strategy:
type: "JenkinsPipeline"
jenkinsPipelineStrategy:
jenkinsfilePath: some/repo/dir/filename (1)
1 | The optional jenkinsfilePath field specifies the name of the
file to use, relative to the source contextDir .
If contextDir is omitted, it defaults to the root of the repository.
If jenkinsfilePath is omitted, it defaults to Jenkinsfile. |
To make environment variables available to the
Pipeline build
process, you can add environment variables to the jenkinsPipelineStrategy
definition
of the BuildConfig
.
The environment variables defined there are set as parameters on the job in Jenkins associated with
the BuildConfig
.
For example:
jenkinsPipelineStrategy:
...
env:
- name: "FOO"
value: "BAR"
Specifics on the mapping between BuildConfig
environment variables and Jenkins job parameters:
When a Jenkins job is created or updated based on changes to a Pipeline strategy BuildConfig
, any environment
variables in the BuildConfig
are mapped to Jenkins job parameters definitions, where the default values for the Jenkins job parameters
definitions are the current values of the associated environment variables.
You can still add additional parameters (whose names differ from the names of the environment variables in the BuildConfig
)
to the Jenkins job from the Jenkins console after the job’s initial creation and they will be honored when builds are started for those Jenkins jobs.
How you start builds for the Jenkins job then dictates how the parameters are set.
If you start via oc start-build
, the values of the environment variables in the BuildConfig
are what the parameters are set
to for the corresponding job instance. Any changes you make to the parameters default values from the Jenkins console are ignored.
The BuildConfig
values take precedence.
If you start via oc start-build -e
, the values for the environment variables specified in the -e
option take precedence. And if you
specify an environment variable not listed in the BuildConfig
, they will be added as a Jenkins job parameter definitions. And, again, any
changes you make from the Jenkins console to the parameters corresponding to the environment variables are ignored. The BuildConfig
and what you specify via oc start-build -e
takes precedence.
If you start the Jenkins job via the Jenkins console, then you can control the setting of the parameters via the Jenkins console as part of starting a build for the job.
You can also manage environment variables defined in the BuildConfig
with the
oc set env
command.