diff --git a/docs/2_getting_started.md b/docs/2_getting_started.md index 65d1f5283eb131f5cb33310618eb108dbf46749a..6b9314ebff2bdf8c28ba69f0cacc2e47c041f3e8 100644 --- a/docs/2_getting_started.md +++ b/docs/2_getting_started.md @@ -14,7 +14,6 @@ Table of Contents - Admin tools - [Docker](https://docs.docker.com/engine/install/) - - [Flux CLI](https://toolkit.fluxcd.io/get-started/#install-the-flux-cli): `brew install fluxcd/tap/flux` - [Git](https://git-scm.com/download/) - [Helm](https://helm.sh/docs/intro/install/) - [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) @@ -29,30 +28,24 @@ Table of Contents ## Flux Installation -[Flux v2](https://toolkit.fluxcd.io/) must be installed into the Kubernetes cluster before deploying Big Bang. There are three options for doing this: +[Flux v2](https://toolkit.fluxcd.io/) must be installed into the Kubernetes cluster before deploying Big Bang: -1. (Recommended) Deploy officially through [Iron Bank](registry1.dso.mil) +1. Deploy officially through [Iron Bank](registry1.dso.mil) - ```bash - # The script will do the following: - # Check flux prerequisites - # Interactively login to Iron Bank and store credentials in Secret - # Install flux into Kubernetes cluster using Iron Bank repo - # Remove Iron Bank credentials from cluster - hack/flux-install.sh - ``` +Official flux installation helper script: -1. Deploy unofficially through [Big Bang's Repo](https://repo1.dso.mil/platform-one/big-bang/apps/sandbox/fluxv2/container_registry) - - ```bash - flux install --registry registry.dso.mil/platform-one/big-bang/apps/sandbox/fluxv2 - ``` +``` +./scripts/install_flux.sh --help +``` -1. Deploy for development through [DockerHub](https://hub.docker.com/search?q=fluxcd) +Example baseline IronBank deployment: - ```bash - flux install - ``` +``` +./scripts/install_flux.sh \ + --registry-username "$REGISTRY_USERNAME" \ + --registry-password "$REGISTRY_PASSWORD" \ + --registry-email "$REGISTRY_EMAIL" +``` ## Configuration Template diff --git a/scripts/deploy/00_deploy_flux.sh b/scripts/deploy/00_deploy_flux.sh new file mode 100644 index 0000000000000000000000000000000000000000..e830e35eadafd3dc45725b614aab7b3fb00650f4 --- /dev/null +++ b/scripts/deploy/00_deploy_flux.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -ex + +# install flux with the dedicated helper script +./scripts/install_flux.sh \ + --registry-username 'robot$bigbang' \ + --registry-password "$REGISTRY1_PASSWORD" \ + --registry-email bigbang@bigbang.dev \ No newline at end of file diff --git a/scripts/deploy/01_deploy_bigbang.sh b/scripts/deploy/01_deploy_bigbang.sh index 640e40bb3625771803bf5b0455884c2cdbe72ccb..7d436401f0f2574b4718fe1282d3fe8463d4b51d 100755 --- a/scripts/deploy/01_deploy_bigbang.sh +++ b/scripts/deploy/01_deploy_bigbang.sh @@ -4,30 +4,6 @@ set -ex CI_VALUES_FILE="tests/ci/k3d/values.yaml" -# Deploy flux and wait for it to be ready -echo "Installing Flux" -flux --version -flux check --pre - -# create flux namespace -kubectl create ns flux-system || true - -# delete flux private-registry secret -kubectl delete secret private-registry -n flux-system || true - -# create flux private-registry secret -kubectl create secret docker-registry private-registry -n flux-system \ - --docker-server=registry1.dso.mil \ - --docker-username='robot$bigbang' \ - --docker-password=${REGISTRY1_PASSWORD} \ - --docker-email=bigbang@bigbang.dev || true - -# install flux -kubectl apply -f ./scripts/deploy/flux.yaml - -# wait for flux -flux check - if [[ "${CI_COMMIT_BRANCH}" == "${CI_DEFAULT_BRANCH}" ]]; then echo "On default branch, enabling all addons" yq e ".addons.*.enabled = "true"" $CI_VALUES_FILE > tmpfile && mv tmpfile $CI_VALUES_FILE @@ -46,15 +22,16 @@ echo "Installing BigBang with the following configurations:" cat $CI_VALUES_FILE helm upgrade -i bigbang chart -n bigbang --create-namespace \ ---set registryCredentials[0].username='robot$bigbang' --set registryCredentials[0].password=${REGISTRY1_PASSWORD} \ ---set registryCredentials[0].registry=registry1.dso.mil \ --f ${CI_VALUES_FILE} + --set registryCredentials[0].username='robot$bigbang' \ + --set registryCredentials[0].password="$REGISTRY1_PASSWORD" \ + --set registryCredentials[0].registry=registry1.dso.mil \ + -f ${CI_VALUES_FILE} # apply secrets kustomization pointing to current branch echo "Deploying secrets from the ${CI_COMMIT_REF_NAME} branch" -if [[ -z "${CI_COMMIT_TAG}" ]]; then - cat tests/ci/shared-secrets.yaml | sed 's|master|'$CI_COMMIT_REF_NAME'|g' | kubectl apply -f - +if [ -z "$CI_COMMIT_TAG" ]; then + cat tests/ci/shared-secrets.yaml | sed 's|master|'"$CI_COMMIT_REF_NAME"'|g' | kubectl apply -f - else # NOTE: $CI_COMMIT_REF_NAME = $CI_COMMIT_TAG when running on a tagged build - cat tests/ci/shared-secrets.yaml | sed 's|branch: master|tag: '$CI_COMMIT_REF_NAME'|g' | kubectl apply -f - + cat tests/ci/shared-secrets.yaml | sed 's|branch: master|tag: '"$CI_COMMIT_REF_NAME"'|g' | kubectl apply -f - fi \ No newline at end of file diff --git a/scripts/install_flux.sh b/scripts/install_flux.sh new file mode 100755 index 0000000000000000000000000000000000000000..24ff69a71e595a4970fd6a9bd7ac8ad5d64caf25 --- /dev/null +++ b/scripts/install_flux.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +set -e + +# flux install --version=v0.7.7 --registry=registry1.dso.mil/ironbank/fluxcd --image-pull-secret=private-registry --export > flux.yaml + +# +# global defaults +# + +REGISTRY_URL=registry1.dso.mil +FLUX_MANIFEST=scripts/deploy/flux.yaml +FLUX_SECRET=private-registry +WAIT_TIMEOUT=120 + + +# +# helper functions +# + +# script help message +function help { + cat << EOF +usage: $(basename "$0") <arguments> +-h|--help - print this help message and exit +-u|--registry-username - (required) registry username to use for flux installation +-p|--registry-password - (required) registry password to use for flux installation +-w|--wait-timeout - (optional, default: 120) how long to wait; in seconds, for each key flux resource component +EOF +} + +# +# cli parsing +# + +PARAMS="" +while (( "$#" )); do + case "$1" in + # registry username required argument + -u|--registry-username) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + REGISTRY_USERNAME=$2 + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + help; exit 1 + fi + ;; + # registry password required argument + -p|--registry-password) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + REGISTRY_PASSWORD=$2 + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + help; exit 1 + fi + ;; + # registry email required argument + -e|--registry-email) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + REGISTRY_EMAIL=$2 + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + help; exit 1 + fi + ;; + # wait timeout optional argument + -w|--wait-timeout) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + WAIT_TIMEOUT=$2 + shift 2 + else + echo "Error: Argument for $1 is missing" >&2 + help; exit 1 + fi + ;; + # help flag + -h|--help) + help; exit 0 + ;; + # unsupported flags + -*|--*=) + echo "Error: Unsupported flag $1" >&2 + help; exit 1 + ;; + # preserve positional arguments + *) + PARAMS="$PARAMS $1" + shift + ;; + esac +done + +# check required arguments +if [ -z "$REGISTRY_USERNAME" ] || [ -z "$REGISTRY_PASSWORD" ]; then + help; exit 1 +fi + +# debug print cli args +echo "REGISTRY_URL: $REGISTRY_URL" +echo "REGISTRY_USERNAME: $REGISTRY_USERNAME" + + +# +# install flux +# + +kubectl create namespace flux-system || true + + +echo "Creating secret $FLUX_SECRET in namespace flux-system" +kubectl create secret docker-registry "$FLUX_SECRET" -n flux-system \ + --docker-server="$REGISTRY_URL" \ + --docker-username="$REGISTRY_USERNAME" \ + --docker-password="$REGISTRY_PASSWORD" \ + --docker-email="$REGISTRY_EMAIL" \ + --dry-run=client -o yaml | kubectl apply -n flux-system -f - + +echo "Installing flux from manifest" +kubectl apply -f "$FLUX_MANIFEST" + +# +# verify flux +# +kubectl wait --for=condition=available --timeout "${WAIT_TIMEOUT}s" -n "flux-system" "deployment/helm-controller" +kubectl wait --for=condition=available --timeout "${WAIT_TIMEOUT}s" -n "flux-system" "deployment/source-controller" +kubectl wait --for=condition=available --timeout "${WAIT_TIMEOUT}s" -n "flux-system" "deployment/kustomize-controller" +kubectl wait --for=condition=available --timeout "${WAIT_TIMEOUT}s" -n "flux-system" "deployment/notification-controller"