1
0

ci/packagespec (#9653)

* add packagespec build system

- The majority of changes in this commit are files generated
  by packagespec (everything in the packages-oss.lock directory).

* add .yamllint

* update to packagespec@fd54aea4

* ci: bust packagespec cache

- Change to packagespec results in package IDs that can use
  git tag refs, not just commit refs.

* update to packagepsec@5fc121d0

- This busts all caches, because of a change to the way we
  no longer traverse from tag refs to commit refs, due to
  the potential confusion this can cause.
- See fd54aea482
  for the original change to packagespec necessitating this.

* update to packagespec@5e6c87b6

- This completes the change to allowing git tag refs
  to be used for source IDs, begun in f130b940a8fbe3e9398225b08ea1d63420bef7b6

* update to packagespec@4d3c9e8b

- This busts cache, needed to apply previous change.

* remove RELEASE_BUILD_WORKFLOW_NAME

* update packagespec, add watch-ci target

* fix package names (do not refer to EDITION)

* remove EDITION input from packages-oss.yml

* bump package cache, update packagespec

* update packagespec, add 'aliases' target

* update packagespec; less output noise

* ci: give release bundle file a better name

- When performing a release build, this will include the build ID
  as part of the name, making it easier to distinguish from other
  builds.

* ci: create aliases tarball artifact

* ci: cache package metadata files

* ci: add metadata artifact

* ci: bust circleci package cache

* Revert "ci: bust circleci package cache"

This reverts commit 1320d182613466f0999d63f5742db12ac17f8e92.

* ci: remove aliases artifact

* ci: use buildID not workflowName to id artifacts

* packages: add BUNDLE_NAME metadata

* do not cache package metadata with binaries

* ci: bump package cache

* ci: debugging

* ci: fix package cache; update packagespec

* ci: update packagespec to 10e7beb2

* ci: write package metadata and aliases

* ci: switch to .zip artifacts

* switch package bundle back to tar.gz (from zip)

- Because of the way zip works, the zip archive was over 2GB rather than under 750MB as with tar.gz.

* bump packagespec, adds list-staged-builds

* update packagespec

* add publish stub + general tidy up

* bump packagespec

* bump packagespec; add make publish-config

* Makefile: tidy up packagespec targets

* pass PRODUCT_REPO_ROOT to packagespec

* bump go to 1.14.6

* packages-oss.yml: use more explicit base image

* bump packagespec to b899b7c1

* bump packagespec to f040ce8f

* packages-oss.yml: pin base image to digest

- This digest is pointed to by debian:buster-20200720
- Using a specific digest ensures that builds use the same
  base image in all contexts

* add release-repo; bump packagespec

* remove BUILD_TAGS and -tags flag

* bump packagespec to e444f742

* bump to go1.14.7

* ci: bump to go1.14.7
This commit is contained in:
Sam Salisbury 2020-08-11 10:00:59 +01:00 committed by GitHub
parent 469fc39c1c
commit 956bd0af07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
57 changed files with 8412 additions and 64 deletions

1352
.circleci/config.yml generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,229 @@
{{- $data := (datasource "package-list") -}}
{{- /*
BUILD_ID is set by the staging workflow to produce an identifiable build.
*/ -}}
{{- $buildID := (env.Getenv "BUILD_ID" "standalone") -}}
{{- $workflowName := (env.Getenv "RELEASE_BUILD_WORKFLOW_NAME" "build-standalone") -}}
{{- $packages := $data.packages -}}
{{- $layers := $data.layers -}}
{{- $revision := (env.Getenv "PRODUCT_REVISION") -}}
{{- define "cache-key"}}{{template "cache-version"}}-{{.}}{{end -}}
{{- define "cache-version"}}cache002{{end -}}
{{- /*
Any change to cache-version invalidates all build layer and package caches.
*/ -}}
# Current cache version: {{template "cache-version"}}
executors:
releaser:
docker:
- image: circleci/buildpack-deps
environment:
PRODUCT_REVISION: "{{if $revision}}{{$revision}}{{end}}"
AUTO_INSTALL_TOOLS: 'YES'
shell: /usr/bin/env bash -euo pipefail -c
workflows:
{{$workflowName}}:
jobs:
- cache-builder-images:
filters:
branches:
only:
- /build-.*/
- /ci.*/
{{- range $packages}}
- {{.meta.BUILD_JOB_NAME}}: { requires: [ cache-builder-images ] }
{{- end }}
- bundle-releases:
requires:
{{- range $packages}}
- {{.meta.BUILD_JOB_NAME}}{{end}}
jobs:
cache-builder-images:
executor: releaser
steps:
- setup_remote_docker
- checkout
- write-build-layer-cache-keys
# Load best available cached image.
{{- $targetLayerType := "build-static-assets" }}
{{- $targetLayer := .}}
{{- range $layers}}
{{- if eq .type $targetLayerType }}
{{- $targetLayer = .}}
- restore_cache:
keys:
{{- range .meta.circleci.CACHE_KEY_PREFIX_LIST}}
- {{template "cache-key" .}}
{{- end}}
- run:
name: Finish early if loaded exact match from cache.
command: |
if [ -f {{.archivefile}} ]; then
echo "Exact match found in cache, skipping build."
circleci-agent step halt
else
echo "No exact match found, proceeding with build."
fi
- run: LAYER_SPEC_ID={{.name}} make -C packages*.lock load-builder-cache
{{- end}}{{end}}
# No exact match was found, so build each layer up to target type.
{{- $finished := false }}
{{- range $layers}}
{{- if not $finished }}
{{- $finished = eq .type $targetLayerType}}
- run: make -f packages*.lock/layer.mk {{.name}}-image
{{- end}}
{{- end}}
# Save the target layer archive.
- run: make -f packages*.lock/layer.mk {{$targetLayer.name}}-save
# Store the target layer archive as all the relevant cache names.
{{- $lastArchive := $targetLayer.archivefile}}
{{- range $i, $l := $targetLayer.meta.builtin.LAYER_LIST}}
{{- $currentArchive := $l.archive}}
{{- if ne $currentArchive $lastArchive }}
- run: mv {{$lastArchive}} {{$currentArchive}}
{{- end}}
- save_cache:
key: {{template "cache-key" (index $targetLayer.meta.circleci.CACHE_KEY_PREFIX_LIST $i)}}
paths:
- {{$currentArchive}}
{{- $lastArchive = $currentArchive }}
{{- end}}
{{- range $packages}}
{{.meta.BUILD_JOB_NAME}}:
executor: releaser
environment:
- PACKAGE_SPEC_ID: {{.packagespecid}}
steps:
- setup_remote_docker
- checkout
# Restore the package cache first, we might not need to rebuild.
- write-package-cache-key
- restore_cache:
key: '{{template "cache-key" .meta.circleci.PACKAGE_CACHE_KEY}}'
- run:
name: Check the cache status.
command: |
if ! { PKG=$(find .buildcache/packages/store -maxdepth 1 -mindepth 1 -name '*.zip' 2> /dev/null) && [ -n "$PKG" ]; }; then
echo "No package found, continuing with build."
exit 0
fi
echo "Package already cached, skipping build."
circleci-agent step halt
# We need to rebuild, so load the builder cache.
- write-build-layer-cache-keys
- restore_cache:
keys:
{{- range .meta.circleci.BUILDER_CACHE_KEY_PREFIX_LIST}}
- {{template "cache-key" .}}
{{- end}}
- run: make -C packages*.lock load-builder-cache
- run: make -C packages*.lock package
- run: ls -lahR .buildcache/packages
# Save package cache.
- save_cache:
key: '{{template "cache-key" .meta.circleci.PACKAGE_CACHE_KEY}}'
paths:
- .buildcache/packages/store
# Save builder image cache if necessary.
# The range should only iterate over a single layer.
{{- $pkg := . -}}
{{- range $idx, $layerInfo := .meta.builtin.BUILD_LAYERS }}
{{- if eq $layerInfo.type "warm-go-build-vendor-cache" }}
{{- with $layerInfo }}
{{- $circleCICacheKey := (index $pkg.meta.circleci.BUILDER_CACHE_KEY_PREFIX_LIST $idx) }}
- run:
name: Check builder cache status
command: |
if [ -f {{.archive}} ]; then
echo "Builder image already cached, skipping cache step."
circleci-agent step halt
fi
- run: make -f packages*.lock/layer.mk {{.name}}-save
- save_cache:
key: '{{template "cache-key" $circleCICacheKey}}'
paths:
- {{.archive}}
{{- end}}
{{- end}}
{{- end}}
{{end}}
bundle-releases:
executor: releaser
steps:
- checkout
- write-all-package-cache-keys
{{- range $packages}}
- load-{{.meta.BUILD_JOB_NAME}}
- run:
environment:
PACKAGE_SPEC_ID: {{.packagespecid}}
name: Write package metadata for {{.meta.BUILD_JOB_NAME}}
command: |
make package-meta
{{- end}}
- run:
name: Write package aliases
command:
make aliases
- run:
name: List Build Cache
command: ls -lahR .buildcache
# Surface the package store directory as an artifact.
# This makes each zipped package separately downloadable.
- store_artifacts:
path: .buildcache/packages
destination: packages-{{$buildID}}
# Surface a tarball of the whole package store as an artifact.
- run: tar -czf packages-{{$buildID}}.tar.gz .buildcache/packages
- store_artifacts:
path: packages-{{$buildID}}.tar.gz
destination: packages-{{$buildID}}.tar.gz
# Surface a tarball of just the metadata files.
- run: tar -czf meta-{{$buildID}}.tar.gz .buildcache/packages/store/*.json
- store_artifacts:
path: meta-{{$buildID}}.tar.gz
destination: meta-{{$buildID}}.tar.gz
commands:
{{- range $packages }}
load-{{.meta.BUILD_JOB_NAME}}:
steps:
- restore_cache:
key: '{{template "cache-key" .meta.circleci.PACKAGE_CACHE_KEY}}'
{{end}}
write-build-layer-cache-keys:
steps:
- run:
name: Write builder layer cache keys
command: make -C packages*.lock write-builder-cache-keys
write-package-cache-key:
steps:
- run:
name: Write package cache key
command: make -C packages*.lock write-package-cache-key
write-all-package-cache-keys:
steps:
- run:
name: Write package cache key
command: make -C packages*.lock write-all-package-cache-keys

View File

@ -1,52 +1,6 @@
---
version: 2.1
references:
images:
node: &NODE_IMAGE node:10-buster # Pin Node.js to major version (ex: 10)
orbs:
slack: circleci/slack@3.2.0
cache:
go-sum: &GO_SUM_CACHE_KEY go-sum-v1-{{ checksum "go.sum" }}
yarn-lock: &YARN_LOCK_CACHE_KEY yarn-lock-v6-{{ checksum "ui/yarn.lock" }}
# more commands defined in commands/
commands:
restore_yarn_cache:
steps:
- restore_cache:
key: *YARN_LOCK_CACHE_KEY
save_yarn_cache:
steps:
- save_cache:
key: *YARN_LOCK_CACHE_KEY
paths:
- ui/node_modules
executors:
go-machine:
machine: true
shell: /usr/bin/env bash -euo pipefail -c
environment:
GO111MODULE: "off"
CIRCLECI_CLI_VERSION: 0.1.5546 # Pin CircleCI CLI to patch version (ex: 1.2.3)
GO_VERSION: 1.14.7 # Pin Go to patch version (ex: 1.2.3)
GOTESTSUM_VERSION: 0.5.2 # Pin gotestsum to patch version (ex: 1.2.3)
GO_TAGS: ""
working_directory: /go/src/github.com/hashicorp/vault
node:
docker:
- image: *NODE_IMAGE
environment:
JOBS: 2
shell: /usr/bin/env bash -euo pipefail -c
working_directory: /go/src/github.com/hashicorp/vault
python:
docker:
- image: python:3-alpine
shell: /usr/bin/env bash -euo pipefail -c
working_directory: /go/src/github.com/hashicorp/vault
alpine:
docker:
- image: alpine:3.10.2
shell: /bin/sh
working_directory: /go/src/github.com/hashicorp/vault

View File

@ -0,0 +1,10 @@
restore_yarn_cache:
steps:
- restore_cache:
key: &YARN_LOCK_CACHE_KEY yarn-lock-v6-{{ checksum "ui/yarn.lock" }}
save_yarn_cache:
steps:
- save_cache:
key: *YARN_LOCK_CACHE_KEY
paths:
- ui/node_modules

View File

@ -0,0 +1,25 @@
go-machine:
machine: true
shell: /usr/bin/env bash -euo pipefail -c
environment:
GO111MODULE: "off"
CIRCLECI_CLI_VERSION: 0.1.5546 # Pin CircleCI CLI to patch version (ex: 1.2.3)
GO_VERSION: 1.14.7 # Pin Go to patch version (ex: 1.2.3)
GOTESTSUM_VERSION: 0.5.2 # Pin gotestsum to patch version (ex: 1.2.3)
GO_TAGS: ""
working_directory: /go/src/github.com/hashicorp/vault
node:
docker:
- image: node:10-buster
shell: /usr/bin/env bash -euo pipefail -c
working_directory: /go/src/github.com/hashicorp/vault
python:
docker:
- image: python:3-alpine
shell: /usr/bin/env bash -euo pipefail -c
working_directory: /go/src/github.com/hashicorp/vault
alpine:
docker:
- image: alpine:3.10.2
shell: /bin/sh
working_directory: /go/src/github.com/hashicorp/vault

10
.yamllint Normal file
View File

@ -0,0 +1,10 @@
---
extends: relaxed
rules:
comments: disable
comments-indentation: disable
line-length: disable
commas:
max-spaces-after: -1

View File

@ -126,12 +126,8 @@ prep: fmtcheck
@[ ! -d .git/hooks ] || grep -l '^# husky$$' .git/hooks/* | xargs rm -f
@if [ -d .git/hooks ]; then cp .hooks/* .git/hooks/; fi
.PHONY: ci-config
ci-config:
@$(MAKE) -C .circleci ci-config
.PHONY: ci-verify
ci-verify:
@$(MAKE) -C .circleci ci-verify
PACKAGES_LOCK_DIR := $(shell find . -mindepth 1 -maxdepth 1 \
-type d -name 'packages*.lock')
# bootstrap the build by downloading additional tools needed to build
ci-bootstrap:
@ -285,6 +281,82 @@ publish-commit:
@[ -n "$(PUBLISH_VERSION)" ] || { echo "You must set PUBLISH_VERSION to the version in semver-like format."; exit 1; }
set -x; $(GPG_KEY_VARS) && git commit --allow-empty --gpg-sign=$$GIT_GPG_KEY_ID -m 'release: publish v$(PUBLISH_VERSION)'
.PHONY: bin default prep test vet ci-bootstrap bootstrap fmt fmtcheck mysql-database-plugin mysql-legacy-database-plugin cassandra-database-plugin influxdb-database-plugin postgresql-database-plugin mssql-database-plugin hana-database-plugin mongodb-database-plugin static-assets ember-dist ember-dist-dev static-dist static-dist-dev assetcheck check-vault-in-path check-browserstack-creds test-ui-browserstack stage-commit publish-commit
# WRITE_GENERATED_FILE_HEADER overwrites the file specified, replacing its contents with
# the header warning people not to attempt to edit or merge the file. You should call this
# before writing the generated contents to the file.
# Args: 1: File to write; 2: Command to generate it; 3: Source files to edit/merge instead.
define WRITE_GENERATED_FILE_HEADER
echo "### ***" > $(1); \
echo "### WARNING: DO NOT manually EDIT or MERGE this file, it is generated by '$(2)'." >> $(1); \
echo "### INSTEAD: Edit or merge the source in $(3) then run '$(2)'." >> $(1); \
echo "### ***" >> $(1)
endef
## begin packagespec integration ##
# The plan is to generate this packagespec integration section automatically.
# By keeping it in a contiguous block for now, it will be easier to
# auto-generate when we get to it.
SPEC_FILE_PATTERN := packages*.yml
# SPEC is the human-managed description of which packages we are able to build.
SPEC := $(shell find . -mindepth 1 -maxdepth 1 -name '$(SPEC_FILE_PATTERN)')
ifneq ($(words $(SPEC)),1)
$(error Found $(words $(SPEC)) $(SPEC_FILE_PATTERN) files, need exactly 1: $(SPEC))
endif
SPEC_FILENAME := $(notdir $(SPEC))
SPEC_MODIFIER := $(SPEC_FILENAME:packages%.yml=%)
# LOCKDIR contains the lockfile and layer files.
LOCKDIR := packages$(SPEC_MODIFIER).lock
LOCKFILE := $(LOCKDIR)/pkgs.yml
export PACKAGE_SPEC_ID LAYER_SPEC_ID PRODUCT_REVISION PRODUCT_VERSION
# PACKAGESPEC_TARGETS are convenience aliases for targets defined in $(LOCKDIR)/Makefile
PACKAGESPEC_TARGETS := \
build build-all build-ci \
aliases meta package \
package-meta stage-config stage \
watch-ci publish-config publish list-staged-builds
$(PACKAGESPEC_TARGETS):
$(PACKAGESPEC_TARGETS):
@PRODUCT_REPO_ROOT="$(shell git rev-parse --show-toplevel)" $(MAKE) -C $(LOCKDIR) $@
# packages regenerates $(LOCKDIR) from $(SPEC) using packagespec. This is only for
# internal HashiCorp use, as it has dependencies not available to OSS contributors.
packages:
@command -v packagespec > /dev/null 2>&1 || { \
echo "Please install packagespec."; \
echo "Note: packagespec is only available to HashiCorp employees at present."; \
exit 1; \
}
@packagespec lock -specfile $(SPEC) -lockdir $(LOCKDIR)
@$(MAKE) ci-config
.PHONY: $(PACKAGESPEC_TARGETS) packages
## end packagespec integration ##
CI_WORKFLOW_TPL := .circleci/config/@build-release.yml.tpl
CI_WORKFLOW := .circleci/config/@build-release.yml
.PHONY: ci-update-release-packages $(CI_WORKFLOW)
ci-update-release-packages: $(CI_WORKFLOW)
@echo $^
$(CI_WORKFLOW): $(LOCKFILE) $(CI_WORKFLOW_TPL)
@\
echo "==> Updating $@ to match $<"; \
$(call WRITE_GENERATED_FILE_HEADER,$@,make $@,$^); \
cat $< | gomplate -f $(CI_WORKFLOW_TPL) -d 'package-list=stdin://?type=application/yaml' >> $@
.PHONY: ci-config
ci-config: ci-update-release-packages
@$(MAKE) -C .circleci ci-config
.PHONY: ci-verify
ci-verify:
@$(MAKE) -C .circleci ci-verify
.PHONY: bin default prep test vet bootstrap ci-bootstrap fmt fmtcheck mysql-database-plugin mysql-legacy-database-plugin cassandra-database-plugin influxdb-database-plugin postgresql-database-plugin mssql-database-plugin hana-database-plugin mongodb-database-plugin static-assets ember-dist ember-dist-dev static-dist static-dist-dev assetcheck check-vault-in-path check-browserstack-creds test-ui-browserstack stage-commit publish-commit
.NOTPARALLEL: ember-dist ember-dist-dev static-assets

2
packages-oss.lock/.gitattributes generated vendored Executable file
View File

@ -0,0 +1,2 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
* linguist-generated

293
packages-oss.lock/Makefile generated Executable file
View File

@ -0,0 +1,293 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
include $(shell git rev-parse --show-toplevel)/packages*.lock/config.mk
.PHONY: packages commands build package write-builder-cache-keys \
write-all-package-cache-keys build-all
GOOS ?= $(shell go env GOOS 2>/dev/null || echo linux)
GOARCH ?= $(shell go env GOARCH 2>/dev/null || echo amd64)
DEFAULT_PACKAGE_YQ := [ .packages[] | select(.inputs.GOOS=="$(GOOS)" and .inputs.GOARCH=="$(GOARCH)") ][0]
QUERY_DEFAULT_PACKAGESPEC = $(call QUERY_LOCK,$(DEFAULT_PACKAGE_YQ) | $(1))
# MK is shorthand for changing to repo root and selecting a make target
# from a file in this directory. All *.mk files in this directory assume
# the current working directory is the repo root. This Makefile exists
# to invoke those mk files correctly.
MK := $(MAKE) -C $(REPO_ROOT) -f $(LOCKDIR)/
# configure load-builder-cache target to load the most specific builder layer cache
# available as an archive in the build cache.
ifneq ($(PACKAGE_SPEC_ID),)
PACKAGE_CACHE_KEY_FILE := $(shell $(call QUERY_PACKAGESPEC,.meta.builtin.PACKAGE_CACHE_KEY_FILE))
# Loading the best available archive for a specific package build.
BUILD_LAYER_ARCHIVES := $(shell $(call QUERY_PACKAGESPEC,.meta.builtin.BUILD_LAYERS[].archive))
BEST_BUILD_LAYER_ARCHIVE := $(shell cd $(REPO_ROOT) && for F in $(BUILD_LAYER_ARCHIVES); do \
if [ -f $$F ]; then echo $$F; exit 0; fi; done)
ifeq ($(BEST_BUILD_LAYER_ARCHIVE),)
load-builder-cache:
@echo "No build layer archives found in build cache. Looked for: $(BUILD_LAYER_ARCHIVES)"
else
BEST_BUILD_LAYER_NAME := $(shell $(call QUERY_PACKAGESPEC,.meta.builtin.BUILD_LAYERS[] \
| select(.archive=="$(BEST_BUILD_LAYER_ARCHIVE)") | .name))
BEST_BUILD_LAYER_LOAD_TARGET := $(BEST_BUILD_LAYER_NAME)-load
load-builder-cache:
@$(MK)layer.mk $(BEST_BUILD_LAYER_LOAD_TARGET)
endif
else ifneq ($(LAYER_SPEC_ID),)
# Loading the best avilable archive for a specific layer build.
BUILD_LAYER_ARCHIVES := $(shell $(call QUERY_LOCK,.layers[] | select(.name=="$(LAYER_SPEC_ID)") \
| .meta.builtin.LAYER_LIST[].archive))
BEST_BUILD_LAYER_ARCHIVE := $(shell cd $(REPO_ROOT) && for F in $(BUILD_LAYER_ARCHIVES); do \
if [ -f $$F ]; then echo $$F; exit 0; fi; done)
ifeq ($(BEST_BUILD_LAYER_ARCHIVE),)
load-builder-cache:
@echo "No build layer archives found in build cache. Looked for: $(BUILD_LAYER_ARCHIVES)"
else
BEST_BUILD_LAYER_NAME := $(shell $(call QUERY_LOCK,.layers[] | select(.name=="$(LAYER_SPEC_ID)") \
| .meta.builtin.LAYER_LIST[] | select(.archive=="$(BEST_BUILD_LAYER_ARCHIVE)") | .name))
BEST_BUILD_LAYER_LOAD_TARGET := $(BEST_BUILD_LAYER_NAME)-load
load-builder-cache:
@$(MK)layer.mk $(BEST_BUILD_LAYER_LOAD_TARGET)
endif
else
load-builder-cache:
@echo "You must set PACKAGE_SPEC_ID or LAYER_SPEC_ID so we know which caches to look for."
endif
commands:
@$(MAKE) -f packages.mk commands
# build is a convenience target for local builds, do not use in CI.
# Instead, use `make package` specifying PACKAGE_SPEC_ID.
build:
@echo "==> Building default package for GOOS=$(GOOS) GOARCH=$(GOARCH)"
@ALIASES=$$($(call QUERY_DEFAULT_PACKAGESPEC,.aliases[] | "alias type:\(.type) path:\(.path)") | column -t); \
echo "$$ALIASES"
@PACKAGE_SPEC_ID="$$($(call QUERY_DEFAULT_PACKAGESPEC,.packagespecid) | head -n1)"; \
COMMAND="PACKAGE_SOURCE_ID=$$PACKAGE_SOURCE_ID PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID $(MK)build.mk package"; \
echo "$$COMMAND"; \
$(SHELL) "$$COMMAND"
# meta is a convenience target for local builds, do not use in CI.
# Instead, use `make package-meta` specifying PACKAGE_SPEC_ID.
meta:
@echo "==> Writing metacdata for default package (GOOS=$(GOOS) GOARCH=$(GOARCH))"
@ALIASES=$$($(call QUERY_DEFAULT_PACKAGESPEC,.aliases[] | "alias type:\(.type) path:\(.path)") | column -t); \
echo "$$ALIASES"
@PACKAGE_SPEC_ID="$$($(call QUERY_DEFAULT_PACKAGESPEC,.packagespecid) | head -n1)"; \
COMMAND="PACKAGE_SOURCE_ID=$$PACKAGE_SOURCE_ID PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID $(MK)build.mk package-meta"; \
echo "$$COMMAND"; \
$(SHELL) "$$COMMAND"
# build-all is a convenience target to sequentially build each package.
# It is mostly useful in the tutorial, do not use this in CI as it is much slower
# than building packages in parallel.
build-all:
@PACKAGE_SPEC_IDS="$$($(call QUERY_LOCK,.packages[] | .packagespecid))"; \
COUNT=$$(echo $$PACKAGE_SPEC_IDS | wc -w | xargs); \
echo "==> Building all $$COUNT packages sequentially."; \
for PACKAGE_SPEC_ID in $$PACKAGE_SPEC_IDS; do \
COMMAND="PACKAGE_SOURCE_ID=$$PACKAGE_SOURCE_ID PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID $(MK)build.mk package"; \
echo "$$COMMAND"; \
$(SHELL) "$$COMMAND"; \
done
# package expects PACKAGE_SPEC_ID to already be set, use this in CI.
package:
@echo "==> Building package spec $(PACKAGE_SPEC_ID)"
@ALIASES=$$($(call QUERY_PACKAGESPEC,.aliases[] | "alias type:\(.type) path:\(.path)") | column -t); \
echo "$$ALIASES"
@COMMAND="PACKAGE_SOURCE_ID=$$PACKAGE_SOURCE_ID PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID $(MK)build.mk package"; \
echo "$$COMMAND"; \
$(SHELL) "$$COMMAND"
# package-meta expects PACKAGE_SPEC_ID to already be set, use this in CI.
package-meta:
@echo "==> Writing metadata for package $(PACKAGE_SPEC_ID)"
@ALIASES=$$($(call QUERY_PACKAGESPEC,.aliases[] | "alias type:\(.type) path:\(.path)") | column -t); \
echo "$$ALIASES"
@COMMAND="PACKAGE_SOURCE_ID=$$PACKAGE_SOURCE_ID PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID $(MK)build.mk package-meta"; \
echo "$$COMMAND"; \
$(SHELL) "$$COMMAND"
# aliases writes all alias symlinks for packages in the package store that
# match the current LOCKFILE and PRODUCT_REVISION. It does not cause a new build.
# If the package store contains no matchin binaries, then this does nothing.
aliases:
@echo "==> Writing alias symlinks for existing packages in the store."; \
cd $(REPO_ROOT); \
PACKAGE_SPEC_IDS="$$($(call QUERY_LOCK,.packages[] | .packagespecid))"; \
for PACKAGE_SPEC_ID in $$PACKAGE_SPEC_IDS; do \
PACKAGE_FILE="$$PACKAGE_SOURCE_ID-$$PACKAGE_SPEC_ID.zip"; \
PACKAGE="$(CACHE_ROOT)/packages/store/$$PACKAGE_FILE"; \
[ -f $$PACKAGE ] || continue; \
ALIASES=$$($(call QUERY_PACKAGESPEC_BY_ID,'$$PACKAGE_SPEC_ID',.aliases[] | "$(CACHE_ROOT)/packages/by-alias/\(.type)/\(.path)")); \
for A in $$ALIASES; do \
mkdir -p $$(dirname $$A); \
$(LN) -rfs $$PACKAGE $$A; \
echo "==> Alias written: $$A -> $$PACKAGE"; \
done; \
done
write-builder-cache-keys:
@echo "==> Writing build layer cache keys"
@$(MK)layer.mk write-cache-keys
write-package-cache-key:
@if [ -z "$(PACKAGE_CACHE_KEY_FILE)" ]; then echo "Must set PACKAGE_SPEC_ID"; exit 1; fi
@$(WRITE_PACKAGE_CACHE_KEY)
@echo "==> Package cache key written: $(PACKAGE_CACHE_KEY_FILE)"
# WRITE_PACKAGE_CACHE_KEY writes the package cache key for PACKAGE_SPEC_ID.
# We reference this as an environment variable, so you can override it in a
# recipe rather than relying on the global setting.
define WRITE_PACKAGE_CACHE_KEY
( \
cd $(REPO_ROOT); \
KEY="PACKAGE_SPEC_ID=$$PACKAGE_SPEC_ID"$$'\n'"PACKAGE_SOURCE_ID=$(PACKAGE_SOURCE_ID)"; \
FILE=$$(yq -r ".packages[] | select(.packagespecid==\"$$PACKAGE_SPEC_ID\") \
| .meta.builtin.PACKAGE_CACHE_KEY_FILE" < $(LOCK)); \
echo "$$FILE"; \
echo "$$KEY"; \
mkdir -p $$(dirname $$FILE); \
echo "$$KEY" > "$$FILE";\
)
endef
write-all-package-cache-keys:
@IDS="$$($(call QUERY_LOCK,.packages[].packagespecid))"; \
for PACKAGE_SPEC_ID in $$IDS; do \
$(WRITE_PACKAGE_CACHE_KEY); \
done; \
echo "==> All package cache keys written"
clean-builder-images:
@IMAGES=$$(docker images --format '{{.Repository}}:{{.Tag}}' | grep '^$(BUILDER_IMAGE_PREFIX)' || true); \
if [ -z "$$IMAGES" ]; then exit 0; fi; \
docker rmi -f $$IMAGES
clean:
@cd $(REPO_ROOT); rm -rf $(CACHE_ROOT)
clean-all: clean clean-builder-images
clean-all-prune: clean-all
docker container prune
docker image prune
# Configure the releaser repo. If you are developing that repo, you may want
# to clone it adjacent to this one in ../packagespec-release, otherwise it will
# be cloned into .releaser, if you have access to it.
# If using it in an adjacent directory, you won't need to push changes in order
# to test them locally.
RELEASER_REPO ?= git@github.com:hashicorp/packagespec-release.git
RELEASER_DIR := $(REPO_ROOT)/../packagespec-release
RELEASER_CLONE := NO
RELEASER_PULL := NO
ifeq ($(shell if [ -d $(RELEASER_DIR) ]; then echo OK; else echo NO; fi),NO)
RELEASER_GITIGNORE := $(REPO_ROOT)/.tmp/.gitignore
RELEASER_DIR := $(REPO_ROOT)/.tmp/releaser
RELEASER_CLONE := YES
RELEASER_PULL := YES
endif
# REQUIRE_EXPORT requires a set of make variables to be nonempty,
# exits 1 if any are not, and exports each one otherwise.
# To be used in recipe bodies.
define REQUIRE_EXPORT
$(foreach VAR,$(1),[ -n "$($(VAR))" ] || { echo "Must set $(VAR)"; exit 1; }; export $(VAR)='$($(VAR))';)
endef
# EXPORT exports each named variable, if it exists.
define EXPORT
$(foreach VAR,$(1),export $(VAR)='$($(VAR))';)
endef
# INVOKE_RELEASER_TARGET invokes the named target (first arg) in the releaser
# repository, first calling REQUIRE_EXPORT on all the named variables (second arg).
define INVOKE_RELEASER_TARGET
$(call REQUIRE_EXPORT,\
PRODUCT_REPO_LOCAL PRODUCT_REPO PRODUCT_PATH \
PRODUCT_CIRCLECI_SLUG PRODUCT_CIRCLECI_HOST RELEASE_SYSTEM_BRANCH \
PRODUCT_RELEASE_REPO SPEC LOCKDIR \
) \
[ -d "$(RELEASER_DIR)" ] || { \
[ $(RELEASER_CLONE) = YES ] || { \
echo "You must clone $(RELEASER_REPO) into $(RELEASER_DIR)"; exit 1; \
}; \
mkdir -p $(RELEASER_DIR); \
echo "*" > "$(RELEASER_GITIGNORE)"; \
echo "==> First time setup for staging/publishing work."; \
echo "==> Attempting to clone $(RELEASER_REPO) into $(RELEASER_DIR)"; \
echo "==> NOTE: The above repo is only available to HashiCorp employees at this time."; \
mkdir -p $(RELEASER_DIR); \
if ! git clone -q "$(RELEASER_REPO)" "$(RELEASER_DIR)"; then \
echo "==> ERROR: Failed to clone $(RELEASER_REPO)"; \
fi; \
}; \
( \
cd $(RELEASER_DIR); \
if [ $(RELEASER_PULL) = YES ]; then \
git checkout -q master; \
git pull -q origin master; \
git clean -qf; \
git reset -q --hard HEAD; \
else \
echo "==> Using releaser code from $(RELEASER_DIR)"; \
fi; \
$(MAKE) $(1); \
)
endef
# RELEASE_TARGETS are targets in the release repo we pass control to
# to perform release actions.
# Note: The release repo is only available to HashiCorp employees.
RELEASE_TARGETS := build-ci stage-config stage
# We always rev-parse the PRODUCT_REVISION to obtain the full SHA. This is required
# for downstream processes which use it to determine part of the package name.
$(RELEASE_TARGETS): PRODUCT_REVISION := $(shell git rev-parse $${PRODUCT_REVISION:-HEAD})
$(RELEASE_TARGETS): PRODUCT_VERSION ?= 0.0.0-$(USER)-snapshot
$(RELEASE_TARGETS): RELEASE_SYSTEM_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
$(RELEASE_TARGETS):
@\
$(call REQUIRE_EXPORT,PRODUCT_REVISION PRODUCT_VERSION) \
$(call INVOKE_RELEASER_TARGET,$@)
# QUERY_TARGETS are targets in the release repo that perform queries, and are therefore
# not necessarily bound to a specific PRODUCT_VERSION or PRODUCT_REVISION.
QUERY_TARGETS := list-staged-builds watch-ci
$(QUERY_TARGETS): RELEASE_SYSTEM_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
$(QUERY_TARGETS):
@\
$(call EXPORT,PRODUCT_REVISION PRODUCT_VERSION) \
$(call INVOKE_RELEASER_TARGET,$@)
# BUNDLE_TARGETS are targets acting on specific staged bundles, identified by
# their BUNDLE_ID.
BUNDLE_TARGETS := publish-config publish inspect-staged-build
$(BUNDLE_TARGETS): RELEASE_SYSTEM_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
$(BUNDLE_TARGETS):
@\
$(call REQUIRE_EXPORT,BUNDLE_ID) \
$(call INVOKE_RELEASER_TARGET,$@)

126
packages-oss.lock/README.md generated Executable file
View File

@ -0,0 +1,126 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
This directory contains a build system for producing multiple different packages
from the same source code (i.e. a single git commit).
The build system allows the definition of *packages* which are near complete
descriptions of the build environment and build command used to produce each package.
This set of packages is used to generate CI configuration, and drives the building
of builder images (via layer.mk) and final packages (build.mk).
Packages include a set of *layers* which are individually cacheable stages of the
build, expressed as Dockerfile templates and source definitions, and cached as Docker
images.
## Why?
HashiCorp ship software written in Go, which must be compiled for multiple
different platforms, and with different build tags and compiler flags etc.
For some of our software there are many tens of variations that must be
built for a single commit. Managing these by hand is too onerous a task
and one that may easily result in error. The usual solution is to write
iterative programs that directly output the various binaries, however this
itself can be difficult to understand, and difficult to observe clearly.
By separating the workflows of _defining_ packages and then _building_ them
we end up with an easy to understand intermediate representation of
each package (packages.lock). Not only is it easy to understand, but also to
consume for other purposes, such as generating CI pipelines, or
programattically editing to further automation efforts.
packages.lock essentially contains all the non-source inputs to each package
along with pointers to the source itself. We cache all build layers/packages
and intermediate files according to their spec + source (all the inputs).
That is, each item in the cache, and the eventual packages we build are
input-addressable, meaning we can fairly aggressively cache everything,
with a simple invalidation rule: if any input changes, then invalidate the
cache.
## Workflow
The workflow is to edit `packages.yml` which is the human-editable description
of all the packages and build layers, and then to run `make packages` which
translates that definition into the `packages.lock` file tree.
Note: at present, only HashiCorp employees have access to the `packagespec` tool
used by the Makefile to generate packages.lock, this may or may not change in future.
The convenience command `make build` selects the first of these packages that
matches your local GOOS and GOARCH and builds that one.
## Implementation
There are two separate workflows: defining packages (in packages.yml)
and building packages (build.mk). For conveninience the main Makefile exposes targets
that invoke those files on your behalf, which you should always use unless debugging
the system. In CI there is another useful workflow: building the builder images
themselves and saving them to an archive file for caching. This is implemented
in layer.mk.
### config.mk
config.mk is included by all the other make files, and contains global configuration
as well as some utility macros and lists of required tools to install.
### build.mk
build.mk produces package files for distribution by running the build command
inside the relevant build container for that package.
### layer.mk
layer.mk contains all the code for building and caching the build layers,
it is included by build.mk so that you don't need to separately build layers
locally, but in CI you can invoke it directly to pre-cache layers.
### packages.yml
packages.yml is the human-editable defition of package specs.
### packages.lock
packages.lock contains the fully expanded version of packages.yml, including
the rendered dockerfiles in packages.lock/layers. When packages.lock changes
after running 'make packages' you should also re-generate CI config by running
`make ci-config` in the root of the repo, and commit them both.
## Build internals
### 1. Build each builder image layer
#### a. Build source archives, assign SOURCE_ID
The build process uses the definitions in packages.lock to generate source
archives (using the layers' source-include and source-exclude fields)
from either the local filesystem, or direct from git if PRODUCT_REVISION is
set. It assigns each set of source code a SOURCE_ID which is either the
SHA of the latest git commit to affect any of that code, or else if the code
is dirty (contains uncommitted changes), a SHA1 sum of the latest commit plus
the output of 'git diff' in order to make it unique
#### b. Build the docker image
Using the Dockerfile from packages.lock, the source code from the source
archive, and a reference to the base image (the one from the layer below)
build a Docker image. Each layer in packagespec.lock is addressed (has an
ID) which is a hash of its content, its source definition, and the ID of
its parent layer. This layer ID is combined with the SOURCE_ID to produce
the name of the Docker image (LAYER_ID:SOURCE_ID-PARENTHASH). We also append
'PARENTHASH' Which is a cumulative hash of each build layer's ID up to that
point. This ensures that if any base layer changes input-wise in any way,
then all subsequent layers are invalidated.
### 2. Build the package
Using the top-most buider image, which must by now contain all the source code,
execute the build command (passing in some externally calculated paths) to
compile and package the software.
Use `docker cp` to copy out the built artefact. We do this instead of using
mounts, because that's more compatible with various remote Docker scenarios.
### 3. Address the package.
Each package is addressed by all its inputs (including source code), but this
is not a human-readable name. We also add package aliases, in the form of
symlinks in .buildcache/packages/by-alias which are human-readable names
and names required by other systems involved in distribution.

117
packages-oss.lock/build.mk generated Executable file
View File

@ -0,0 +1,117 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
# build.mk builds the packages defined in packages.lock, first building all necessary
# builder images.
#
# NOTE: This file should always run as though it were in the repo root, so all paths
# are relative to the repo root.
# Include config.mk relative to repo root.
include $(shell git rev-parse --show-toplevel)/packages*.lock/config.mk
ifeq ($(PACKAGE_SPEC_ID),)
$(error You must set PACKAGE_SPEC_ID; 'make build' does this for you.)
endif
ifneq ($(PRODUCT_VERSION),)
$(error You cannot set PRODUCT_VERSION for local builds, did you mean PRODUCT_REVISION?)
endif
# PACKAGES_ROOT holds the package store, as well as other package aliases.
PACKAGES_ROOT := $(CACHE_ROOT)/packages
# PACKAGE_STORE is where we store all the package files themselves
# addressed by their input hashes.
PACKAGE_STORE := $(PACKAGES_ROOT)/store
# BY_ALIAS is where we store alias symlinks to the store.
BY_ALIAS := $(PACKAGES_ROOT)/by-alias
# Include the layers driver.
include $(LOCKDIR)/layer.mk
# GET_IMAGE_MARKER_FILE gets the name of the Docker image marker file
# for the named build layer.
GET_IMAGE_MARKER_FILE = $($(1)_IMAGE)
# GET_IMAGE_NAME gets the Docker image name of the build layer.
GET_IMAGE_NAME = $($(1)_IMAGE_NAME)
# Determine the top-level build layer.
BUILD_LAYER_NAME := $(shell $(call QUERY_PACKAGESPEC,.meta.builtin.BUILD_LAYERS[0].name))
BUILD_LAYER_IMAGE = $(call GET_IMAGE_MARKER_FILE,$(BUILD_LAYER_NAME))
BUILD_LAYER_IMAGE_NAME = $(call GET_IMAGE_NAME,$(BUILD_LAYER_NAME))
BUILD_COMMAND := $(shell $(call QUERY_PACKAGESPEC,.["build-command"]))
BUILD_ENV := $(shell $(call QUERY_PACKAGESPEC,.inputs | to_entries[] | "\(.key)=\(.value)"))
ALIASES := $(shell $(call QUERY_PACKAGESPEC,.aliases[] | "\(.type)/\(.path)"))
ALIASES := $(addprefix $(BY_ALIAS)/,$(ALIASES))
ifeq ($(BUILD_COMMAND),)
$(error Unable to find build command for package spec ID $(PACKAGE_SPEC_ID))
endif
ifeq ($(BUILD_ENV),)
$(error Unable to find build inputs for package spec ID $(PACKAGE_SPEC_ID))
endif
# Configure paths and filenames.
OUTPUT_DIR := $(PACKAGE_STORE)
_ := $(shell mkdir -p $(OUTPUT_DIR))
# PACKAGE_NAME is the input-addressed name of the package.
PACKAGE_NAME := $(PACKAGE_SOURCE_ID)-$(PACKAGE_SPEC_ID)
PACKAGE_ZIP_NAME := $(PACKAGE_NAME).zip
PACKAGE := $(OUTPUT_DIR)/$(PACKAGE_ZIP_NAME)
META_JSON_NAME := $(PACKAGE_ZIP_NAME).meta.json
META := $(OUTPUT_DIR)/$(META_JSON_NAME)
# In the container, place the output dir at root. This makes 'docker cp' easier.
CONTAINER_OUTPUT_DIR := /$(OUTPUT_DIR)
FULL_BUILD_COMMAND := export $(BUILD_ENV) && mkdir -p $(CONTAINER_OUTPUT_DIR) && $(BUILD_COMMAND)
### Docker run command configuration.
DOCKER_SHELL := /bin/bash -euo pipefail -c
DOCKER_RUN_ENV_FLAGS := \
-e PACKAGE_SOURCE_ID=$(PACKAGE_SOURCE_ID) \
-e OUTPUT_DIR=$(CONTAINER_OUTPUT_DIR) \
-e PACKAGE_ZIP_NAME=$(PACKAGE_ZIP_NAME)
BUILD_CONTAINER_NAME := build-$(PACKAGE_SPEC_ID)-$(PACKAGE_SOURCE_ID)
DOCKER_RUN_FLAGS := $(DOCKER_RUN_ENV_FLAGS) --name $(BUILD_CONTAINER_NAME)
# DOCKER_RUN_COMMAND ties everything together to build the final package as a
# single docker run invocation.
DOCKER_RUN_COMMAND = docker run $(DOCKER_RUN_FLAGS) $(BUILD_LAYER_IMAGE_NAME) $(DOCKER_SHELL) '$(FULL_BUILD_COMMAND)'
# DOCKER_CP_COMMAND copies the built artefact from the build container.
DOCKER_CP_COMMAND = docker cp $(BUILD_CONTAINER_NAME):$(CONTAINER_OUTPUT_DIR)/$(PACKAGE_ZIP_NAME) $(PACKAGE)
# package builds the package according to the set PACKAGE_SPEC_ID and PRODUCT_REVISION.
.PHONY: package
package: $(ALIASES)
@echo $(PACKAGE)
.PHONY: package-meta
package-meta: $(META)
@echo $(META)
$(META): $(LOCK)
@$(call QUERY_PACKAGESPEC,.) > $@
# PACKAGE builds the package.
$(PACKAGE): $(BUILD_LAYER_IMAGE)
@mkdir -p $$(dirname $@)
@echo "==> Building package: $@"
@echo "PACKAGE_SOURCE_ID: $(PACKAGE_SOURCE_ID)"
@echo "PACKAGE_SPEC_ID: $(PACKAGE_SPEC_ID)"
@# Print alias info.
@$(call QUERY_PACKAGESPEC,.aliases[] | "alias type:\(.type) path:\(.path)") | column -t
@docker rm -f $(BUILD_CONTAINER_NAME) > /dev/null 2>&1 || true # Speculative cleanup.
$(DOCKER_RUN_COMMAND)
$(DOCKER_CP_COMMAND)
@docker rm -f $(BUILD_CONTAINER_NAME)
# ALIASES writes the package alias links.
# ALIASES must be phony to ensure they are updated to point to the
# latest builds.
.PHONY: $(ALIASES)
$(ALIASES): $(PACKAGE)
@mkdir -p $(dir $@)
@$(LN) -rfs $(PACKAGE) $@
@echo "==> Package alias written: $@"

231
packages-oss.lock/config.mk generated Executable file
View File

@ -0,0 +1,231 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
# config.mk contains constants and derived configuration that applies to
# building both layers and final packages.
# Only include the config once. This means we can include it in the header
# of each makefile, to allow calling them individually and when they call
# each other.
ifneq ($(CONFIG_INCLUDED),YES)
CONFIG_INCLUDED := YES
# Set SHELL to strict mode, in a way compatible with both old and new GNU make.
SHELL := /usr/bin/env bash -euo pipefail -c
REPO_ROOT := $(shell git rev-parse --show-toplevel)
# Set AUTO_INSTALL_TOOLS to YES in CI to have any missing required tools installed
# automatically.
AUTO_INSTALL_TOOLS ?= NO
# CACHE_ROOT is the build cache directory.
CACHE_ROOT ?= .buildcache
CACHE_GITIGNORE := $(CACHE_ROOT)/.gitignore
$(shell [ -f $(CACHE_GITIGNORE) ] || { mkdir -p $(CACHE_ROOT); echo '*' > $(CACHE_GITIGNORE); })
# SPEC is the human-managed description of which packages we are able to build.
SPEC_FILE_PATTERN := packages*.yml
SPEC := $(shell cd $(REPO_ROOT); find . -mindepth 1 -maxdepth 1 -name '$(SPEC_FILE_PATTERN)')
ifneq ($(words $(SPEC)),1)
$(error Found $(words $(SPEC)) $(SPEC_FILE_PATTERN) files, need exactly 1: $(SPEC))
endif
SPEC_FILENAME := $(notdir $(SPEC))
SPEC_MODIFIER := $(SPEC_FILENAME:packages%.yml=%)
# LOCKDIR contains the lockfile and layer files.
LOCKDIR := packages$(SPEC_MODIFIER).lock
# BUILDER_IMAGE_PREFIX is used in generating layers' docker image names.
BUILDER_IMAGE_PREFIX := vault-builder
# LOCK is the generated fully-expanded rendition of SPEC, for use in generating CI
# pipelines and other things.
LOCK := $(LOCKDIR)/pkgs.yml
### Utilities and constants
GIT_EXCLUDE_PREFIX := :(exclude)
# SUM generates the sha1sum of its input.
SUM := sha1sum | cut -d' ' -f1
# QUOTE_LIST wraps a list of space-separated strings in quotes.
QUOTE := $(shell echo "'")
QUOTE_LIST = $(addprefix $(QUOTE),$(addsuffix $(QUOTE),$(1)))
GIT_EXCLUDE_LIST = $(call QUOTE_LIST,$(addprefix $(GIT_EXCLUDE_PREFIX),$(1)))
### End utilities and constants.
# ALWAYS_EXCLUDE_SOURCE prevents source from these directories from taking
# part in the SOURCE_ID, or from being sent to the builder image layers.
# This is important for allowing the head of master to build other commits
# where this build system has not been vendored.
#
# Source in LOCKDIR is encoded as PACKAGE_SPEC_ID and included in paths
# and cache keys. Source in .circleci/ should not do much more than call
# code in the release/ directory, SPEC is the source of LOCKDIR.
ALWAYS_EXCLUDE_SOURCE := $(SPEC) $(LOCKDIR)/ .circleci/
# ALWAYS_EXCLUD_SOURCE_GIT is git path filter parlance for the above.
ALWAYS_EXCLUDE_SOURCE_GIT := $(call GIT_EXCLUDE_LIST,$(ALWAYS_EXCLUDE_SOURCE))
YQ_PACKAGE_BY_ID = .packages[] | select(.packagespecid == "$(1)")
# YQ_PACKAGE_PATH is a yq query fragment to select the package PACKAGE_SPEC_ID.
# This may be invalid, check that PACKAGE_SPEC_ID is not empty before use.
YQ_PACKAGE_PATH := $(call YQ_PACKAGE_BY_ID,$(PACKAGE_SPEC_ID))
YQ_PACKAGE_PATH_BY_ID = $(call YQ_PACKAGE_BY_ID,$(1))
# QUERY_LOCK is a macro to query the lock file.
QUERY_LOCK = cd $(REPO_ROOT); yq -r '$(1)' < $(LOCK)
QUERY_SPEC = cd $(REPO_ROOT); yq -r '$(1)' < $(SPEC)
# QUERY_PACKAGESPEC queries the package according to the current PACKAGE_SPEC_ID.
QUERY_PACKAGESPEC = $(call QUERY_LOCK,$(YQ_PACKAGE_PATH) | $(1))
QUERY_PACKAGESPEC_BY_ID = $(call QUERY_LOCK,$(call YQ_PACKAGE_PATH_BY_ID,$(1)) | $(2))
# GIT_COMMIT_OR_TAG_REF returns the git commit or tag ref SHA that the passed
# commit-ish points to (that can be a commit, tag or branch ref).
#
# Note we used to suffix the passed commit-ish with '^{}' in order to traverse tags down
# to individual commits, in case the commit-ish is an annotated tag. However this
# makes build output confusing in case a tag ref is used rather than a commit ref.
# Therefore we now allow building tag refs, even though this means sometimes we might
# be building the same source with two different source IDs, and potentially wasting
# some potential cache hits. The tradeoff in terms of ease of use seems worth it for
# now, but this could be revisited later.
# The original of the line below was:
define GIT_COMMIT_OR_TAG_REF
git rev-parse --verify '$(1)'
endef
ifeq ($(PACKAGE_SOURCE_ID),)
# Even though layers may have different Git revisions, based on the latest
# revision of their source, we always want to
# honour either HEAD or the specified PRODUCT_REVISION for compiling the
# final binaries, as this revision is the one picked by a human to form
# the release, and may be baked into the binaries produced.
ifeq ($(PRODUCT_REVISION),)
# If PRODUCT_REVISION is empty (the default) we are concerned with building the
# current work tree, regardless of whether it is dirty or not. For local builds
# this is more convenient and more likely expected behaviour than having to commit
# just to perform a new build.
#
# Determine the PACKAGE_SOURCE_ID.
#
# Dirty package builds should never be cached because their PACKAGE_SOURCE_ID
# is not unique to the code, it just reflects the last commit ID in the git log
# prefixed with dirty_.
GIT_REF := HEAD
ALLOW_DIRTY ?= YES
PRODUCT_REVISION_NICE_NAME := <current-workdir>
DIRTY := $(shell cd $(REPO_ROOT); git diff --exit-code $(GIT_REF) -- $(ALWAYS_EXCLUDE_SOURCE_GIT) > /dev/null 2>&1 || echo "dirty_")
PACKAGE_SOURCE_ID := $(DIRTY)$(shell $(call GIT_COMMIT_OR_TAG_REF,$(GIT_REF)))
else
# PRODUCT_REVISION is non-empty so treat it as a git commit ref and pull files
# directly from git rather than the work tree.
GIT_REF := $(PRODUCT_REVISION)
ALLOW_DIRTY := NO
PRODUCT_REVISION_NICE_NAME := $(PRODUCT_REVISION)
PACKAGE_SOURCE_ID := $(shell if COMMIT=$$($(call GIT_COMMIT_OR_TAG_REF,$(PRODUCT_REVISION))); then echo $$COMMIT; else echo FAILED; fi)
ifeq ($(PACKAGE_SOURCE_ID),FAILED)
$(error Unable to find git ref "$(PRODUCT_REVISION)", do you need to 'git fetch' it?)
endif
endif
endif
export PRODUCT_REVISION GIT_REF ALLOW_DIRTY PACKAGE_SOURCE_ID
# REQ_TOOLS detects availability of a set of tools, and optionally auto-installs them.
define REQ_TOOLS
GROUP_NAME := $(1)
INSTALL_TOOL := $(2)
INSTALL_COMMAND := $(3)
TOOLS := $(4)
TOOL_INSTALL_LOG := $(REPO_ROOT)/$(CACHE_ROOT)/tool-install-$$(GROUP_NAME).log
_ := $$(shell mkdir -p $$(dir $$(TOOL_INSTALL_LOG)))
INSTALL_TOOL_AVAILABLE := $$(shell command -v $$(INSTALL_TOOL) > /dev/null 2>&1 && echo YES)
ATTEMPT_AUTO_INSTALL := NO
ifeq ($$(INSTALL_TOOL_AVAILABLE),YES)
ifeq ($$(AUTO_INSTALL_TOOLS),YES)
ATTEMPT_AUTO_INSTALL := YES
endif
endif
MISSING_PACKAGES := $$(shell \
for T in $$(TOOLS); do \
BIN=$$$$(echo $$$$T | cut -d':' -f1); \
if ! command -v $$$$BIN > /dev/null 2>&1; then \
echo $$$$T | cut -d':' -f2; \
fi; \
done | sort | uniq)
ifneq ($$(MISSING_PACKAGES),)
ifneq ($$(ATTEMPT_AUTO_INSTALL),YES)
$$(error You are missing required tools, please run '$$(INSTALL_COMMAND) $$(MISSING_PACKAGES)'.)
else
RESULT := $$(shell $$(INSTALL_COMMAND) $$(MISSING_PACKAGES) && echo OK > $$(TOOL_INSTALL_LOG))
ifneq ($$(shell cat $$(TOOL_INSTALL_LOG)),OK)
$$(info Failed to auto-install packages with command $$(INSTALL_COMMAND) $$(MISSING_PACKAGES))
$$(error $$(shell cat $$(TOOL_INSTALL_LOG)))
else
$$(info $$(TOOL_INSTALL_LOG))
$$(info Installed $$(GROUP_NAME) tools successfully.)
endif
endif
endif
endef
ifeq ($(shell uname),Darwin)
# On Mac, try to install things with homebrew.
BREW_TOOLS := gln:coreutils gtouch:coreutils gstat:coreutils \
gtar:gnu-tar gfind:findutils jq:jq yq:python-yq
$(eval $(call REQ_TOOLS,brew,brew,brew install,$(BREW_TOOLS)))
else
# If not mac, try to install using apt.
APT_TOOLS := pip3:python3-pip jq:jq column:bsdmainutils
$(eval $(call REQ_TOOLS,apt,apt-get,sudo apt-get update && sudo apt-get install -y,$(APT_TOOLS)))
PIP_TOOLS := yq:yq
$(eval $(call REQ_TOOLS,pip,pip3,pip3 install,$(PIP_TOOLS)))
endif
# We rely on GNU touch, tar and ln.
# On macOS, we assume they are installed as gtouch, gtar, gln by homebrew.
ifeq ($(shell uname),Darwin)
TOUCH := gtouch
TAR := gtar
LN := gln
STAT := gstat
FIND := gfind
else
TOUCH := touch
TAR := tar
LN := ln
STAT := stat
FIND := find
endif
# Read config from the spec.
# PRODUCT_REPO is the official Git repo for this project.
PRODUCT_REPO := $(shell $(call QUERY_SPEC,.config["product-repo"]))
# PRODUCT_REPO_LOCAL is the local clone of this git repo.
PRODUCT_REPO_LOCAL := $(REPO_ROOT)
# RELEASE_REPO is the release repository for this project.
PRODUCT_RELEASE_REPO := $(shell $(call QUERY_SPEC,.config["release-repo"]))
# PRODUCT_PATH must be unique for every repo.
# A golang-style package path is ideal.
PRODUCT_PATH := $(shell $(call QUERY_SPEC,.config["product-id"]))
# PRODUCT_CIRCLECI_SLUG is the slug of this repo's CircleCI project.
PRODUCT_CIRCLECI_SLUG := $(shell $(call QUERY_SPEC,.config["circleci-project-slug"]))
# PRODUCT_CIRCLECI_HOST is the host configured to build this repo.
PRODUCT_CIRCLECI_HOST := $(shell $(call QUERY_SPEC,.config["circleci-host"]))
# End including config once only.
endif

340
packages-oss.lock/layer.mk generated Executable file
View File

@ -0,0 +1,340 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
# layer.mk contains the machinery to incrementally build the builder image
# as separate layers, so each can be cached both locally and in CI. This serves
# both to speed up builds by avoiding unnecessary repetition of work already done,
# as well as to ehnance the reliability of builds by downloading external
# dependencies only once per build when necessary.
#
# The build layers themselves can be individually exported as tarballs (by calling
# make <layer-name>-save) for later inspection, for sharing, or for implementing
# on-host caching without recourse to external docker registries.
#
# To use this file, include it in another makefile, and from there you must eval
# calls to the LAYER macro with this syntax:
#
# $(eval $(call LAYER,<name>,<type>,<parent-name>,<source-include>,<source-exclude>))
#
# Each layer assumes the existence of a Dockerfile named <name>.Dockerfile in
# packages.lock/layers.
# It uses the <parent-name> to set a Docker build arg called BASE_IMAGE to the
# resultant docker image ref of the named parent layer. You should use this BASE_IMAGE
# in the FROM line in your image.
#
# There must also be a base image which has no parent, and that Dockerfile should
# use a FROM line from an explicit docker image, e.g. debian:buster.
#
# Each image is provided only the source code identified by <source-include>, minus
# any source code matched by <source-exclude>. Source code is any files which are
# present and not ignored by Git. This includes cached files, modified files and new,
# untracked files. The Dockerfile belonging to this layer is ALWAYS included in the
# source, so you don't need to manually specify that.
#
# The set of source code identified by a single image layer is used to produce its
# SOURCE_ID. The SOURCE_ID, when all the files are tracked by Git and are not modified
# equals the latest Git commit SHA that affected any of those files or directories.
# When there are any new or modified files, we take a SHA 256 sum of the latest Git
# commit affecting those files concatenated with the output of git diff and the contents
# of any untracked files, and prefix this with "dirty_". The SOURCE_ID is used as part of
# the cache key for that layer.
#
# Because different combinations of source-include and source-exclude may have been
# modified by the same commit, they may share the same source ID. Therefore, we also
# calculate the LAYER_ID which takes into account not only the current layer's source
# ID, but also its source include/exclude and the ID of its base layer. Thus any change
# in any of the inputs of any base layer invalidates the cache of all subsequent layers.
include $(shell git rev-parse --show-toplevel)/packages*.lock/config.mk
.SECONDARY:
DOCKERFILES_DIR := $(LOCKDIR)/layers
_ := $(shell mkdir -p $(CACHE_ROOT)/source-archives)
### END BUILDER IMAGE LAYERS
## LAYER
# The LAYER macro defines all the targets for each image defined above.
#
# The phony targets are the ones we typically run ourselves or in CI, they are:
#
# <name>-debug : dump debug info for this image layer
# <name>-image : build the image for this image layer
# <name>-save : save the docker image for this layer as a tar.gz
# <name>-load : load this image from the saved tar.gz
define LAYER
LAYERS += $(1)
$(1)_NAME := $(1)
$(1)_TYPE := $(2)
$(1)_BASE := $(3)
$(1)_SOURCE_INCLUDE := $(4)
$(1)_SOURCE_EXCLUDE := $(sort $(5) $(ALWAYS_EXCLUDE_SOURCE))
$(1)_CACHE_KEY_FILE := $(REPO_ROOT)/$(6)
$(1)_IMAGE_ARCHIVE := $(REPO_ROOT)/$(7)
$(1)_CACHE_ROOT := $(CACHE_ROOT)/layers/$$($(1)_NAME)
ifneq ($$($(1)_BASE),)
$(1)_BASE_CACHE_ROOT := $(CACHE_ROOT)/layers/$$($(1)_BASE)
$(1)_BASE_ID_FILE := $$($(1)_BASE_CACHE_ROOT)/current-layer-id
$(1)_BASE_LAYER_ID := $$(shell cat $$($(1)_BASE_ID_FILE))
$(1)_BASE_CACHE := $$($(1)_BASE_CACHE_ROOT)/$$($(1)_BASE_LAYER_ID)
$(1)_BASE_IMAGE := $$($(1)_BASE_CACHE)/image.marker
$(1)_BASE_IMAGE_NAME = $$(shell cat $$($(1)_BASE_IMAGE))
endif
$(1)_DOCKERFILE := $(DOCKERFILES_DIR)/$$($(1)_NAME).Dockerfile
# If no source is included, set source ID to none.
# Note that we include the checksum of the generated Dockerfile as part of cache IDs
# so we still invalidate the cache appropriately.
ifeq ($$($(1)_SOURCE_INCLUDE),)
$(1)_SOURCE_CMD := echo ""
$(1)_SOURCE_ID := packagespec-only-$$($(1)_NAME)
$(1)_SOURCE_ID_NICE_NAME := <packagespec-only>
else
$(1)_SOURCE_GIT = $$($(1)_SOURCE_INCLUDE) $$(call GIT_EXCLUDE_LIST,$$($(1)_SOURCE_EXCLUDE))
$(1)_SOURCE_COMMIT := $$(shell git rev-list -n1 $(GIT_REF) -- $$($(1)_SOURCE_GIT))
# If we allow dirty builds, generate the source ID as a function of the
# source in in the current work tree. Where the source all happens to match a Git commit,
# that commit's SHA will be the source ID.
ifeq ($(ALLOW_DIRTY),YES)
$(1)_SOURCE_CMD := { { \
git ls-files -- $$($(1)_SOURCE_GIT); \
git ls-files -m --exclude-standard -- $$($(1)_SOURCE_GIT); \
} | sort | uniq; }
$(1)_SOURCE_MODIFIED := $$(trim $$(shell git ls-files -m -- $$($(1)_SOURCE_GIT)))
$(1)_SOURCE_MODIFIED_SUM := $$(trim $$(shell git diff -- $$($(1)_SOURCE_GIT) | $(SUM)))
$(1)_SOURCE_NEW := $$(trim $$(shell git ls-files -o --exclude-standard -- $$($(1)_SOURCE_GIT)))
$(1)_SOURCE_NEW_SUM := $$(trim $$(shell git ls-files -o --exclude-standard -- $$($(1)_SOURCE_GIT) | $(SUM)))
$(1)_SOURCE_DIRTY := $$(trim $$(shell if [ -z "$$($(1)_SOURCE_MODIFIED)" ] && [ -z "$$($(1)_SOURCE_NEW)" ]; then echo NO; else echo YES; fi))
$(1)_SOURCE_ID := $$(shell if [ -z "$$($(1)_SOURCE_MODIFIED)" ] && [ -z "$$($(1)_SOURCE_NEW)" ]; then \
echo $$($(1)_SOURCE_COMMIT); \
else \
echo -n dirty_; echo $$($(1)_SOURCE_MODIFIED_SUM) $$($(1)_SOURCE_NEW_SUM) | $(SUM); \
fi)
$(1)_SOURCE_DIRTY_LIST := $$($(1)_SOURCE_MODIFIED) $$($(1)_SOOURCE_NEW)
$(1)_SOURCE_ID_NICE_NAME := $$($(1)_SOURCE_ID)
# No dirty builds allowed, so the SOURCE_ID is the git commit SHA,
# and we list files using git ls-tree.
else
$(1)_SOURCE_ID := $$($(1)_SOURCE_COMMIT)
$(1)_SOURCE_ID_NICE_NAME := $$($(1)_SOURCE_ID)
$(1)_SOURCE_CMD := git ls-tree -r --name-only $(GIT_REF) -- $$($(1)_SOURCE_GIT)
endif
endif
# LAYER_ID_CONTENTS dictates all the fields that can cause cache invalidation
# to propagate from the current layer to all dependent layers.
define $(1)_LAYER_ID_CONTENTS
BASE_LAYER_ID=$$($(1)_BASE_LAYER_ID);
LAYER_NAME=$$($(1)_NAME);
SOURCE_ID=$$($(1)_SOURCE_ID);
SOURCE_INCLUDE=$$($(1)_SOURCE_INCLUDE);
SOURCE_EXCLUDE=$$($(1)_SOURCE_EXCLUDE);
endef
$(1)_LAYER_ID_CONTENTS_FILE := $$($(1)_CACHE_ROOT)/current-layer-id-contents
$(1)_LAYER_ID_FILE := $$($(1)_CACHE_ROOT)/current-layer-id
# Create cache root dir and write LAYER_ID_FILE_CONTENTS file.
_ := $$(shell \
mkdir -p $$($(1)_CACHE_ROOT); \
echo "$$($(1)_LAYER_ID_CONTENTS)" > $$($(1)_LAYER_ID_CONTENTS_FILE); \
)
$(1)_LAYER_ID := $$(shell cat $$($(1)_LAYER_ID_CONTENTS_FILE) | $(SUM))
$(1)_SOURCE_ARCHIVE := $(CACHE_ROOT)/source-archives/$$($(1)_TYPE)-$$($(1)_LAYER_ID).tar
$(1)_IMAGE_NAME := $(BUILDER_IMAGE_PREFIX)-$$($(1)_NAME):$$($(1)_LAYER_ID)
$(1)_CACHE := $(CACHE_ROOT)/layers/$$($(1)_NAME)/$$($(1)_LAYER_ID)
# Create cache dir and write Layer ID file.
_ := $$(shell \
mkdir -p $$($(1)_CACHE); \
echo $$($(1)_LAYER_ID) > $$($(1)_LAYER_ID_FILE); \
)
$(1)_PHONY_TARGET_NAMES := debug id image save load
$(1)_PHONY_TARGETS := $$(addprefix $$($(1)_NAME)-,$$($(1)_PHONY_TARGET_NAMES))
.PHONY: $$($(1)_PHONY_TARGETS)
# File targets.
$(1)_IMAGE := $$($(1)_CACHE)/image.marker
$(1)_LAYER_REFS := $$($(1)_CACHE)/image.layer_refs
$(1)_IMAGE_TIMESTAMP := $$($(1)_CACHE)/image.created_time
$(1)_TARGETS = $$($(1)_PHONY_TARGETS)
# UPDATE_MARKER_FILE ensures the image marker file has the same timestamp as the
# docker image creation date it represents. This enables make to only rebuild it when
# it has really changed, especially after loading the image from an archive.
# It also writes a list of all the layers in this docker image's history, for use
# when saving layers out to archives for use in pre-populating Docker build caches.
define $(1)_UPDATE_MARKER_FILE
export MARKER=$$($(1)_IMAGE); \
export LAYER_REFS=$$($(1)_LAYER_REFS); \
export IMAGE=$$($(1)_IMAGE_NAME); \
export IMAGE_CREATED; \
if ! { IMAGE_CREATED="$$$$(docker inspect -f '{{.Created}}' $$$$IMAGE 2>/dev/null)"; }; then \
if [ -f "$$$$MARKER" ]; then \
echo "==> Removing stale marker file for $$$$IMAGE" 1>&2; \
rm -f $$$$MARKER; \
fi; \
exit 0; \
fi; \
if [ ! -f "$$$$MARKER" ]; then \
echo "==> Writing marker file for $$$$IMAGE (created $$$$IMAGE_CREATED)" 1>&2; \
fi; \
echo $$$$IMAGE > $$$$MARKER; \
$(TOUCH) -m -d $$$$IMAGE_CREATED $$$$MARKER; \
echo "$$$$IMAGE" > $$$$LAYER_REFS; \
docker history --no-trunc -q $$$$IMAGE | grep -Fv '<missing>' >> $$$$LAYER_REFS;
endef
## PHONY targets
$(1)-debug:
@echo "==> Debug info: $$($(1)_NAME) depends on $$($(1)_BASE)"
@echo "$(1)_TARGETS = $$($(1)_TARGETS)"
@echo "$(1)_SOURCE_CMD = $$($(1)_SOURCE_CMD)"
@echo "$(1)_CACHE = $$($(1)_CACHE)"
@echo "$(1)_DOCKERFILE = $$($(1)_DOCKERFILE)"
@echo "$(1)_SOURCE_COMMIT = $$($(1)_SOURCE_COMMIT)"
@echo "$(1)_SOURCE_ID = $$($(1)_SOURCE_ID)"
@echo "$(1)_SOURCE_MODIFIED = $$($(1)_SOURCE_MODIFIED)"
@echo "$(1)_SOURCE_DIRTY = $$($(1)_SOURCE_DIRTY)"
@echo "$(1)_SOURCE_NEW = $$($(1)_SOURCE_NEW)"
@echo "$(1)_IMAGE = $$($(1)_IMAGE)"
@echo "$(1)_IMAGE_TIMESTAMP = $$($(1)_IMAGE_TIMESTAMP)"
@echo "$(1)_IMAGE_ARCHIVE = $$($(1)_IMAGE_ARCHIVE)"
@echo "$(1)_BASE_IMAGE = $$($(1)_BASE_IMAGE)"
@echo
$(1)-id:
@echo $(1)-$$($(1)_SOURCE_ID)
$(1)-write-cache-key:
@mkdir -p $$(dir $$($(1)_CACHE_KEY_FILE)); \
cp $$($(1)_LAYER_ID_CONTENTS_FILE) $$($(1)_CACHE_KEY_FILE); \
echo "==> Cache key for $(1) written to $$($(1)_CACHE_KEY_FILE)"; \
cat $$($(1)_CACHE_KEY_FILE)
$(1)-image: $$($(1)_IMAGE)
@cat $$<
$(1)-layer-refs: $$($(1)_LAYER_REFS)
@echo $$<
$(1)-save: $$($(1)_IMAGE_ARCHIVE)
@echo $$<
$(1)-load:
@\
ARCHIVE=$$($(1)_IMAGE_ARCHIVE); \
IMAGE=$$($(1)_IMAGE_NAME); \
MARKER=$$($(1)_IMAGE); \
rm -f $$$$MARKER; \
echo "==> Loading $$$$IMAGE image from $$$$ARCHIVE"; \
docker load < $$$$ARCHIVE
@$$(call $(1)_UPDATE_MARKER_FILE)
## END PHONY targets
# Set the BASE_IMAGE build arg to reference the appropriate base image,
# unless there is no referenced base image.
$(1)_DOCKER_BUILD_ARGS = $$(shell [ -z "$$($(1)_BASE)" ] || echo --build-arg BASE_IMAGE=$$$$(cat $$($(1)_BASE_IMAGE)))
$(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE := $$($(1)_CACHE)/source-archive.tar
# Build the docker image.
#
# For dirty builds, tar up a source archive from the local filesystem.
# We --ignore-failed-read so that deleted files that are not
# committed do not cause problems. This should be OK for dirty builds.
#
# For non-dirty builds, ask Git directly for a source archive.
#
# We explicitly set the TAR format to ustar because this seems more compatible
# with Docker than any other format. In future we should change this to POSIX
# once Docker supports that properly, because ustar only supports filenames
# < 256 chars which could eventually be an issue.
TAR_FORMAT := --format=ustar
$(1)_FULL_DOCKER_BUILD_COMMAND = docker build -t $$($(1)_IMAGE_NAME) $$($(1)_DOCKER_BUILD_ARGS) \
-f $$($(1)_DOCKERFILE) - < $$($(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE)
$$($(1)_IMAGE): $$($(1)_BASE_IMAGE)
@$$(call $(1)_UPDATE_MARKER_FILE)
@if [ -f "$$@" ]; then exit 0; fi; \
echo "==> Building Docker image $$($(1)_IMAGE_NAME)"; \
echo " Layer name : $$($(1)_NAME)"; \
echo " Layer source ID : $$($(1)_SOURCE_ID_NICE_NAME)"; \
echo " For product revision : $(PRODUCT_REVISION_NICE_NAME)"; \
echo " For package source ID : $(PACKAGE_SOURCE_ID)"; \
if [ ! -f "$$($(1)_SOURCE_ARCHIVE)" ]; then \
if [ "$(ALLOW_DIRTY)" = "YES" ]; then \
echo "==> Building source archive from working directory: $$($(1)_SOURCE_ARCHIVE)" 1>&2; \
$$($(1)_SOURCE_CMD) | $(TAR) --create $(TAR_FORMAT) --file $$($(1)_SOURCE_ARCHIVE) --ignore-failed-read -T -; \
else \
echo "==> Building source archive from git: $$($(1)_SOURCE_ARCHIVE)" 1>&2; \
git archive --format=tar $(GIT_REF) $$($(1)_SOURCE_GIT) > $$($(1)_SOURCE_ARCHIVE); \
fi; \
fi; \
if [ ! -f "$$($(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE)" ]; then \
echo "==> Appending Dockerfile to source archive: $$($(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE)" 1>&2; \
cp $$($(1)_SOURCE_ARCHIVE) $$($(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE); \
$(TAR) --append $(TAR_FORMAT) $$($(1)_DOCKERFILE) --file $$($(1)_SOURCE_ARCHIVE_WITH_DOCKERFILE); \
fi; \
echo $$($(1)_FULL_DOCKER_BUILD_COMMAND); \
$$($(1)_FULL_DOCKER_BUILD_COMMAND); \
$$(call $(1)_UPDATE_MARKER_FILE)
# Save the docker image as a tar.gz.
$$($(1)_IMAGE_ARCHIVE): | $$($(1)_IMAGE)
@mkdir -p $$(dir $$@); \
IMAGE=$$$$(cat $$($(1)_IMAGE)); \
echo "==> Saving $(1) image to $$@"; \
docker save $$$$IMAGE \
$$$$(docker history -q --no-trunc $$$$IMAGE | grep -v missing) \
| gzip > $$@
$$($(1)_LAYER_REFS):
@echo "$$($(1)_IMAGE_NAME)" > $$@
@docker history --no-trunc -q $$($(1)_IMAGE_NAME) | grep -Fv '<missing>' >> $$@
endef
### END LAYER
# Include the generated instructions to build each layer.
include $(sort $(shell find $(DOCKERFILES_DIR) -name '*.mk'))
# Eagerly update the docker image marker files.
_ := $(foreach L,$(LAYERS),$(shell $(call $(L)_UPDATE_MARKER_FILE)))
# DOCKER_LAYER_LIST is used to dump the name of every docker ref in use
# by all of the current builder images. By running 'docker save' against
# this list, we end up with a tarball that can pre-populate the docker
# cache to avoid unnecessary rebuilds.
DOCKER_LAYER_LIST := $(CACHE_ROOT)/docker-layer-list
write-cache-keys: $(addsuffix -write-cache-key,$(LAYERS))
@echo "==> All cache keys written."
build-all-layers: $(addsuffix -image,$(LAYERS))
@echo "==> All builder layers built."
.PHONY: debug
debug: $(addsuffix -debug,$(LAYERS))

View File

@ -0,0 +1,16 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
FROM debian@sha256:68f4e2259032a4e6f5035804e64438b52af8dd5889528b305b9059183ea4cd2a
COPY . ./
RUN apt-get update -y && apt-get install --no-install-recommends -y -q \
curl \
zip \
build-essential \
gcc-multilib \
g++-multilib \
ca-certificates \
git mercurial bzr \
gnupg \
libltdl-dev \
libltdl7 \
bash \
&& rm -rf /var/lib/apt/lists/*

View File

@ -0,0 +1,10 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOPATH /gopath
ENV GOROOT /goroot
RUN mkdir $GOROOT && mkdir $GOPATH
RUN curl https://storage.googleapis.com/golang/go1.14.7.linux-amd64.tar.gz \
| tar xzf - -C $GOROOT --strip-components=1
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH

View File

@ -0,0 +1,10 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GO111MODULE=off
RUN go get golang.org/x/tools/cmd/goimports
RUN go get github.com/hashicorp/go-bindata
RUN go get github.com/hashicorp/go-bindata/go-bindata
RUN go get github.com/elazarl/go-bindata-assetfs
RUN go get github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs

View File

@ -0,0 +1,8 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV REPO=github.com/hashicorp/vault
ENV DIR=$GOPATH/src/$REPO
RUN mkdir -p $DIR
WORKDIR $DIR

View File

@ -0,0 +1,9 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -y && apt-get install -y -q nodejs yarn=1.19.1-1 \
&& rm -rf /var/lib/apt/lists/*

View File

@ -0,0 +1,6 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
RUN cd ui && yarn install
RUN cd ui && npm rebuild node-sass

View File

@ -0,0 +1,5 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
RUN cd ui && yarn run build

View File

@ -0,0 +1,7 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
RUN go-bindata-assetfs -o bindata_assetfs.go -pkg http -prefix pkg -modtime 1480000000 -tags ui ./pkg/web_ui/...
RUN mkdir -p http && mv bindata_assetfs.go http/
RUN goimports -w http/bindata_assetfs.go

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=freebsd
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=linux
ENV GOARCH=arm
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=freebsd
ENV GOARCH=arm
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=darwin
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=linux
ENV GOARCH=arm64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=windows
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=netbsd
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=freebsd
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=linux
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=linux
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=openbsd
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=windows
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=netbsd
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=solaris
ENV GOARCH=amd64
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=openbsd
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,14 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./
ENV GOOS=darwin
ENV GOARCH=386
ENV CGO_ENABLED=0
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}' ./vendor/... | grep -v ERROR | xargs go build -v || true

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

View File

@ -0,0 +1,4 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
ARG BASE_IMAGE
FROM $BASE_IMAGE
COPY . ./

361
packages-oss.lock/layers/layers.mk generated Executable file
View File

@ -0,0 +1,361 @@
# WARNING: Do not EDIT or MERGE this file, it is generated by 'packagespec lock'.
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_ID := 00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_TYPE := base
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_BASE_LAYER :=
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_SOURCE_INCLUDE :=
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_SOURCE_EXCLUDE :=
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_CACHE_KEY_FILE := .buildcache/cache-keys/base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9
LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_ARCHIVE_FILE := .buildcache/archives/00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9.tar.gz
$(eval $(call LAYER,$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_ID),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_TYPE),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_BASE_LAYER),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_SOURCE_INCLUDE),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_SOURCE_EXCLUDE),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_CACHE_KEY_FILE),$(LAYER_00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9_ARCHIVE_FILE)))
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_ID := 01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_TYPE := install-go
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_BASE_LAYER := 00-base-a1d961bcff31b1cdadaa9422452ba72d8b4a85a9
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_SOURCE_INCLUDE :=
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_SOURCE_EXCLUDE :=
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_CACHE_KEY_FILE := .buildcache/cache-keys/install-go-df55de749899e75ed655c4eab8cb2c22f1028590
LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_ARCHIVE_FILE := .buildcache/archives/01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590.tar.gz
$(eval $(call LAYER,$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_ID),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_TYPE),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_BASE_LAYER),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_SOURCE_INCLUDE),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_SOURCE_EXCLUDE),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_CACHE_KEY_FILE),$(LAYER_01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590_ARCHIVE_FILE)))
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_ID := 02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_TYPE := install-go-tools
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_BASE_LAYER := 01-install-go-df55de749899e75ed655c4eab8cb2c22f1028590
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_SOURCE_INCLUDE :=
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_SOURCE_EXCLUDE :=
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_CACHE_KEY_FILE := .buildcache/cache-keys/install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e
LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_ARCHIVE_FILE := .buildcache/archives/02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e.tar.gz
$(eval $(call LAYER,$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_ID),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_TYPE),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_BASE_LAYER),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_SOURCE_INCLUDE),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_SOURCE_EXCLUDE),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_CACHE_KEY_FILE),$(LAYER_02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e_ARCHIVE_FILE)))
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_ID := 03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_TYPE := set-workdir
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_BASE_LAYER := 02-install-go-tools-b7a0056ff8c7f40e047993ec4b1c0a6eab3ab44e
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_SOURCE_INCLUDE :=
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_SOURCE_EXCLUDE :=
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_CACHE_KEY_FILE := .buildcache/cache-keys/set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049
LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_ARCHIVE_FILE := .buildcache/archives/03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049.tar.gz
$(eval $(call LAYER,$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_ID),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_TYPE),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_BASE_LAYER),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_SOURCE_INCLUDE),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_SOURCE_EXCLUDE),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_CACHE_KEY_FILE),$(LAYER_03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049_ARCHIVE_FILE)))
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_ID := 04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_TYPE := install-yarn
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_BASE_LAYER := 03-set-workdir-8253e91d0841cdc71fb0416f84f9eaa52bea9049
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_SOURCE_INCLUDE :=
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_SOURCE_EXCLUDE :=
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_CACHE_KEY_FILE := .buildcache/cache-keys/install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319
LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_ARCHIVE_FILE := .buildcache/archives/04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319.tar.gz
$(eval $(call LAYER,$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_ID),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_TYPE),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_BASE_LAYER),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_SOURCE_INCLUDE),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_SOURCE_EXCLUDE),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_CACHE_KEY_FILE),$(LAYER_04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319_ARCHIVE_FILE)))
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_ID := 05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_TYPE := ui-dependencies
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_BASE_LAYER := 04-install-yarn-aab71c56a60048647c1c6c4a7fd5649aee7f2319
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_SOURCE_INCLUDE := ui/package.json ui/yarn.lock
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_SOURCE_EXCLUDE :=
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_CACHE_KEY_FILE := .buildcache/cache-keys/ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81
LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_ARCHIVE_FILE := .buildcache/archives/05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81.tar.gz
$(eval $(call LAYER,$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_ID),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_TYPE),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_BASE_LAYER),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_SOURCE_INCLUDE),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_SOURCE_EXCLUDE),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_CACHE_KEY_FILE),$(LAYER_05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81_ARCHIVE_FILE)))
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_ID := 06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_TYPE := build-ui
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_BASE_LAYER := 05-ui-dependencies-58f2ea77b8fe39e82bb587e5246d1b62f9a7cb81
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_SOURCE_INCLUDE := ui/
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_SOURCE_EXCLUDE :=
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_CACHE_KEY_FILE := .buildcache/cache-keys/build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b
LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_ARCHIVE_FILE := .buildcache/archives/06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b.tar.gz
$(eval $(call LAYER,$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_ID),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_TYPE),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_BASE_LAYER),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_SOURCE_INCLUDE),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_SOURCE_EXCLUDE),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_CACHE_KEY_FILE),$(LAYER_06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b_ARCHIVE_FILE)))
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_ID := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_TYPE := build-static-assets
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_BASE_LAYER := 06-build-ui-5659d3f1f758c2f3a4c5fca4c1fcbaac3720693b
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_SOURCE_INCLUDE := Makefile
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_SOURCE_EXCLUDE :=
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_CACHE_KEY_FILE := .buildcache/cache-keys/build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_ARCHIVE_FILE := .buildcache/archives/07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e.tar.gz
$(eval $(call LAYER,$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_ID),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_TYPE),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_BASE_LAYER),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_SOURCE_INCLUDE),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_SOURCE_EXCLUDE),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_CACHE_KEY_FILE),$(LAYER_07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_ID := 08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1
LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_ID),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_TYPE),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_ID := 08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8
LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_ID),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_TYPE),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_ID := 08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e
LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_ID),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_TYPE),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_ID := 08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7
LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_ID),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_TYPE),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_ID := 08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15
LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_ID),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_TYPE),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_ID := 08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e
LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_ID),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_TYPE),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_ID := 08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a
LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_ID),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_TYPE),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_ID := 08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4
LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_ID),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_TYPE),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_ID := 08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c
LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_ID),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_TYPE),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_ID := 08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1
LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_ID),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_TYPE),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_ID := 08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293
LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_ID),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_TYPE),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_ID := 08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400
LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_ID),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_TYPE),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_ID := 08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa
LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_ID),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_TYPE),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_ID := 08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998
LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_ID),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_TYPE),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_ID := 08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902
LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_ID),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_TYPE),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902_ARCHIVE_FILE)))
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_ID := 08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_TYPE := warm-go-build-vendor-cache
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_BASE_LAYER := 07-build-static-assets-33a6e8f0029b730ae0a37427888d22c992a0824e
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_SOURCE_INCLUDE := vendor/
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_SOURCE_EXCLUDE :=
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_CACHE_KEY_FILE := .buildcache/cache-keys/warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607
LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_ARCHIVE_FILE := .buildcache/archives/08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607.tar.gz
$(eval $(call LAYER,$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_ID),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_TYPE),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_BASE_LAYER),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_SOURCE_INCLUDE),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_SOURCE_EXCLUDE),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_CACHE_KEY_FILE),$(LAYER_08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607_ARCHIVE_FILE)))
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_ID := 09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_TYPE := copy-source
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_BASE_LAYER := 08-warm-go-build-vendor-cache-92c62793dfcc5b64255bfe2356532882a7d7b3aa
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_SOURCE_INCLUDE := .
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1
LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_ARCHIVE_FILE := .buildcache/archives/09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_ID),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_TYPE),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_BASE_LAYER),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_SOURCE_INCLUDE),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_SOURCE_EXCLUDE),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_CACHE_KEY_FILE),$(LAYER_09-copy-source-18193d6bd814c6d4efbbc07eacb02c69434894e1_ARCHIVE_FILE)))
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_ID := 09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_TYPE := copy-source
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_BASE_LAYER := 08-warm-go-build-vendor-cache-487f59a5948b3519a6a17192f127e67b01b0fb6e
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_SOURCE_INCLUDE := .
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb
LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_ARCHIVE_FILE := .buildcache/archives/09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_ID),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_TYPE),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_BASE_LAYER),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_SOURCE_INCLUDE),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_SOURCE_EXCLUDE),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_CACHE_KEY_FILE),$(LAYER_09-copy-source-226d84bde56c14526d6fce9bec6a47a9bef01ecb_ARCHIVE_FILE)))
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_ID := 09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_TYPE := copy-source
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_BASE_LAYER := 08-warm-go-build-vendor-cache-0ae71d132fc340d89dec170f4164e4eed2cab17e
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_SOURCE_INCLUDE := .
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-28b442b0f8382760addf43d2e9d4457f81e18592
LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_ARCHIVE_FILE := .buildcache/archives/09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_ID),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_TYPE),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_BASE_LAYER),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_SOURCE_INCLUDE),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_SOURCE_EXCLUDE),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_CACHE_KEY_FILE),$(LAYER_09-copy-source-28b442b0f8382760addf43d2e9d4457f81e18592_ARCHIVE_FILE)))
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_ID := 09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_TYPE := copy-source
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_BASE_LAYER := 08-warm-go-build-vendor-cache-7d95ca17ed2ed063335c6fdfe31177f9d88dc293
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_SOURCE_INCLUDE := .
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716
LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_ARCHIVE_FILE := .buildcache/archives/09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_ID),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_TYPE),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_BASE_LAYER),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_SOURCE_INCLUDE),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_SOURCE_EXCLUDE),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_CACHE_KEY_FILE),$(LAYER_09-copy-source-349c919c8e22d66bcd624b975da386c3fc5ab716_ARCHIVE_FILE)))
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_ID := 09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_TYPE := copy-source
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_BASE_LAYER := 08-warm-go-build-vendor-cache-4e5f0a9a53d17957205ff9c63cd50d3161af517a
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_SOURCE_INCLUDE := .
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052
LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_ARCHIVE_FILE := .buildcache/archives/09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_ID),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_TYPE),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_BASE_LAYER),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_SOURCE_INCLUDE),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_SOURCE_EXCLUDE),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_CACHE_KEY_FILE),$(LAYER_09-copy-source-390a90074e7186bf31ffb8081efb4bdd47a1d052_ARCHIVE_FILE)))
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_ID := 09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_TYPE := copy-source
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_BASE_LAYER := 08-warm-go-build-vendor-cache-8a055286bfdd3c2b0f3ce25f54f88375384a2400
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_SOURCE_INCLUDE := .
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57
LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_ARCHIVE_FILE := .buildcache/archives/09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_ID),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_TYPE),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_BASE_LAYER),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_SOURCE_INCLUDE),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_SOURCE_EXCLUDE),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_CACHE_KEY_FILE),$(LAYER_09-copy-source-3f890eaccfc0039dc98cdcaa578bb355cfa43a57_ARCHIVE_FILE)))
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_ID := 09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_TYPE := copy-source
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_BASE_LAYER := 08-warm-go-build-vendor-cache-a0884ebd3bcd667787991bce276f3a9be2061998
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_SOURCE_INCLUDE := .
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de
LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_ARCHIVE_FILE := .buildcache/archives/09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_ID),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_TYPE),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_BASE_LAYER),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_SOURCE_INCLUDE),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_SOURCE_EXCLUDE),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_CACHE_KEY_FILE),$(LAYER_09-copy-source-60a56a8f1d39f238d784cb1129f22ccaafe580de_ARCHIVE_FILE)))
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_ID := 09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_TYPE := copy-source
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_BASE_LAYER := 08-warm-go-build-vendor-cache-6f6af7dce883f6e1b09b7c622ff1b527ea5f77f1
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_SOURCE_INCLUDE := .
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-679a76162b839df3b7ee21a5bac42c44533454c8
LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_ARCHIVE_FILE := .buildcache/archives/09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_ID),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_TYPE),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_BASE_LAYER),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_SOURCE_INCLUDE),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_SOURCE_EXCLUDE),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_CACHE_KEY_FILE),$(LAYER_09-copy-source-679a76162b839df3b7ee21a5bac42c44533454c8_ARCHIVE_FILE)))
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_ID := 09-copy-source-8490d401277a4001bbc44b278a91858049d76683
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_TYPE := copy-source
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_BASE_LAYER := 08-warm-go-build-vendor-cache-024e5c62d2ad59cb7a139748ec3571828bc950a8
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_SOURCE_INCLUDE := .
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-8490d401277a4001bbc44b278a91858049d76683
LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_ARCHIVE_FILE := .buildcache/archives/09-copy-source-8490d401277a4001bbc44b278a91858049d76683.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_ID),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_TYPE),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_BASE_LAYER),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_SOURCE_INCLUDE),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_SOURCE_EXCLUDE),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_CACHE_KEY_FILE),$(LAYER_09-copy-source-8490d401277a4001bbc44b278a91858049d76683_ARCHIVE_FILE)))
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_ID := 09-copy-source-93206299230604edb276a2550a83dec3324eb86f
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_TYPE := copy-source
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_BASE_LAYER := 08-warm-go-build-vendor-cache-0245576886d78da53ffbd161a95bd0ca099e5fc1
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_SOURCE_INCLUDE := .
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-93206299230604edb276a2550a83dec3324eb86f
LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_ARCHIVE_FILE := .buildcache/archives/09-copy-source-93206299230604edb276a2550a83dec3324eb86f.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_ID),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_TYPE),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_BASE_LAYER),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_SOURCE_INCLUDE),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_SOURCE_EXCLUDE),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_CACHE_KEY_FILE),$(LAYER_09-copy-source-93206299230604edb276a2550a83dec3324eb86f_ARCHIVE_FILE)))
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_ID := 09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_TYPE := copy-source
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_BASE_LAYER := 08-warm-go-build-vendor-cache-b4bd76934c25a387356bd1fb0e28c95124eef902
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_SOURCE_INCLUDE := .
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044
LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_ARCHIVE_FILE := .buildcache/archives/09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_ID),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_TYPE),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_BASE_LAYER),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_SOURCE_INCLUDE),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_SOURCE_EXCLUDE),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_CACHE_KEY_FILE),$(LAYER_09-copy-source-9e44025163546ef6ed36d41a77b027c8d02ae044_ARCHIVE_FILE)))
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_ID := 09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_TYPE := copy-source
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_BASE_LAYER := 08-warm-go-build-vendor-cache-6876aa566f90846d4627c4a1c86ca155ccde2f1c
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_SOURCE_INCLUDE := .
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-a750ca270a9586283d232f59f62b97733da7d3fb
LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_ARCHIVE_FILE := .buildcache/archives/09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_ID),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_TYPE),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_BASE_LAYER),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_SOURCE_INCLUDE),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_SOURCE_EXCLUDE),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_CACHE_KEY_FILE),$(LAYER_09-copy-source-a750ca270a9586283d232f59f62b97733da7d3fb_ARCHIVE_FILE)))
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_ID := 09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_TYPE := copy-source
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_BASE_LAYER := 08-warm-go-build-vendor-cache-596df758f200592b1270d44ea6a1b934949913f4
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_SOURCE_INCLUDE := .
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f
LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_ARCHIVE_FILE := .buildcache/archives/09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_ID),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_TYPE),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_BASE_LAYER),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_SOURCE_INCLUDE),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_SOURCE_EXCLUDE),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_CACHE_KEY_FILE),$(LAYER_09-copy-source-ac4d6f4024842c4a8e5893d22c0dfff9153ff69f_ARCHIVE_FILE)))
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_ID := 09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_TYPE := copy-source
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_BASE_LAYER := 08-warm-go-build-vendor-cache-e91703d9d7092bb5c13b3569d75ca4bb34511607
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_SOURCE_INCLUDE := .
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60
LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_ARCHIVE_FILE := .buildcache/archives/09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_ID),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_TYPE),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_BASE_LAYER),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_SOURCE_INCLUDE),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_SOURCE_EXCLUDE),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_CACHE_KEY_FILE),$(LAYER_09-copy-source-bfc92f40ed9ac5e09826cc8473f9bf7b7403bd60_ARCHIVE_FILE)))
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_ID := 09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_TYPE := copy-source
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_BASE_LAYER := 08-warm-go-build-vendor-cache-1c18a76adf11382eaf4b84b8403c66cf104174d7
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_SOURCE_INCLUDE := .
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-f4f9d205876325505a719298391e7c233b5a1ac7
LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_ARCHIVE_FILE := .buildcache/archives/09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_ID),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_TYPE),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_BASE_LAYER),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_SOURCE_INCLUDE),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_SOURCE_EXCLUDE),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_CACHE_KEY_FILE),$(LAYER_09-copy-source-f4f9d205876325505a719298391e7c233b5a1ac7_ARCHIVE_FILE)))
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_ID := 09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_TYPE := copy-source
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_BASE_LAYER := 08-warm-go-build-vendor-cache-28637de51e735a2eca5909e5685278b304ac5b15
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_SOURCE_INCLUDE := .
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_SOURCE_EXCLUDE := vendor/ ui/
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_CACHE_KEY_FILE := .buildcache/cache-keys/copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84
LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_ARCHIVE_FILE := .buildcache/archives/09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84.tar.gz
$(eval $(call LAYER,$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_ID),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_TYPE),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_BASE_LAYER),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_SOURCE_INCLUDE),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_SOURCE_EXCLUDE),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_CACHE_KEY_FILE),$(LAYER_09-copy-source-f976e4b1eb1e3dee4cbd089a1b97edc2f63f5d84_ARCHIVE_FILE)))

3278
packages-oss.lock/pkgs.yml generated Normal file

File diff suppressed because it is too large Load Diff

278
packages-oss.yml Normal file
View File

@ -0,0 +1,278 @@
# packages.yml
#
# packages.yml defines all the packages we are able to build for a single commit
# in this repo. A package means a single zip file containing the executable binary,
# and optionally other files if needed.
#
# packages.yml is a convenience file for the human management of large numbers of
# alternate packages, allowing default and templated values. We generate another
# artifact from this one, called packages.lock which contains the fully expanded set
# of package and layer specs. This fully expanded file is in turn used to drive the
# build process, and as data for templating CI config.
# config contains packagespec config for this repo.
config:
# product-repo is important to CI providers.
product-repo: git@github.com:hashicorp/vault.git
release-repo: git@github.com:hashicorp/vault-release.git
# product-id is used by external systems to identify this product.
# It can be any unique name, but a golang import path is ideal.
product-id: github.com/hashicorp/vault
circleci-project-slug: gh/hashicorp/vault
circleci-host: circleci.com
# inputs are a set of environment variables that may affect the set of bytes produced
# for a given package. Note that a package is a zip file containing the binary, so
# the name of the binary does affect the package's bytes.
inputs:
# defaults contains default input values for each package.
# These values may be overridden on a per-package basis in the packages section.
defaults:
# PRODUCT_VERSION is the version of this product. Usually, this should be left
# as 0.0.0-snapshot. When we build a release candidate, this is overridden in
# a one-off fashion to produce that build.
# This should be used in the PACKAGE_NAME template.
PRODUCT_VERSION: 0.0.0-snapshot
# GO_VERSION is the version of the Go toolchain to use to compile this package.
GO_VERSION: 1.14.7
# YARN_VERSION is the version of Yarn to install for the UI layer.
YARN_VERSION: 1.19.1-1
# Standard golang environment variables, passed to the 'go build' command.
# You can use any standard environment variables here, any that you omit
# will be ommitted from the go build command too, meaning to use the system
# default in the build container.
CGO_ENABLED: 0
GO111MODULE: "off"
# templates contain golang template strings. Each of these is rendered per package
# using that packages values (including any default values), and then added to that
# package.
# Note that templates MAY NOT refer to each other, but may refer to any default or
# package-specific inputs.
templates:
# BINARY_NAME is the name of the executable binary we compile and package.
# It is the name users will use on the CLI to invoke the product.
BINARY_NAME: 'vault{{if eq .GOOS "windows"}}.exe{{end}}'
# PRODUCT_VERSION_MMP is just the major.minor.prerelease fields of the PRODUCT_VERSION.
# Think semantic versioning (semver), although we do not version our binaries
# using semver.
PRODUCT_VERSION_MMP: >-
{{with .PRODUCT_VERSION | strings.SplitN "-" 2}}{{index . 0}}{{end}}
# PRODUCT_VERSION_PRE is just the prerelease field of the product version (i.e. the bit
# after any -, if there is one.
PRODUCT_VERSION_PRE: >-
{{with .PRODUCT_VERSION | strings.SplitN "-" 2}}{{if gt (len .) 1}}{{index . 1}}{{else}}"''"{{end}}{{end}}
# build-command is a templated bash script to be run in the final builder container
# to produce the package. It may refer to any of the inputs, including rendered templates,
# but not meta data.
#
# The build command is passed 3 environment variables, in addition to all those specified as inputs.
#
# - PACKAGE_SOURCE_ID The source ID (usually the git commit SHA, unless build is dirty)
# - OUTPUT_DIR Directory to write the executable and zip file to (will exist already)
# - PACKAGE_ZIP_NAME The name of the package zip file to create (relative to OUTPUT_DIR)
#
# NOTE: You MUST NOT use single quotes in the build command, because at present we do no escaping.
build-command: VERSION_PKG_PATH=github.com/hashicorp/vault/vendor/github.com/hashicorp/vault/sdk/version;
go build -v
-ldflags "
-X $VERSION_PKG_PATH.GitCommit=$PACKAGE_SOURCE_ID
-X $VERSION_PKG_PATH.Version={{.PRODUCT_VERSION_MMP}}
-X $VERSION_PKG_PATH.VersionPrerelease={{.PRODUCT_VERSION_PRE}}"
-o $OUTPUT_DIR/{{.BINARY_NAME}}
&& cd $OUTPUT_DIR && zip $PACKAGE_ZIP_NAME {{.BINARY_NAME}}
# packages is the full set of packages we are able to build based on a single commit
# in this repo. Each package is a map where the keys are the names of environment
# variables provided to each build (think 'go build' invocation). Each package is
# expanded by first filling in any unspecified variables with those from defaults,
# and then rendering each template and adding the result to the map.
# Each package must result in a unique PACKAGE_NAME.
#
# The fully expanded set of packages are written to packages.lock. That file
# is a useful data source for building CI/CD pipelines.
packages:
- inputs: { GOOS: darwin, GOARCH: 386 }
- inputs: { GOOS: darwin, GOARCH: amd64 }
- inputs: { GOOS: freebsd, GOARCH: 386 }
- inputs: { GOOS: freebsd, GOARCH: amd64 }
- inputs: { GOOS: freebsd, GOARCH: arm }
- inputs: { GOOS: linux, GOARCH: 386 }
- inputs: { GOOS: linux, GOARCH: amd64 }
- inputs: { GOOS: linux, GOARCH: arm }
- inputs: { GOOS: linux, GOARCH: arm64 }
- inputs: { GOOS: netbsd, GOARCH: 386 }
- inputs: { GOOS: netbsd, GOARCH: amd64 }
- inputs: { GOOS: openbsd, GOARCH: 386 }
- inputs: { GOOS: openbsd, GOARCH: amd64 }
- inputs: { GOOS: solaris, GOARCH: amd64 }
- inputs: { GOOS: windows, GOARCH: 386 }
- inputs: { GOOS: windows, GOARCH: amd64 }
# meta defines additional custom metadata about packages. This metadata does not
# participate in the PACKAGE_SPEC_ID and so changing it does not directly change cache
# keys for layers or packages. In addition, metadata may not be overridden per-package
# and is not available to input or layer dockerfile templates.
meta:
defaults:
# No default metadata.
templates:
# BUILD_JOB_NAME is the name of a job to build this package in CI. Care must be
# taken that it is both unique within this set of packages, as well as compatible
# with the CI system's naming conventions.
BUILD_JOB_NAME: >-
{{.GOOS}}_{{.GOARCH}}_package
# POST_PROCESSORS names post processors we may apply to packages
# later. It is a space separated list of words, with each word
# naming a post-processor to run. These post-processors are not run
# during a build, and the code to run them is not contained in this repo.
# These post processors are run in the order they are specified in.
POST_PROCESSORS: '
{{- if and (eq .GOOS "darwin") (eq .GOARCH "amd64")}}apple-notarize {{end -}}
{{- if and (eq .GOOS "windows") (eq .GOARCH "amd64")}}microsoft-notarize {{end -}}
av-scan'
# BUNDLE_NAME is used in archive filenames, as well as by downstream processes.
BUNDLE_NAME: "vault_{{.PRODUCT_VERSION}}"
# package-aliases are a set of paths by which each package may be known, they are
# templates which may refer to any input or meta field defined in this file.
# Package aliases must be unique across all packages defined in this file.
# If any package-alias renders to empty, it is ignored. You can use this
# to produce aliases selectively depending on the package.
#
# Package aliases count as meta data because they do not affect the bytes produced
# per package.
#
# We use package aliases to give human-readable names to packages, and to arrange
# them in a directory hierarchy ready for further processing and distribution.
# Each alias is written as a relative symbolic link in .buildcache/packages/by-alias.
#
# At least one alias must render to a nonempty string.
package-aliases:
- type: local
template: >-
{{.BUNDLE_NAME}}_{{.GOOS}}_{{.GOARCH}}.zip
# public-hc-releases is the path to use for upload to releases.hashicorp.com
# it is empty if this package is not public (empty aliases are ignored).
- type: public-hc-releases
template: >-
vault/{{.BUNDLE_NAME}}/{{.BUNDLE_NAME}}_{{.GOOS}}_{{.GOARCH}}.zip
# Layers determines the build layers, which are individually cacheable layers
# in a linear build. Each layer contains a Dockerfile. All the layers
# together produce the final builder image used to compile binaries.
#
# The partial Dockerfiles may contain references to any of the inputs
# including rendered input templates, but may not reference meta data.
# These Dockerfiles, once rendered, count as inputs and affect the
# package spec ID of each package.
#
# The order of layers is significant. The first layer must have a FROM line, and
# forms the base image. Each subsequent layer begins from the previous one.
#
# You can control cacheability by careful use of variables and ordering.
# Try to group things which change infrequently towards the top, and
# things which change more frequently towards the bottom.
#
# If there are things you want to cache that vary between packages defined in
# this file, put them last so that the greater bulk of work can be shared.
#
# NOTE: At present, changing the names and/or adding/removing layers may
# require updating the CI template file at .circleci/config/@build-release.yml.tpl
# which references some of these layers by name.
base-image: "debian@sha256:68f4e2259032a4e6f5035804e64438b52af8dd5889528b305b9059183ea4cd2a"
layers:
- name: base
dockerfile: |-
RUN apt-get update -y && apt-get install --no-install-recommends -y -q \
curl \
zip \
build-essential \
gcc-multilib \
g++-multilib \
ca-certificates \
git mercurial bzr \
gnupg \
libltdl-dev \
libltdl7 \
bash \
&& rm -rf /var/lib/apt/lists/*
- name: install-go
dockerfile: |-
ENV GOPATH /gopath
ENV GOROOT /goroot
RUN mkdir $GOROOT && mkdir $GOPATH
RUN curl https://storage.googleapis.com/golang/go{{.GO_VERSION}}.linux-amd64.tar.gz \
| tar xzf - -C $GOROOT --strip-components=1
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH
- name: install-go-tools
dockerfile: |
ENV GO111MODULE=off
RUN go get golang.org/x/tools/cmd/goimports
RUN go get github.com/hashicorp/go-bindata
RUN go get github.com/hashicorp/go-bindata/go-bindata
RUN go get github.com/elazarl/go-bindata-assetfs
RUN go get github.com/elazarl/go-bindata-assetfs/go-bindata-assetfs
- name: set-workdir
dockerfile: |
ENV REPO=github.com/hashicorp/vault
ENV DIR=$GOPATH/src/$REPO
RUN mkdir -p $DIR
WORKDIR $DIR
- name: install-yarn
dockerfile: |-
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -y && apt-get install -y -q nodejs yarn={{.YARN_VERSION}} \
&& rm -rf /var/lib/apt/lists/*
- name: ui-dependencies
source-include: ui/package.json ui/yarn.lock
dockerfile: |-
RUN cd ui && yarn install
RUN cd ui && npm rebuild node-sass
- name: build-ui
source-include: ui/
dockerfile: |-
RUN cd ui && yarn run build
- name: build-static-assets
source-include: Makefile
dockerfile: |-
RUN go-bindata-assetfs -o bindata_assetfs.go -pkg http -prefix pkg -modtime 1480000000 -tags ui ./pkg/web_ui/...
RUN mkdir -p http && mv bindata_assetfs.go http/
RUN goimports -w http/bindata_assetfs.go
# Up to now, the layers do not vary between packages. This means the layers above
# can be built prior to package builds in order to warm the cache and speed up
# builds.
#
# warm-go-build-vendor-cache does vary based on GOOS, GOARCH and CGO_ENABLED though.
# This means we should cache this in CI per package build.
- name: warm-go-build-vendor-cache
source-include: vendor/
dockerfile: |-
ENV GOOS={{.GOOS}}
ENV GOARCH={{.GOARCH}}
ENV CGO_ENABLED={{.CGO_ENABLED}}
# Try to build vendored packages. We first filter out packages which report
# errors in 'go list', because trying to run go build ./vendor/... fails early
# if we include them. We also don't care about the exit code here, because
# some of the vendored packages may fail to build, but this won't necessarily
# mean that the final package will fail to build, and we will still get a
# usefully warmed cache.
RUN go list -f '{{"{{.ImportPath}}{{if or .Error .DepsErrors}} ERROR{{end}}"}}' ./vendor/... | grep -v ERROR | xargs go build -v || true
# The final layer must contain all the source code we've not yet included.
- name: copy-source
source-include: .
source-exclude: vendor/ ui/