52af6e973b
This adopts pattern used by Vault, where we split CircleCI yaml config into multiple files that get packed and translated to 2.0. This has two motivations: First, to ease translating config to CircleCI 2.0 so it can run on Enterprise private repository. Second and most importantly, it also adding Enterprise specific jobs in separate files with reduced config file merging conflict resolution.
81 lines
2.6 KiB
Makefile
81 lines
2.6 KiB
Makefile
# Set SHELL to 'strict mode' without using .SHELLFLAGS for max compatibility.
|
|
# See https://fieldnotes.tech/how-to-shell-for-compatible-makefiles/
|
|
SHELL := /usr/bin/env bash -euo pipefail -c
|
|
|
|
CIRCLECI := circleci --skip-update-check
|
|
|
|
# Set up some documentation/help message variables.
|
|
# We do not attempt to install the CircleCI CLI from this Makefile.
|
|
CCI_INSTALL_LINK := https://circleci.com/docs/2.0/local-cli/\#installation
|
|
CCI_INSTALL_MSG := Please install CircleCI CLI. See $(CCI_INSTALL_LINK)
|
|
CCI_VERSION := $(shell $(CIRCLECI) version 2> /dev/null)
|
|
ifeq ($(CCI_VERSION),)
|
|
# Attempting to use the CLI fails with installation instructions.
|
|
CIRCLECI := echo '$(CCI_INSTALL_MSG)'; exit 1; \#
|
|
endif
|
|
|
|
SOURCE_DIR := config
|
|
SOURCE_YML := $(shell [ ! -d $(SOURCE_DIR) ] || find $(SOURCE_DIR) -name '*.yml')
|
|
CONFIG_SOURCE := Makefile $(SOURCE_YML) | $(SOURCE_DIR)
|
|
OUT := config.yml
|
|
TMP := .tmp/config-processed
|
|
CONFIG_PACKED := .tmp/config-packed
|
|
|
|
default: help
|
|
|
|
help:
|
|
@echo "Usage:"
|
|
@echo " make ci-config: recompile config.yml from $(SOURCE_DIR)/"
|
|
@echo " make ci-verify: verify that config.yml is a true mapping from $(SOURCE_DIR)/"
|
|
@echo
|
|
@echo "Diagnostics:"
|
|
@[ -z "$(CCI_VERSION)" ] || echo " circleci-cli version $(CCI_VERSION)"
|
|
@[ -n "$(CCI_VERSION)" ] || echo " $(CCI_INSTALL_MSG)"
|
|
|
|
$(SOURCE_DIR):
|
|
@echo No source directory $(SOURCE_DIR) found.; exit 1
|
|
|
|
# Make sure our .tmp dir exists.
|
|
$(shell [ -d .tmp ] || mkdir .tmp)
|
|
|
|
.PHONY: ci-config
|
|
ci-config: $(OUT)
|
|
|
|
.PHONY: ci-verify
|
|
ci-verify: config-up-to-date
|
|
@$(CIRCLECI) config validate $(OUT)
|
|
|
|
define GENERATED_FILE_HEADER
|
|
### ***
|
|
### WARNING: DO NOT manually EDIT or MERGE this file, it is generated by 'make ci-config'.
|
|
### INSTEAD: Edit or merge the source in $(SOURCE_DIR)/ then run 'make ci-config'.
|
|
### ***
|
|
endef
|
|
export GENERATED_FILE_HEADER
|
|
|
|
# GEN_CONFIG writes the config to a temporary file. If the whole process succeeds,
|
|
# it then moves that file to $@. This makes is an atomic operation, so if it fails
|
|
# make doesn't consider a half-baked file up to date.
|
|
define GEN_CONFIG
|
|
@$(CIRCLECI) config pack $(SOURCE_DIR) > $(CONFIG_PACKED)
|
|
@echo "$$GENERATED_FILE_HEADER" > $@.tmp || { rm -f $@; exit 1; }
|
|
@$(CIRCLECI) config process $(CONFIG_PACKED) >> $@.tmp || { rm -f $@.tmp; exit 1; }
|
|
@mv -f $@.tmp $@
|
|
endef
|
|
|
|
$(OUT): $(CONFIG_SOURCE)
|
|
$(GEN_CONFIG)
|
|
@echo "$@ updated"
|
|
|
|
$(TMP): $(CONFIG_SOURCE)
|
|
$(GEN_CONFIG)
|
|
|
|
.PHONY: config-up-to-date
|
|
config-up-to-date: $(TMP) # Note this must not depend on $(OUT)!
|
|
@if diff config.yml $<; then \
|
|
echo "Generated $(OUT) is up to date!"; \
|
|
else \
|
|
echo "Generated $(OUT) is out of date, run make $(CONFIG) to update."; \
|
|
exit 1; \
|
|
fi
|