mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
This caused the following issues: - Slim binaries weren't being updated. - The coder.tar.ztd was misplaced. - There is no coder.sha1 file with proper filenames. This should be reintroduced in a future change with those fixes.
This commit is contained in:
@@ -1,316 +1,85 @@
|
||||
# This is the Coder Makefile. The build directory for most tasks is `build/`.
|
||||
#
|
||||
# These are the targets you're probably looking for:
|
||||
# - clean
|
||||
# - build-fat: builds all "fat" binaries for all architectures
|
||||
# - build-slim: builds all "slim" binaries (no frontend or slim binaries
|
||||
# embedded) for all architectures
|
||||
# - release: simulate a release (mostly, does not push images)
|
||||
# - build/coder(-slim)?_${os}_${arch}(.exe)?: build a single fat binary
|
||||
# - build/coder_${os}_${arch}.(zip|tar.gz): build a release archive
|
||||
# - build/coder_linux_${arch}.(apk|deb|rpm): build a release Linux package
|
||||
# - build/coder_${version}_linux_${arch}.tag: build a release Linux Docker image
|
||||
# - build/coder_helm.tgz: build a release Helm chart
|
||||
|
||||
.DEFAULT_GOAL := build-fat
|
||||
.DEFAULT_GOAL := build
|
||||
|
||||
# Use a single bash shell for each job, and immediately exit on failure
|
||||
SHELL := bash
|
||||
.SHELLFLAGS := -ceu
|
||||
.SHELLFLAGS = -ceu
|
||||
.ONESHELL:
|
||||
|
||||
# This doesn't work on directories.
|
||||
# See https://stackoverflow.com/questions/25752543/make-delete-on-error-for-directory-targets
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
# Don't print the commands in the file unless you specify VERBOSE. This is
|
||||
# essentially the same as putting "@" at the start of each line.
|
||||
ifndef VERBOSE
|
||||
.SILENT:
|
||||
endif
|
||||
INSTALL_DIR=$(shell go env GOPATH)/bin
|
||||
GOOS=$(shell go env GOOS)
|
||||
GOARCH=$(shell go env GOARCH)
|
||||
VERSION=$(shell ./scripts/version.sh)
|
||||
|
||||
# Create the output directories if they do not exist.
|
||||
$(shell mkdir -p build site/out/bin)
|
||||
bin: $(shell find . -not -path './vendor/*' -type f -name '*.go') go.mod go.sum $(shell find ./examples/templates)
|
||||
@echo "== This builds slim binaries for command-line usage."
|
||||
@echo "== Use \"make build\" to embed the site."
|
||||
|
||||
GOOS := $(shell go env GOOS)
|
||||
GOARCH := $(shell go env GOARCH)
|
||||
GOOS_BIN_EXT := $(if $(filter windows, $(GOOS)),.exe,)
|
||||
VERSION := $(shell ./scripts/version.sh)
|
||||
|
||||
# All ${OS}_${ARCH} combos we build for. Windows binaries have the .exe suffix.
|
||||
OS_ARCHES := \
|
||||
linux_amd64 linux_arm64 linux_armv7 \
|
||||
darwin_amd64 darwin_arm64 \
|
||||
windows_amd64.exe windows_arm64.exe
|
||||
|
||||
# Archive formats and their corresponding ${OS}_${ARCH} combos.
|
||||
ARCHIVE_TAR_GZ := linux_amd64 linux_arm64 linux_armv7
|
||||
ARCHIVE_ZIP := \
|
||||
darwin_amd64 darwin_arm64 \
|
||||
windows_amd64 windows_arm64
|
||||
|
||||
# All package formats we build and the ${OS}_${ARCH} combos we build them for.
|
||||
PACKAGE_FORMATS := apk deb rpm
|
||||
PACKAGE_OS_ARCHES := linux_amd64 linux_armv7 linux_arm64
|
||||
|
||||
# All architectures we build Docker images for (Linux only).
|
||||
DOCKER_ARCHES := amd64 arm64 armv7
|
||||
|
||||
# Computed variables based on the above.
|
||||
CODER_SLIM_BINARIES := $(addprefix build/coder-slim_$(VERSION)_,$(OS_ARCHES))
|
||||
CODER_FAT_BINARIES := $(addprefix build/coder_$(VERSION)_,$(OS_ARCHES))
|
||||
CODER_ALL_BINARIES := $(CODER_SLIM_BINARIES) $(CODER_FAT_BINARIES)
|
||||
CODER_TAR_GZ_ARCHIVES := $(foreach os_arch, $(ARCHIVE_TAR_GZ), build/coder_$(VERSION)_$(os_arch).tar.gz)
|
||||
CODER_ZIP_ARCHIVES := $(foreach os_arch, $(ARCHIVE_ZIP), build/coder_$(VERSION)_$(os_arch).zip)
|
||||
CODER_ALL_ARCHIVES := $(CODER_TAR_GZ_ARCHIVES) $(CODER_ZIP_ARCHIVES)
|
||||
CODER_ALL_PACKAGES := $(foreach os_arch, $(PACKAGE_OS_ARCHES), $(addprefix build/coder_$(VERSION)_$(os_arch).,$(PACKAGE_FORMATS)))
|
||||
CODER_ALL_ARCH_IMAGES := $(foreach arch, $(DOCKER_ARCHES), build/coder_$(VERSION)_linux_$(arch).tag)
|
||||
CODER_ALL_ARCH_IMAGES_PUSHED := $(addprefix push/, $(CODER_ALL_ARCH_IMAGES))
|
||||
CODER_MAIN_IMAGE := build/coder_$(VERSION)_linux.tag
|
||||
CODER_ALL_IMAGES := $(CODER_ALL_ARCH_IMAGES) $(CODER_MAIN_IMAGE)
|
||||
CODER_ALL_IMAGES_PUSHED := $(addprefix push/, $(CODER_ALL_IMAGES))
|
||||
|
||||
CODER_SLIM_NOVERSION_BINARIES := $(addprefix build/coder-slim_,$(OS_ARCHES))
|
||||
CODER_FAT_NOVERSION_BINARIES := $(addprefix build/coder_,$(OS_ARCHES))
|
||||
CODER_ALL_NOVERSION_IMAGES := $(foreach arch, $(DOCKER_ARCHES), build/coder_linux_$(arch).tag) build/coder_linux.tag
|
||||
CODER_ALL_NOVERSION_IMAGES_PUSHED := $(addprefix push/, $(CODER_ALL_NOVERSION_IMAGES))
|
||||
|
||||
|
||||
clean:
|
||||
rm -rf build site/out
|
||||
mkdir -p build site/out/bin
|
||||
git restore site/out
|
||||
.PHONY: clean
|
||||
|
||||
build-slim: $(CODER_SLIM_BINARIES)
|
||||
.PHONY: build-slim
|
||||
|
||||
build-fat build-full build: $(CODER_FAT_BINARIES)
|
||||
.PHONY: build-fat build-full build
|
||||
|
||||
release: $(CODER_FAT_BINARIES) $(CODER_ALL_ARCHIVES) $(CODER_ALL_PACKAGES) $(CODER_ALL_ARCH_IMAGES) build/coder_helm_$(VERSION).tgz
|
||||
.PHONY: release
|
||||
|
||||
build/coder-slim_$(VERSION)_checksums.sha1: $(CODER_SLIM_BINARIES)
|
||||
pushd ./build
|
||||
openssl dgst -r -sha1 coder-slim_"$(VERSION)"_* | tee "$(@F)"
|
||||
popd
|
||||
|
||||
build/coder-slim_$(VERSION).tar: build/coder-slim_$(VERSION)_checksums.sha1 $(CODER_SLIM_BINARIES)
|
||||
pushd ./build
|
||||
tar cf "$(@F)" coder-slim_"$(VERSION)"_*
|
||||
popd
|
||||
|
||||
build/coder-slim_$(VERSION).tar.zst site/out/coder.tar.zst: build/coder-slim_$(VERSION).tar
|
||||
zstd -6 \
|
||||
--force \
|
||||
--ultra \
|
||||
--long \
|
||||
--no-progress \
|
||||
-o "build/coder-slim_$(VERSION).tar.zst" \
|
||||
"build/coder-slim_$(VERSION).tar"
|
||||
|
||||
cp "build/coder-slim_$(VERSION).tar.zst" "site/out/coder.tar.zst"
|
||||
# delete the uncompressed binaries from the embedded dir
|
||||
rm site/out/coder-*
|
||||
|
||||
# Redirect from version-less targets to the versioned ones. There is a similar
|
||||
# target for slim binaries below.
|
||||
#
|
||||
# Called like this:
|
||||
# make build/coder_linux_amd64
|
||||
# make build/coder_windows_amd64.exe
|
||||
$(CODER_FAT_NOVERSION_BINARIES): build/coder_%: build/coder_$(VERSION)_%
|
||||
rm -f "$@"
|
||||
ln "$<" "$@"
|
||||
|
||||
# Same as above, but for slim binaries.
|
||||
#
|
||||
# Called like this:
|
||||
# make build/coder-slim_linux_amd64
|
||||
# make build/coder-slim_windows_amd64.exe
|
||||
$(CODER_SLIM_NOVERSION_BINARIES): build/coder-slim_%: build/coder-slim_$(VERSION)_%
|
||||
rm -f "$@"
|
||||
ln "$<" "$@"
|
||||
|
||||
# "fat" binaries always depend on the site and the compressed slim binaries.
|
||||
$(CODER_FAT_BINARIES): site/out/index.html site/out/coder.tar.zst
|
||||
|
||||
# This is a handy block that parses the target to determine whether it's "slim"
|
||||
# or "fat", which OS was specified and which architecture was specified.
|
||||
#
|
||||
# It populates the following variables: mode, os, arch_ext, arch, ext (without
|
||||
# dot).
|
||||
define get-mode-os-arch-ext =
|
||||
mode="$$([[ "$@" = build/coder-slim* ]] && echo "slim" || echo "fat")"
|
||||
os="$$(echo $@ | cut -d_ -f3)"
|
||||
arch_ext="$$(echo $@ | cut -d_ -f4)"
|
||||
if [[ "$$arch_ext" == *.* ]]; then
|
||||
arch="$$(echo $$arch_ext | cut -d. -f1)"
|
||||
ext="$${arch_ext#*.}"
|
||||
else
|
||||
arch="$$arch_ext"
|
||||
ext=""
|
||||
fi
|
||||
endef
|
||||
|
||||
# This task handles all builds, for both "fat" and "slim" binaries. It parses
|
||||
# the target name to get the metadata for the build, so it must be specified in
|
||||
# this format:
|
||||
# build/coder(-slim)?_${version}_${os}_${arch}(.exe)?
|
||||
#
|
||||
# You should probably use the non-version targets above instead if you're
|
||||
# calling this manually.
|
||||
$(CODER_ALL_BINARIES): go.mod go.sum \
|
||||
$(shell find . -not -path './vendor/*' -type f -name '*.go') \
|
||||
$(shell find ./examples/templates)
|
||||
|
||||
$(get-mode-os-arch-ext)
|
||||
if [[ "$$os" != "windows" ]] && [[ "$$ext" != "" ]]; then
|
||||
echo "ERROR: Invalid build binary extension" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$$os" == "windows" ]] && [[ "$$ext" != exe ]]; then
|
||||
echo "ERROR: Windows binaries must have an .exe extension." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
build_args=( \
|
||||
--os "$$os" \
|
||||
--arch "$$arch" \
|
||||
mkdir -p ./dist
|
||||
rm -rf ./dist/coder-slim_*
|
||||
rm -f ./site/out/bin/coder*
|
||||
./scripts/build_go_slim.sh \
|
||||
--compress 6 \
|
||||
--version "$(VERSION)" \
|
||||
--output "$@" \
|
||||
)
|
||||
if [ "$$mode" == "slim" ]; then
|
||||
build_args+=(--slim)
|
||||
fi
|
||||
--output ./dist/ \
|
||||
linux:amd64,armv7,arm64 \
|
||||
windows:amd64,arm64 \
|
||||
darwin:amd64,arm64
|
||||
.PHONY: bin
|
||||
|
||||
./scripts/build_go.sh "$${build_args[@]}"
|
||||
GO_FILES=$(shell find . -not -path './vendor/*' -type f -name '*.go') go.mod go.sum $(shell find ./examples/templates)
|
||||
|
||||
if [[ "$$mode" == "slim" ]]; then
|
||||
dot_ext=""
|
||||
if [[ "$$ext" != "" ]]; then
|
||||
dot_ext=".$$ext"
|
||||
fi
|
||||
build: site/out/index.html $(GO_FILES)
|
||||
rm -rf ./dist
|
||||
mkdir -p ./dist
|
||||
rm -f ./site/out/bin/coder*
|
||||
|
||||
mkdir -p ./site/out
|
||||
cp "$@" "./site/out/coder-$$os-$$arch$$dot_ext"
|
||||
fi
|
||||
|
||||
# This task builds all archives. It parses the target name to get the metadata
|
||||
# for the build, so it must be specified in this format:
|
||||
# build/coder_${version}_${os}_${arch}.${format}
|
||||
#
|
||||
# The following OS/arch/format combinations are supported:
|
||||
# .tar.gz: linux_amd64, linux_arm64, linux_armv7
|
||||
# .zip: darwin_amd64, darwin_arm64, windows_amd64, windows_arm64
|
||||
#
|
||||
# This depends on all fat binaries because it's difficult to do dynamic
|
||||
# dependencies due to the .exe requirement on Windows. These targets are
|
||||
# typically only used during release anyways.
|
||||
$(CODER_ALL_ARCHIVES): $(CODER_FAT_BINARIES)
|
||||
$(get-mode-os-arch-ext)
|
||||
bin_ext=""
|
||||
if [[ "$$os" == "windows" ]]; then
|
||||
bin_ext=".exe"
|
||||
fi
|
||||
|
||||
./scripts/archive.sh \
|
||||
--format "$$ext" \
|
||||
--os "$$os" \
|
||||
--output "$@" \
|
||||
"build/coder_$(VERSION)_$${os}_$${arch}$${bin_ext}"
|
||||
|
||||
# This task builds all packages. It parses the target name to get the metadata
|
||||
# for the build, so it must be specified in this format:
|
||||
# build/coder_${version}_linux_${arch}.${format}
|
||||
#
|
||||
# Supports apk, deb, rpm for all linux targets.
|
||||
#
|
||||
# This depends on all Linux fat binaries and archives because it's difficult to
|
||||
# do dynamic dependencies due to the extensions in the filenames. These targets
|
||||
# are typically only used during release anyways.
|
||||
#
|
||||
# Packages need to run after the archives are built, otherwise they cause tar
|
||||
# errors like "file changed as we read it".
|
||||
CODER_PACKAGE_DEPS := $(foreach os_arch, $(PACKAGE_OS_ARCHES), build/coder_$(VERSION)_$(os_arch) build/coder_$(VERSION)_$(os_arch).tar.gz)
|
||||
$(CODER_ALL_PACKAGES): $(CODER_PACKAGE_DEPS)
|
||||
$(get-mode-os-arch-ext)
|
||||
|
||||
./scripts/package.sh \
|
||||
--arch "$$arch" \
|
||||
--format "$$ext" \
|
||||
# build slim artifacts and copy them to the site output directory
|
||||
./scripts/build_go_slim.sh \
|
||||
--version "$(VERSION)" \
|
||||
--output "$@" \
|
||||
"build/coder_$(VERSION)_$${os}_$${arch}"
|
||||
--compress 6 \
|
||||
--output ./dist/ \
|
||||
linux:amd64,armv7,arm64 \
|
||||
windows:amd64,arm64 \
|
||||
darwin:amd64,arm64
|
||||
|
||||
# Redirect from version-less Docker image targets to the versioned ones.
|
||||
#
|
||||
# Called like this:
|
||||
# make build/coder_linux_amd64.tag
|
||||
$(CODER_ALL_NOVERSION_IMAGES): build/coder_%: build/coder_$(VERSION)_%
|
||||
.PHONY: $(CODER_ALL_NOVERSION_IMAGES)
|
||||
|
||||
# Redirect from version-less push Docker image targets to the versioned ones.
|
||||
#
|
||||
# Called like this:
|
||||
# make push/build/coder_linux_amd64.tag
|
||||
$(CODER_ALL_NOVERSION_IMAGES_PUSHED): push/build/coder_%: push/build/coder_$(VERSION)_%
|
||||
.PHONY: $(CODER_ALL_NOVERSION_IMAGES_PUSHED)
|
||||
|
||||
# This task builds all Docker images. It parses the target name to get the
|
||||
# metadata for the build, so it must be specified in this format:
|
||||
# build/coder_${version}_${os}_${arch}.tag
|
||||
#
|
||||
# Supports linux_amd64, linux_arm64, linux_armv7.
|
||||
#
|
||||
# Images need to run after the archives and packages are built, otherwise they
|
||||
# cause errors like "file changed as we read it".
|
||||
$(CODER_ALL_ARCH_IMAGES): build/coder_$(VERSION)_%.tag: \
|
||||
build/coder_$(VERSION)_% \
|
||||
build/coder_$(VERSION)_%.apk \
|
||||
build/coder_$(VERSION)_%.deb \
|
||||
build/coder_$(VERSION)_%.rpm \
|
||||
build/coder_$(VERSION)_%.tar.gz
|
||||
|
||||
$(get-mode-os-arch-ext)
|
||||
|
||||
image_tag="$$(./scripts/image_tag.sh --arch "$$arch" --version "$(VERSION)")"
|
||||
./scripts/build_docker.sh \
|
||||
--arch "$$arch" \
|
||||
--target "$$image_tag" \
|
||||
# build not-so-slim artifacts with the default name format
|
||||
./scripts/build_go_matrix.sh \
|
||||
--version "$(VERSION)" \
|
||||
"build/coder_$(VERSION)_$${os}_$${arch}"
|
||||
--output ./dist/ \
|
||||
--archive \
|
||||
--package-linux \
|
||||
linux:amd64,armv7,arm64 \
|
||||
windows:amd64,arm64 \
|
||||
darwin:amd64,arm64
|
||||
.PHONY: build
|
||||
|
||||
echo "$$image_tag" > "$@"
|
||||
# Builds a test binary for just Linux
|
||||
build-linux-test: site/out/index.html $(GO_FILES)
|
||||
rm -rf ./dist
|
||||
mkdir -p ./dist
|
||||
rm -f ./site/out/bin/coder*
|
||||
|
||||
# Multi-arch Docker image. This requires all architecture-specific images to be
|
||||
# built AND pushed.
|
||||
build/coder_$(VERSION)_linux.tag: $(CODER_ALL_ARCH_IMAGES_PUSHED)
|
||||
image_tag="$$(./scripts/image_tag.sh --version "$(VERSION)")"
|
||||
./scripts/build_docker_multiarch.sh \
|
||||
--target "$$image_tag" \
|
||||
# build slim artifacts and copy them to the site output directory
|
||||
./scripts/build_go_slim.sh \
|
||||
--version "$(VERSION)" \
|
||||
$(foreach img, $^, "$$(cat "$(img)")")
|
||||
--compress 6 \
|
||||
--output ./dist/ \
|
||||
linux:amd64,armv7,arm64 \
|
||||
windows:amd64,arm64 \
|
||||
darwin:amd64,arm64
|
||||
|
||||
echo "$$image_tag" > "$@"
|
||||
|
||||
# Push a Docker image.
|
||||
$(CODER_ALL_IMAGES_PUSHED): push/%: %
|
||||
image_tag="$$(cat "$<")"
|
||||
docker push "$$image_tag"
|
||||
.PHONY: $(CODER_ALL_IMAGES_PUSHED)
|
||||
|
||||
# Shortcut for Helm chart package.
|
||||
build/coder_helm.tgz: build/coder_helm_$(VERSION).tgz
|
||||
rm -f "$@"
|
||||
ln "$<" "$@"
|
||||
|
||||
# Helm chart package.
|
||||
build/coder_helm_$(VERSION).tgz:
|
||||
./scripts/helm.sh \
|
||||
# build not-so-slim artifacts with the default name format
|
||||
./scripts/build_go_matrix.sh \
|
||||
--version "$(VERSION)" \
|
||||
--output "$@"
|
||||
--output ./dist/ \
|
||||
--archive \
|
||||
--package-linux \
|
||||
linux:amd64
|
||||
.PHONY: build-linux-test
|
||||
|
||||
# Runs migrations to output a dump of the database.
|
||||
coderd/database/dump.sql: coderd/database/gen/dump/main.go $(wildcard coderd/database/migrations/*.sql)
|
||||
@@ -321,7 +90,7 @@ coderd/database/querier.go: coderd/database/sqlc.yaml coderd/database/dump.sql $
|
||||
coderd/database/generate.sh
|
||||
|
||||
fmt/prettier:
|
||||
echo "--- prettier"
|
||||
@echo "--- prettier"
|
||||
cd site
|
||||
# Avoid writing files in CI to reduce file write activity
|
||||
ifdef CI
|
||||
@@ -336,7 +105,7 @@ fmt/terraform: $(wildcard *.tf)
|
||||
.PHONY: fmt/terraform
|
||||
|
||||
fmt/shfmt: $(shell shfmt -f .)
|
||||
echo "--- shfmt"
|
||||
@echo "--- shfmt"
|
||||
# Only do diff check in CI, errors on diff.
|
||||
ifdef CI
|
||||
shfmt -d $(shell shfmt -f .)
|
||||
@@ -351,12 +120,22 @@ fmt: fmt/prettier fmt/terraform fmt/shfmt
|
||||
gen: coderd/database/querier.go peerbroker/proto/peerbroker.pb.go provisionersdk/proto/provisioner.pb.go provisionerd/proto/provisionerd.pb.go site/src/api/typesGenerated.ts
|
||||
.PHONY: gen
|
||||
|
||||
install: build/coder_$(VERSION)_$(GOOS)_$(GOARCH)$(GOOS_BIN_EXT)
|
||||
install_dir="$$(go env GOPATH)/bin"
|
||||
output_file="$${install_dir}/coder$(GOOS_BIN_EXT)"
|
||||
install: site/out/index.html $(shell find . -not -path './vendor/*' -type f -name '*.go') go.mod go.sum $(shell find ./examples/templates)
|
||||
@output_file="$(INSTALL_DIR)/coder"
|
||||
|
||||
mkdir -p "$$install_dir"
|
||||
cp "$<" "$$output_file"
|
||||
@if [[ "$(GOOS)" == "windows" ]]; then
|
||||
@output_file="$${output_file}.exe"
|
||||
@fi
|
||||
|
||||
@echo "-- Building CLI for $(GOOS) $(GOARCH) at $$output_file"
|
||||
|
||||
./scripts/build_go.sh \
|
||||
--version "$(VERSION)" \
|
||||
--output "$$output_file" \
|
||||
--os "$(GOOS)" \
|
||||
--arch "$(GOARCH)"
|
||||
|
||||
@echo
|
||||
.PHONY: install
|
||||
|
||||
lint: lint/shellcheck lint/go
|
||||
@@ -369,7 +148,7 @@ lint/go:
|
||||
|
||||
# Use shfmt to determine the shell files, takes editorconfig into consideration.
|
||||
lint/shellcheck: $(shell shfmt -f .)
|
||||
echo "--- shellcheck"
|
||||
@echo "--- shellcheck"
|
||||
shellcheck --external-sources $(shell shfmt -f .)
|
||||
.PHONY: lint/shellcheck
|
||||
|
||||
|
||||
Reference in New Issue
Block a user