Build Parameters¶
Environment vs User Parameters¶
atomic-reactor requires various parameters to build container images. These range from the Koji Hub URL to git commit. We can categorize them into environment and user parameters. The main difference between them is how they are reused. Environment parameters are shared by different build requests, while user parameters are unique to each build request.
Environment parameters are used for configuring usage of external services such as Koji, ODCS, SMTP, etc. They are also used for controlling some aspects of the container images built, for example, distribution scope, vendor, authoritative-registry, etc.
User parameters contain the unique information for a user’s build request: git repository, git branch, Koji target, etc. These should be reused for autorebuilds and are not affected by environment changes.
Reactor Configuration¶
As of Arrangement 6, environment configuration is provided to build containers
in a way that is less coupled to the Build
/BuildConfig
objects. The
pre-build plugin reactor_config
determines and provides all
environment configuration to other plugins.
Previously, the value of reactor_config
was mounted into container as a
secret. With Arrangement 6 it is supplied as a ConfigMap
like:
apiVersion: v1
kind: ConfigMap
data:
"config.yaml": <encoded yaml>
For an orchestrator build, the ConfigMap
is mapped via the downward API
into the REACTOR_CONFIG environment variable in a build container. When
the BuildConfig
is instantiated, OpenShift selects the ConfigMap
with
name given in reactor-config-map, retrieves the contents of the key
config.yaml, and sets it as the value of the REACTOR_CONFIG
environment variable in the build container.
For worker builds, the REACTOR_CONFIG environment variable is defined
as an inline value (via the
reactor_config_override build parameter in osbs-client). To populate this
parameter, the orchestrate_build
plugin uses the reactor_config
plugin to read the reactor configuration for the orchestrator build, using it as
the basis of the reactor configuration for worker builds with the following
modifications:
openshift section is replaced with worker specific values. These values can be read from the osbs-client
Configuration
object created for each worker cluster.worker_token_secrets is completely removed. This section is intended for orchestrator builds only.
The schema definition config.json in atomic-reactor contains a description for each property.
Example of REACTOR_CONFIG:
version: 1
clusters:
x86_64:
- name: x86_64-worker-1
max_concurrent_builds: 15
enabled: True
- name: x86_64-worker-2
max_concurrent_builds: 6
enabled: True
clusters_client_config_dir: /var/run/secrets/atomic-reactor/client-config-secret
koji:
hub_url: https://koji.example.com/hub
root_url: https://koji.example.com/root
auth:
ssl_certs_dir: /var/run/secrets/atomic-reactor/kojisecret
use_fast_upload: false
odcs:
api_url: https://odcs.example.com/api/1
auth:
ssl_certs_dir: /var/run/secrets/atomic-reactor/odcssecret
signing_intents:
- keys: ['R123', 'R234']
name: release
- keys: ['B123', 'B234', 'R123', 'R234']
name: beta
- keys: []
name: unsigned
default_signing_intent: release
smtp:
host: smtp.example.com
from_address: osbs@example.com
error_addresses:
- support@example.com
domain: example.com
send_to_submitter: True
send_to_pkg_owner: True
arrangement_version: 6
artifacts_allowed_domains:
- download.example.com/released
- download.example.com/candidates
image_labels:
vendor: "Spam, Inc."
authoritative-source-url: registry.public.example.com
distribution-scope: public
image_equal_labels:
- [description, io.k8s.description]
openshift:
url: https://openshift.example.com
auth:
enable: True
build_json_dir: /usr/share/osbs/
group_manifests: False
platform_descriptors:
- platform: x86_64
architecture: amd64
content_versions:
- v2
# Output registries (built images are pushed here)
registries:
- url: https://container-registry.example.com/v2
auth:
cfg_path: /var/run/secrets/atomic-reactor/v2-registry-dockercfg
# Default source registry (base images are pulled from here)
source_registry:
url: https://registry.private.example.com
# Additional source registries
pull_registries:
- url: https://registry.public.example.com
auth:
cfg_path: /var/run/secrets/atomic-reactor/registries-secret
sources_command: "fedpkg sources"
required_secrets:
- kojisecret
- odcssecret
- v2-registry-dockercfg
- client-config-secret
worker_token_secrets:
- x86-64-worker-1
- x86-64-worker-2
default_image_build_method: imagebuilder
skip_koji_check_for_base_image: False
build_env_vars:
- name: HTTP_PROXY
value: "http://proxy.example.com"
- name: HTTPS_PROXY
value: "https://proxy.example.com"
- name: NO_PROXY
value: localhost,127.0.0.1
Atomic Reactor Plugins and Arrangement Version 6¶
Prior to Arrangement 6, atomic-reactor plugins received environment parameters as their own plugin parameters. Arrangement 6 was introduced to indicate that plugins should retrieve environment parameters from reactor_config instead. Plugin parameters that are really environment parameters have been made optional.
The osbs-client configuration reactor_config_map defines
the name of the ConfigMap
object holding reactor_config. This
configuration option is mandatory for arrangement versions greater than or
equal to 6. Previous osbs-client configuration reactor_config_secret
is deprecated.
An osbs-client build parameter reactor_config_override allows reactor configuration to be passed in as a python dict. It is also validated against config.json schema. When both reactor_config_map and reactor_config_override are defined, reactor_config_override takes precedence. NOTE: reactor_config_override is a python dict, not a string of serialized data.
Creating Builds¶
osbs-client no longer renders the atomic-reactor plugin configuration
at Build
creation.
Instead, the USER_PARAMS environment variable is set on the Build
containing only user parameters as JSON. For example:
{
"build_type": "orchestrator",
"git_branch": "my-git-branch",
"git_ref": "abc12",
"git_uri": "git://git.example.com/spam.git",
"is_auto": False,
"isolated": False,
"koji_task_id": "123456",
"platforms": ["x86_64"],
"scratch": False,
"target": "my-koji-target",
"user": "lcarva",
"yum_repourls": ["http://yum.example.com/spam.repo", "http://yum.example.com/bacon.repo"],
}
Rendering Plugins¶
Once the build is started, control is handed over to atomic-reactor. Its input
plugin osv3
looks for the environment variable USER_PARAMS and uses the
osbs-client method render_plugins_configuration
to generate the plugin
configuration on the fly. The generated plugin configuration contains the
order in which plugins will run as well as user parameters.
Secrets¶
Because the plugin configuration renders at build time (after Build
object is created), we cannot select which secrets to mount in container
build based on which plugins have been enabled. Instead, all the secrets that
may be needed must be mounted. The reactor_config ConfigMap
defines
the full set of secrets it needs via its required_secrets list.
When orchestrator build starts worker builds, it uses the same set of secrets. This requires worker clusters to have the same set of secrets available. For example, if reactor_config defines:
required_secrets:
- kojisecret
A secret named kojisecret must be available in orchestrator and worker clusters. The worker and orchestrator versions don’t need to have the same value. For instance, worker and orchestrator builds may use different authentication certificates.
Secrets needed for communication from orchestrator build to worker clusters are defined separately in worker_token_secrets. These are not passed along to worker builds.
Site Customization¶
The site customization configuration file is no longer read from the system
creating the OpenShift Build
(usually koji builder). Instead, this
customization file must be stored and read from inside the builder image.