#!/usr/bin/env bash # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 # The ci-helper is used to determine build metadata, build Vault binaries, # package those binaries into artifacts, and execute tests with those artifacts. set -euo pipefail # We don't want to get stuck in some kind of interactive pager export GIT_PAGER=cat # Get the build date from the latest commit since it can be used across all # builds function build_date() { # It's tricky to do an RFC3339 format in a cross platform way, so we hardcode UTC : "${DATE_FORMAT:="%Y-%m-%dT%H:%M:%SZ"}" git show --no-show-signature -s --format=%cd --date=format:"$DATE_FORMAT" HEAD } # Get the revision, which is the latest commit SHA function build_revision() { git rev-parse HEAD } # Determine our repository by looking at our origin URL function repo() { basename -s .git "$(git config --get remote.origin.url)" } # Determine the artifact basename based on metadata function artifact_basename() { : "${PKG_NAME:="vault"}" : "${GOOS:=$(go env GOOS)}" : "${GOARCH:=$(go env GOARCH)}" : "${VERSION:=""}" if [ -z "$VERSION" ]; then echo "You must specify the VERSION variable for this command" >&2 exit 1 fi echo "${PKG_NAME}_${VERSION}_${GOOS}_${GOARCH}" } # Bundle the dist directory into a zip function bundle() { : "${BUNDLE_PATH:=$(repo_root)/vault.zip}" echo "--> Bundling dist/* to $BUNDLE_PATH" zip -r -j "$BUNDLE_PATH" dist/ } # Determine the root directory of the repository function repo_root() { git rev-parse --show-toplevel } # Build the UI function build_ui() { local repo_root repo_root=$(repo_root) pushd "$repo_root" mkdir -p http/web_ui popd pushd "$repo_root/ui" yarn install npm rebuild node-sass yarn run build popd } # Build Vault function build() { local revision local build_date local ldflags local msg # Get or set our basic build metadata revision=$(build_revision) build_date=$(build_date) # : "${BIN_PATH:="dist/"}" #if not run by actions-go-build (enos local) then set this explicitly : "${GO_TAGS:=""}" : "${REMOVE_SYMBOLS:=""}" (unset GOOS; unset GOARCH; go generate ./...) # Build our ldflags msg="--> Building Vault revision $revision, built $build_date" # Keep the symbol and dwarf information by default if [ -n "$REMOVE_SYMBOLS" ]; then ldflags="-s -w " else ldflags="" fi ldflags="${ldflags} -X github.com/hashicorp/vault/version.GitCommit=$revision -X github.com/hashicorp/vault/version.BuildDate=$build_date" if [[ ${VERSION_METADATA+x} ]]; then msg="${msg}, metadata ${VERSION_METADATA}" ldflags="${ldflags} -X github.com/hashicorp/vault/version.VersionMetadata=$VERSION_METADATA" fi # Build vault echo "$msg" pushd "$(repo_root)" mkdir -p dist mkdir -p out set -x go build -v -tags "$GO_TAGS" -ldflags "$ldflags" -o dist/ set +x popd } # Prepare legal requirements for packaging function prepare_legal() { : "${PKG_NAME:="vault"}" pushd "$(repo_root)" mkdir -p dist curl -o dist/EULA.txt https://eula.hashicorp.com/EULA.txt curl -o dist/TermsOfEvaluation.txt https://eula.hashicorp.com/TermsOfEvaluation.txt mkdir -p ".release/linux/package/usr/share/doc/$PKG_NAME" cp dist/EULA.txt ".release/linux/package/usr/share/doc/$PKG_NAME/EULA.txt" cp dist/TermsOfEvaluation.txt ".release/linux/package/usr/share/doc/$PKG_NAME/TermsOfEvaluation.txt" popd } # Package version converts a vault version string into a compatible representation for system # packages. function version_package() { awk '{ gsub("-","~",$1); print $1 }' <<< "$VAULT_VERSION" } # Run the CI Helper function main() { case $1 in artifact-basename) artifact_basename ;; build) build ;; build-ui) build_ui ;; bundle) bundle ;; date) build_date ;; prepare-legal) prepare_legal ;; revision) build_revision ;; version-package) version_package ;; *) echo "unknown sub-command" >&2 exit 1 ;; esac } main "$@"