Blame Makefile

Packit 63bb0d
#
Packit 63bb0d
# Maintenance Helpers
Packit 63bb0d
#
Packit 63bb0d
# This makefile contains targets used for development, as well as helpers to
Packit 63bb0d
# aid automatization of maintenance. Unless a target is documented in
Packit 63bb0d
# `make help`, it is not supported and is only meant to be used by developers
Packit 63bb0d
# to aid their daily development work.
Packit 63bb0d
#
Packit 63bb0d
# All supported targets honor the `SRCDIR` variable to find the source-tree.
Packit 63bb0d
# For most unsupported targets, you are expected to have the source-tree as
Packit 63bb0d
# your working directory. To specify a different source-tree, simply override
Packit 63bb0d
# the variable via `SRCDIR=<path>` on the commandline. By default, the working
Packit 63bb0d
# directory is used for build output, but `BUILDDIR=<path>` allows overriding
Packit 63bb0d
# it.
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
BUILDDIR ?= .
Packit 63bb0d
SRCDIR ?= .
Packit 63bb0d
Packit 63bb0d
RST2MAN ?= rst2man
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Automatic Variables
Packit 63bb0d
#
Packit 63bb0d
# This section contains a bunch of automatic variables used all over the place.
Packit 63bb0d
# They mostly try to fetch information from the repository sources to avoid
Packit 63bb0d
# hard-coding them in this makefile.
Packit 63bb0d
#
Packit 63bb0d
# Most of the variables here are pre-fetched so they will only ever be
Packit 63bb0d
# evaluated once. This, however, means they are always executed regardless of
Packit 63bb0d
# which target is run.
Packit 63bb0d
#
Packit 63bb0d
#     VERSION:
Packit 63bb0d
#         This evaluates the `Version` field of the specfile. Therefore, it will
Packit 63bb0d
#         be set to the latest version number of this repository without any
Packit 63bb0d
#         prefix (just a plain number).
Packit 63bb0d
#
Packit 63bb0d
#     COMMIT:
Packit 63bb0d
#         This evaluates to the latest git commit sha. This will not work if
Packit 63bb0d
#         the source is not a git checkout. Hence, this variable is not
Packit 63bb0d
#         pre-fetched but evaluated at time of use.
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
VERSION := $(shell (cd "$(SRCDIR)" && grep "^Version:" osbuild-composer.spec | sed 's/[^[:digit:]]*\([[:digit:]]\+\).*/\1/'))
Packit 63bb0d
COMMIT = $(shell (cd "$(SRCDIR)" && git rev-parse HEAD))
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Generic Targets
Packit 63bb0d
#
Packit 63bb0d
# The following is a set of generic targets used across the makefile. The
Packit 63bb0d
# following targets are defined:
Packit 63bb0d
#
Packit 63bb0d
#     help
Packit 63bb0d
#         This target prints all supported targets. It is meant as
Packit 63bb0d
#         documentation of targets we support and might use outside of this
Packit 63bb0d
#         repository.
Packit 63bb0d
#         This is also the default target.
Packit 63bb0d
#
Packit 63bb0d
#     $(BUILDDIR)/
Packit 63bb0d
#     $(BUILDDIR)/%/
Packit 63bb0d
#         This target simply creates the specified directory. It is limited to
Packit 63bb0d
#         the build-dir as a safety measure. Note that this requires you to use
Packit 63bb0d
#         a trailing slash after the directory to not mix it up with regular
Packit 63bb0d
#         files. Lastly, you mostly want this as order-only dependency, since
Packit 63bb0d
#         timestamps on directories do not affect their content.
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
.PHONY: help
Packit 63bb0d
help:
Packit 63bb0d
	@echo "make [TARGETS...]"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "This is the maintenance makefile of osbuild. The following"
Packit 63bb0d
	@echo "targets are available:"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "    help:               Print this usage information."
Packit 63bb0d
	@echo "    man:                Generate all man-pages"
Packit 63bb0d
Packit 63bb0d
$(BUILDDIR)/:
Packit 63bb0d
	mkdir -p "$@"
Packit 63bb0d
Packit 63bb0d
$(BUILDDIR)/%/:
Packit 63bb0d
	mkdir -p "$@"
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Documentation
Packit 63bb0d
#
Packit 63bb0d
# The following targets build the included documentation. This includes the
Packit 63bb0d
# packaged man-pages, but also all other kinds of documentation that needs to
Packit 63bb0d
# be generated. Note that these targets are relied upon by automatic
Packit 63bb0d
# deployments to our website, as well as package manager scripts.
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
MANPAGES_RST = $(wildcard $(SRCDIR)/docs/*.[0123456789].rst)
Packit 63bb0d
MANPAGES_TROFF = $(patsubst $(SRCDIR)/%.rst,$(BUILDDIR)/%,$(MANPAGES_RST))
Packit 63bb0d
Packit 63bb0d
$(MANPAGES_TROFF): $(BUILDDIR)/docs/%: $(SRCDIR)/docs/%.rst | $(BUILDDIR)/docs/
Packit 63bb0d
	$(RST2MAN) "$<" "$@"
Packit 63bb0d
Packit 63bb0d
.PHONY: man
Packit 63bb0d
man: $(MANPAGES_TROFF)
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Maintenance Targets
Packit 63bb0d
#
Packit 63bb0d
# The following targets are meant for development and repository maintenance.
Packit 63bb0d
# They are not supported nor is their use recommended in scripts.
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
.PHONY: build
Packit 63bb0d
build:
Packit Service 509fd4
	- mkdir bin
Packit Service 509fd4
	go build -o bin/osbuild-composer ./cmd/osbuild-composer/
Packit Service 509fd4
	go build -o bin/osbuild-worker ./cmd/osbuild-worker/
Packit Service 509fd4
	go build -o bin/osbuild-pipeline ./cmd/osbuild-pipeline/
Packit Service 509fd4
	go build -o bin/osbuild-upload-azure ./cmd/osbuild-upload-azure/
Packit Service 509fd4
	go build -o bin/osbuild-upload-aws ./cmd/osbuild-upload-aws/
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-composer-cli-tests ./cmd/osbuild-composer-cli-tests/main_test.go
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-weldr-tests ./internal/client/
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-dnf-json-tests ./cmd/osbuild-dnf-json-tests/main_test.go
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-image-tests ./cmd/osbuild-image-tests/
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-auth-tests ./cmd/osbuild-auth-tests/
Packit Service 509fd4
	go test -c -tags=integration -o bin/osbuild-koji-tests ./cmd/osbuild-koji-tests/
Packit 63bb0d
Packit 63bb0d
.PHONY: install
Packit 63bb0d
install:
Packit 63bb0d
	- mkdir -p /usr/libexec/osbuild-composer
Packit Service 509fd4
	cp bin/osbuild-composer /usr/libexec/osbuild-composer/
Packit Service 509fd4
	cp bin/osbuild-worker /usr/libexec/osbuild-composer/
Packit 63bb0d
	cp dnf-json /usr/libexec/osbuild-composer/
Packit 63bb0d
	- mkdir -p /usr/share/osbuild-composer/repositories
Packit 63bb0d
	cp repositories/* /usr/share/osbuild-composer/repositories
Packit 63bb0d
	- mkdir -p /etc/sysusers.d/
Packit 63bb0d
	cp distribution/osbuild-composer.conf /etc/sysusers.d/
Packit 63bb0d
	systemd-sysusers osbuild-composer.conf
Packit 63bb0d
	- mkdir -p /etc/systemd/system/
Packit 63bb0d
	cp distribution/*.service /etc/systemd/system/
Packit 63bb0d
	cp distribution/*.socket /etc/systemd/system/
Packit 63bb0d
	systemctl daemon-reload
Packit 63bb0d
Packit Service 509fd4
CERT_DIR=/etc/osbuild-composer
Packit Service 509fd4
Packit 63bb0d
.PHONY: ca
Packit 63bb0d
ca:
Packit Service 509fd4
ifneq (${CERT_DIR}/ca-key.pem${CERT_DIR}/ca-crt.pem,$(wildcard ${CERT_DIR}/ca-key.pem)$(wildcard ${CERT_DIR}/ca-crt.pem))
Packit 63bb0d
	@echo CA key or certificate file is missing, generating a new pair...
Packit Service 509fd4
	- mkdir -p ${CERT_DIR}
Packit Service 509fd4
	openssl req -new -nodes -x509 -days 365 -keyout ${CERT_DIR}/ca-key.pem -out ${CERT_DIR}/ca-crt.pem -subj "/CN=osbuild.org"
Packit 63bb0d
else
Packit 63bb0d
	@echo CA key and certificate files already exist, skipping...
Packit 63bb0d
endif
Packit 63bb0d
Packit 63bb0d
.PHONY: composer-key-pair
Packit 63bb0d
composer-key-pair: ca
Packit Service 509fd4
	# generate a private key and a certificate request
Packit Service 509fd4
	openssl req -new -nodes \
Packit Service 509fd4
		-subj "/CN=localhost" \
Packit Service 509fd4
		-keyout ${CERT_DIR}/composer-key.pem \
Packit Service 509fd4
		-out ${CERT_DIR}/composer-csr.pem
Packit Service 509fd4
Packit Service 509fd4
	# sign the certificate
Packit Service 509fd4
	openssl x509 -req \
Packit Service 509fd4
		-in ${CERT_DIR}/composer-csr.pem \
Packit Service 509fd4
		-CA ${CERT_DIR}/ca-crt.pem \
Packit Service 509fd4
		-CAkey ${CERT_DIR}/ca-key.pem \
Packit Service 509fd4
		-CAcreateserial \
Packit Service 509fd4
		-out ${CERT_DIR}/composer-crt.pem
Packit Service 509fd4
Packit Service 509fd4
	# delete the request and set _osbuild-composer as the owner
Packit Service 509fd4
	rm ${CERT_DIR}/composer-csr.pem
Packit Service 509fd4
	chown _osbuild-composer:_osbuild-composer ${CERT_DIR}/composer-key.pem ${CERT_DIR}/composer-crt.pem
Packit 63bb0d
Packit 63bb0d
.PHONY: worker-key-pair
Packit 63bb0d
worker-key-pair: ca
Packit Service 509fd4
	# generate a private key and a certificate request
Packit Service 509fd4
	openssl req -new -nodes \
Packit Service 509fd4
		-subj "/CN=localhost" \
Packit Service 509fd4
		-keyout ${CERT_DIR}/worker-key.pem \
Packit Service 509fd4
		-out ${CERT_DIR}/worker-csr.pem
Packit Service 509fd4
Packit Service 509fd4
	# sign the certificate
Packit Service 509fd4
	openssl x509 -req \
Packit Service 509fd4
		-in ${CERT_DIR}/worker-csr.pem \
Packit Service 509fd4
		-CA ${CERT_DIR}/ca-crt.pem \
Packit Service 509fd4
		-CAkey ${CERT_DIR}/ca-key.pem \
Packit Service 509fd4
		-CAcreateserial \
Packit Service 509fd4
		-out ${CERT_DIR}/worker-crt.pem
Packit Service 509fd4
Packit Service 509fd4
	# delete the request
Packit Service 509fd4
	rm /etc/osbuild-composer/worker-csr.pem
Packit 63bb0d
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Building packages
Packit 63bb0d
#
Packit 63bb0d
# The following rules build osbuild-composer packages from the current HEAD
Packit 63bb0d
# commit, based on the spec file in this directory.  The resulting packages
Packit 63bb0d
# have the commit hash in their version, so that they don't get overwritten
Packit 63bb0d
# when calling `make rpm` again after switching to another branch.
Packit 63bb0d
#
Packit 63bb0d
# All resulting files (spec files, source rpms, rpms) are written into
Packit 63bb0d
# ./rpmbuild, using rpmbuild's usual directory structure.
Packit 63bb0d
#
Packit 63bb0d
Packit Service 509fd4
RPM_SPECFILE=rpmbuild/SPECS/osbuild-composer.spec
Packit 63bb0d
RPM_TARBALL=rpmbuild/SOURCES/osbuild-composer-$(COMMIT).tar.gz
Packit 63bb0d
Packit 63bb0d
$(RPM_SPECFILE):
Packit 63bb0d
	mkdir -p $(CURDIR)/rpmbuild/SPECS
Packit Service 509fd4
	git show HEAD:osbuild-composer.spec > $(RPM_SPECFILE)
Packit 63bb0d
Packit 63bb0d
$(RPM_TARBALL):
Packit 63bb0d
	mkdir -p $(CURDIR)/rpmbuild/SOURCES
Packit 63bb0d
	git archive --prefix=osbuild-composer-$(COMMIT)/ --format=tar.gz HEAD > $(RPM_TARBALL)
Packit 63bb0d
Packit 63bb0d
.PHONY: srpm
Packit 63bb0d
srpm: $(RPM_SPECFILE) $(RPM_TARBALL)
Packit 63bb0d
	rpmbuild -bs \
Packit 63bb0d
		--define "_topdir $(CURDIR)/rpmbuild" \
Packit Service 509fd4
		--define "commit $(COMMIT)" \
Packit 63bb0d
		--with tests \
Packit 63bb0d
		$(RPM_SPECFILE)
Packit 63bb0d
Packit 63bb0d
.PHONY: rpm
Packit 63bb0d
rpm: $(RPM_SPECFILE) $(RPM_TARBALL)
Packit 63bb0d
	rpmbuild -bb \
Packit 63bb0d
		--define "_topdir $(CURDIR)/rpmbuild" \
Packit Service 509fd4
		--define "commit $(COMMIT)" \
Packit 63bb0d
		--with tests \
Packit 63bb0d
		$(RPM_SPECFILE)
Packit 63bb0d
Packit 63bb0d
#
Packit 63bb0d
# Releasing
Packit 63bb0d
#
Packit 63bb0d
Packit 63bb0d
NEXT_VERSION := $(shell expr "$(VERSION)" + 1)
Packit 63bb0d
Packit 63bb0d
.PHONY: release
Packit 63bb0d
release:
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "Checklist for release of osbuild-composer-$(NEXT_VERSION):"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Create news entry in NEWS.md with a short description of"
Packit 63bb0d
	@echo "   any changes since the last release, which are relevant to"
Packit 63bb0d
	@echo "   users, packagers, distributors, or dependent projects."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "   Use the following template, break lines at 80ch:"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "--------------------------------------------------------------------------------"
Packit 63bb0d
	@echo "## CHANGES WITH $(NEXT_VERSION):"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "  * ..."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "  * ..."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo -n "Contributions from: "
Packit 63bb0d
# We omit the contributor list if `git log` fails. If you hit this,
Packit 63bb0d
# consider fetching missing tags via `git fetch --tags`, or just copy
Packit 63bb0d
# this command and remove the stderr-redirect.
Packit 63bb0d
	@echo `( git log --format='%an, ' v$(VERSION)..HEAD 2>/dev/null | sort -u | tr -d '\n' | sed 's/, $$//' ) || echo`
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "— Location, YYYY-MM-DD"
Packit 63bb0d
	@echo "--------------------------------------------------------------------------------"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "   To get a list of changes since the last release, you may use:"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "        git log v$(VERSION)..HEAD"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Bump the project version. The canonical location so far is"
Packit Service 509fd4
	@echo "   'osbuild-composer.spec'."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Make sure the spec-file is updated for the new release and"
Packit 63bb0d
	@echo "   correctly supports all new features. This should already be"
Packit 63bb0d
	@echo "   done by previous commits that introduced the changes, but"
Packit 63bb0d
	@echo "   a sanity check does not hurt."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Commit the version bump, specfile changes and NEWS.md in any"
Packit 63bb0d
	@echo "   order you want."
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Tag the release via:"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo "        git tag -s -m 'osbuild-composer $(NEXT_VERSION)' v$(NEXT_VERSION) HEAD"
Packit 63bb0d
	@echo
Packit Service 509fd4
	@echo " * Push main as well as the tag:"
Packit 63bb0d
	@echo
Packit Service 509fd4
	@echo "        git push origin main"
Packit 63bb0d
	@echo "        git push origin v$(NEXT_VERSION)"
Packit 63bb0d
	@echo
Packit 63bb0d
	@echo " * Create a release on github. Use 'NEWS.md' verbatim from the"
Packit 63bb0d
	@echo "   top until the end of the section for this release as release"
Packit 63bb0d
	@echo "   notes. Use 'v$(NEXT_VERSION)' as release name and as tag for"
Packit 63bb0d
	@echo "   the release."
Packit 63bb0d
	@echo