Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ kuttl-test.json
*.swo
*~

# Generated file-based catalog artifacts
catalog/
catalog.Dockerfile

# ignore vendor
vendor/
.vscode/
Expand Down
68 changes: 0 additions & 68 deletions Containerfile.plugin

This file was deleted.

52 changes: 36 additions & 16 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,17 @@ rm -rf $$TMP_DIR ;\
endef

.PHONY: bundle
bundle: operator-sdk manifests kustomize ## Generate bundle manifests and metadata, then validate generated files.
bundle: operator-sdk opm manifests kustomize ## Generate bundle manifests and metadata, then validate generated files.
$(OPERATOR_SDK) generate kustomize manifests -q
cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG)
$(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS)
$(OPERATOR_SDK) bundle validate ./bundle
$(OPM) render ./bundle -o yaml | grep -E 'schema: olm.bundle' # Fail if using v0 format

.PHONY: bundle-build
bundle-build: ## Build the bundle image.
$(CONTAINER_RUNTIME) build -f bundle.Dockerfile -t $(BUNDLE_IMG) .
$(CONTAINER_RUNTIME) image inspect $(BUNDLE_IMG) --format '{{json .Config.Labels}}' | grep '"operators.operatorframework.io.bundle.mediatype.v1":"registry+v1"' # Fail if using v0 format

.PHONY: bundle-push
bundle-push: ## Push the bundle image.
Expand All @@ -300,7 +302,7 @@ ifeq (,$(shell which opm 2>/dev/null))
set -e ;\
mkdir -p $(dir $(OPM)) ;\
OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \
curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.23.0/$${OS}-$${ARCH}-opm ;\
curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.72.0/$${OS}-$${ARCH}-opm ;\
chmod +x $(OPM) ;\
}
else
Expand All @@ -309,31 +311,49 @@ endif
endif


# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0).
# These images MUST exist in a registry and be pull-able.
BUNDLE_IMGS ?= $(BUNDLE_IMG)

# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0).
CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION)

# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image.
ifneq ($(origin CATALOG_BASE_IMG), undefined)
FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG)
endif
# File-based catalog (FBC) output directory. Dockerfile is generated beside it as $(CATALOG_DIR).Dockerfile.
CATALOG_DIR = catalog

# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'.
# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see:
# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator
# Build a file-based catalog image from the local registry+v1 bundle (./bundle).
# BUNDLE_IMG is stamped into the olm.bundle entry so OLM can pull the published bundle.
.PHONY: catalog-build
catalog-build: opm ## Build a catalog image.
$(OPM) index add --container-tool $(shell basename $(CONTAINER_RUNTIME)) --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT)
catalog-build: opm bundle ## Build a file-based catalog image.
rm -rf $(CATALOG_DIR) $(CATALOG_DIR).Dockerfile
mkdir -p $(CATALOG_DIR)
$(OPM) init gitops-operator --default-channel=$(DEFAULT_CHANNEL) -o yaml > $(CATALOG_DIR)/index.yaml
$(OPM) render ./bundle -o yaml --alpha-image-ref-template '$(BUNDLE_IMG)' --migrate-level=bundle-object-to-csv-metadata >> $(CATALOG_DIR)/index.yaml
for ch in $$(echo $(CHANNELS) | tr -d '"' | tr ',' ' '); do \
echo '---'; \
echo 'schema: olm.channel'; \
echo "package: gitops-operator"; \
echo "name: $${ch}"; \
echo 'entries:'; \
echo " - name: gitops-operator.v$(VERSION)"; \
done >> $(CATALOG_DIR)/index.yaml
$(OPM) validate $(CATALOG_DIR)
$(OPM) generate dockerfile $(CATALOG_DIR)
$(CONTAINER_RUNTIME) build -f $(CATALOG_DIR).Dockerfile -t $(CATALOG_IMG) .

# Validate that the catalog image is using the v1 format
@grep -q 'type: olm.csv.metadata' $(CATALOG_DIR)/index.yaml # Fail if using v0 format
@! grep -q 'type: olm.bundle.object' $(CATALOG_DIR)/index.yaml # Fail if using v0 format
@cid=$$($(CONTAINER_RUNTIME) create $(CATALOG_IMG)); \
if $(CONTAINER_RUNTIME) cp $$cid:/database/index.db /tmp/gitops-catalog-index.db 2>/dev/null; then \
$(CONTAINER_RUNTIME) rm $$cid >/dev/null; rm -f /tmp/gitops-catalog-index.db; \
echo "ERROR: $(CATALOG_IMG) uses SQLite index.db (deprecated/v0 catalog format)"; \
exit 1; \
fi; \
$(CONTAINER_RUNTIME) rm $$cid >/dev/null
$(OPM) render $(CATALOG_DIR) -o yaml | grep -E 'schema: olm\.(package|channel|bundle)' # Fail if using v0 format

# Push the catalog image.
.PHONY: catalog-push
catalog-push: ## Push a catalog image.
$(MAKE) docker-push IMG=$(CATALOG_IMG)


.PHONY: gosec
gosec: go_sec
$(GO_SEC) --exclude-dir "hack/upgrade-rollouts-manager" ./...
Expand Down
32 changes: 16 additions & 16 deletions bundle/bundle.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
# TODO: Remove this and use the bundle.Dockerfile in the root of the project.
# To be dropped after the openshift-ci have started reding the other one.

FROM scratch

# Core bundle labels.
LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1
LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/
LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/
LABEL operators.operatorframework.io.bundle.package.v1=openshift-gitops-operator

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on your comment, I tried to get it aligned with production build, but the prefix makes the computed name+version too long for the 33-ish character limit, that was surprisingly hard to workaround.

The make olm-deploy and the manual procedure we had before, was using the other "bundle.Dockerfile" with gitops-operator as a package name. So this does not change how the developers deploy the operator. I suggest keeping this as is, because a) it worked this way for years, and b) it is not used for other purposed than temporary deploying during development.

LABEL operators.operatorframework.io.bundle.channels.v1=latest
LABEL operators.operatorframework.io.bundle.package.v1=gitops-operator
LABEL operators.operatorframework.io.bundle.channels.v1=latest,gitops-1.8
LABEL operators.operatorframework.io.bundle.channel.default.v1=latest
LABEL operators.operatorframework.io.metrics.builder=operator-sdk-v1.35.0
LABEL operators.operatorframework.io.metrics.mediatype.v1=metrics+v1
LABEL operators.operatorframework.io.metrics.project_layout=go.kubebuilder.io/v4

COPY manifests /manifests/
COPY metadata/annotations.yaml /metadata/annotations.yaml
# Labels for testing.
LABEL operators.operatorframework.io.test.mediatype.v1=scorecard+v1
LABEL operators.operatorframework.io.test.config.v1=tests/scorecard/

# These are three labels needed to control how the pipeline should handle this container image
# This first label tells the pipeline that this is a bundle image and should be
# delivered via an index image
LABEL com.redhat.delivery.operator.bundle=true
# This second label tells the pipeline which versions of OpenShift the operator supports.
# This is used to control which index images should include this operator.
LABEL com.redhat.openshift.versions="v4.8"
# This third label tells the pipeline that this operator should *also* be supported on OCP 4.4 and
# earlier. It is used to control whether or not the pipeline should attempt to automatically
# backport this content into the old appregistry format and upload it to the quay.io application
# registry endpoints.
LABEL com.redhat.delivery.backport=true
# Copy files to locations specified by labels.
COPY manifests /manifests/
COPY metadata /metadata/
COPY tests/scorecard /tests/scorecard/
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ metadata:
capabilities: Deep Insights
console.openshift.io/plugins: '["gitops-plugin"]'
containerImage: quay.io/redhat-developer/gitops-operator
createdAt: "2026-07-31T05:20:33Z"
createdAt: "2026-08-14T15:06:14Z"
description: Enables teams to adopt GitOps principles for managing cluster configurations
and application delivery across hybrid multi-cluster Kubernetes environments.
features.operators.openshift.io/disconnected: "true"
Expand Down
Loading