From bb4d0cc701393d5e40ed3cc00b214b99d3f3ca3d Mon Sep 17 00:00:00 2001 From: jon brookes Date: Tue, 14 Oct 2025 15:58:09 +0100 Subject: [PATCH 1/4] feat: update Forgejo deployment URL and add installation check in startup script --- gcloud/tf/doit.tf | 0 gcloud/tf/k3s/forgejo/deployment.yaml | 2 +- gcloud/tf/scripts/k3s-vm-startup.sh | 8 ++++++++ 3 files changed, 9 insertions(+), 1 deletion(-) delete mode 100644 gcloud/tf/doit.tf diff --git a/gcloud/tf/doit.tf b/gcloud/tf/doit.tf deleted file mode 100644 index e69de29..0000000 diff --git a/gcloud/tf/k3s/forgejo/deployment.yaml b/gcloud/tf/k3s/forgejo/deployment.yaml index cd3afdc..445ec2d 100644 --- a/gcloud/tf/k3s/forgejo/deployment.yaml +++ b/gcloud/tf/k3s/forgejo/deployment.yaml @@ -26,7 +26,7 @@ spec: - name: FORGEJO__repository__ENABLE_PUSH_CREATE_USER value: "true" - name: FORGEJO__server__ROOT_URL - value: "https://frg.headshed.dev/" + value: "https://frgdr.headshed.dev/" - name: FORGEJO__repository__DEFAULT_BRANCH value: "main" - name: FORGEJO__server__LFS_START_SERVER diff --git a/gcloud/tf/scripts/k3s-vm-startup.sh b/gcloud/tf/scripts/k3s-vm-startup.sh index dd875fd..b22c886 100644 --- a/gcloud/tf/scripts/k3s-vm-startup.sh +++ b/gcloud/tf/scripts/k3s-vm-startup.sh @@ -100,3 +100,11 @@ if [[ ! -d "$INFCTL_INSTALL_DIR" ]]; then chown -R user:user "$INFCTL_INSTALL_DIR" fi +# check to see if INSTALL_FORGEJO is set to "true" +if [[ "$INSTALL_FORGEJO" == "true" ]]; then + # install forgejo using infctl + # .... + LOG_FORMAT=none infctl -f "${INFCTL_INSTALL_DIR}/infctl-cli/gcloud/tf/scripts/install-forgejo-pipeline.json" + touch /etc/forgejo_was_installed + +fi From b4c0f17b12fcf0201cf60ee2c876fe6ba798f1db Mon Sep 17 00:00:00 2001 From: jon brookes Date: Tue, 14 Oct 2025 16:32:05 +0100 Subject: [PATCH 2/4] feat: add script to copy .env file to k3s-vm-1 after pre-flight checks --- .../tf/scripts/build-gcloud-k3s-pipeline.json | 9 ++++++ gcloud/tf/scripts/copy_env_to_first_node.sh | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 gcloud/tf/scripts/copy_env_to_first_node.sh diff --git a/gcloud/tf/scripts/build-gcloud-k3s-pipeline.json b/gcloud/tf/scripts/build-gcloud-k3s-pipeline.json index 179282f..d1fd61b 100644 --- a/gcloud/tf/scripts/build-gcloud-k3s-pipeline.json +++ b/gcloud/tf/scripts/build-gcloud-k3s-pipeline.json @@ -34,5 +34,14 @@ ], "retryCount": 0, "shouldAbort": true + }, + { + "name": "copy .env to k3s-vm-1", + "function": "RunCommand", + "params": [ + "gcloud/tf/scripts/copy_env_to_first_node.sh" + ], + "retryCount": 0, + "shouldAbort": true } ] \ No newline at end of file diff --git a/gcloud/tf/scripts/copy_env_to_first_node.sh b/gcloud/tf/scripts/copy_env_to_first_node.sh new file mode 100755 index 0000000..5bce28a --- /dev/null +++ b/gcloud/tf/scripts/copy_env_to_first_node.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +source .env + +for i in {1..10}; do + # Check if the instance is running + INSTANCE_STATUS=$(gcloud compute instances describe k3s-vm-1 --zone=us-central1-a --project="$PROJECT_NAME" --format='get(status)') + if [[ "$INSTANCE_STATUS" != "RUNNING" ]]; then + echo "Instance k3s-vm-1 is not running. Attempt $i/10. Waiting 5 seconds..." + sleep 5 + continue + fi + + # Check if the directory exists on the remote host + if gcloud compute ssh k3s-vm-1 --zone=us-central1-a --project="$PROJECT_NAME" --command="test -d /opt/src/infctl-cli/"; then + echo "/opt/src/infctl-cli/ exists on k3s-vm-1." + break + else + echo "/opt/src/infctl-cli/ does not exist yet. Attempt $i/10. Waiting 5 seconds..." + sleep 5 + fi +done + +# Final check after loop +if ! gcloud compute ssh k3s-vm-1 --zone=us-central1-a --project="$PROJECT_NAME" --command="test -d /opt/src/infctl-cli/"; then + echo "ERROR: /opt/src/infctl-cli/ does not exist on k3s-vm-1 after 10 attempts. Exiting." + exit 1 +fi + +gcloud compute scp .env k3s-vm-1:/opt/src/infctl-cli/.env --zone=us-central1-a --project=$PROJECT_NAME + From f23e1c41ff34243cb6f5fb6925cc78786ac3ed0d Mon Sep 17 00:00:00 2001 From: jon brookes Date: Tue, 14 Oct 2025 16:50:12 +0100 Subject: [PATCH 3/4] feat: add .env file existence check and load it in startup script --- gcloud/tf/scripts/k3s-vm-startup.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gcloud/tf/scripts/k3s-vm-startup.sh b/gcloud/tf/scripts/k3s-vm-startup.sh index b22c886..44793a1 100644 --- a/gcloud/tf/scripts/k3s-vm-startup.sh +++ b/gcloud/tf/scripts/k3s-vm-startup.sh @@ -100,6 +100,25 @@ if [[ ! -d "$INFCTL_INSTALL_DIR" ]]; then chown -R user:user "$INFCTL_INSTALL_DIR" fi +for i in {1..100}; do + if [[ -f /opt/src/infctl-cli/.env ]]; then + echo ".env file found." + break + else + echo ".env file not found. Attempt $i/100. Waiting 5 seconds..." + sleep 5 + fi +done + +# Final check after loop +if [[ ! -f /opt/src/infctl-cli/.env ]]; then + echo "ERROR: .env file not found after 10 attempts. Exiting." + exit 1 +fi + +# load .env file +source /opt/src/infctl-cli/.env + # check to see if INSTALL_FORGEJO is set to "true" if [[ "$INSTALL_FORGEJO" == "true" ]]; then # install forgejo using infctl From 02b114e0e6b6e7dc025f2d069ecc3498cb112b22 Mon Sep 17 00:00:00 2001 From: jon brookes Date: Tue, 14 Oct 2025 17:49:59 +0100 Subject: [PATCH 4/4] feat: add scripts for pre-flight checks and user input wait in k3s pipeline --- .../build-gcloud-k3s-pipeline-wait-dns.json | 56 +++++++++++++++++++ gcloud/tf/scripts/k3s-vm-startup.sh | 4 ++ gcloud/tf/scripts/wait_for_user_input_dns.sh | 11 ++++ 3 files changed, 71 insertions(+) create mode 100644 gcloud/tf/scripts/build-gcloud-k3s-pipeline-wait-dns.json create mode 100755 gcloud/tf/scripts/wait_for_user_input_dns.sh diff --git a/gcloud/tf/scripts/build-gcloud-k3s-pipeline-wait-dns.json b/gcloud/tf/scripts/build-gcloud-k3s-pipeline-wait-dns.json new file mode 100644 index 0000000..eeb5a5f --- /dev/null +++ b/gcloud/tf/scripts/build-gcloud-k3s-pipeline-wait-dns.json @@ -0,0 +1,56 @@ +[ + { + "name": "run pre-flight checks", + "function": "RunCommand", + "params": [ + "./gcloud/tf/scripts/pre-flight-checks.sh" + ], + "retryCount": 0, + "shouldAbort": true + }, + { + "name": "list gcloud infrastructure", + "function": "RunCommand", + "params": [ + "./gcloud/tf/scripts/list_gloud_infra.sh" + ], + "retryCount": 0, + "shouldAbort": true + }, + { + "name": "create tfvars", + "function": "RunCommand", + "params": [ + "./gcloud/tf/scripts/create_tfvars.sh" + ], + "retryCount": 0, + "shouldAbort": true + }, + { + "name": "run tofu", + "function": "RunCommand", + "params": [ + "./gcloud/tf/scripts/run_tofu.sh" + ], + "retryCount": 0, + "shouldAbort": true + }, + { + "name": "wait for user input to continue", + "function": "RunCommand", + "params": [ + "./gcloud/tf/scripts/wait_for_user_input_dns.sh" + ], + "retryCount": 0, + "shouldAbort": true + }, + { + "name": "copy .env to k3s-vm-1", + "function": "RunCommand", + "params": [ + "gcloud/tf/scripts/copy_env_to_first_node.sh" + ], + "retryCount": 0, + "shouldAbort": true + } +] \ No newline at end of file diff --git a/gcloud/tf/scripts/k3s-vm-startup.sh b/gcloud/tf/scripts/k3s-vm-startup.sh index 44793a1..6e2fcf9 100644 --- a/gcloud/tf/scripts/k3s-vm-startup.sh +++ b/gcloud/tf/scripts/k3s-vm-startup.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Redirect all output to a log file for reliability +exec > /tmp/startup.log 2>&1 + INFCTL_GIT_REPO="https://codeberg.org/headshed/infctl-cli.git" INFCTL_GIT_REPO_BRANCH="main" INFCTL_INSTALL_DIR="/opt/src" @@ -123,6 +126,7 @@ source /opt/src/infctl-cli/.env if [[ "$INSTALL_FORGEJO" == "true" ]]; then # install forgejo using infctl # .... + export KUBECONFIG=/etc/rancher/k3s/k3s.yaml LOG_FORMAT=none infctl -f "${INFCTL_INSTALL_DIR}/infctl-cli/gcloud/tf/scripts/install-forgejo-pipeline.json" touch /etc/forgejo_was_installed diff --git a/gcloud/tf/scripts/wait_for_user_input_dns.sh b/gcloud/tf/scripts/wait_for_user_input_dns.sh new file mode 100755 index 0000000..a356571 --- /dev/null +++ b/gcloud/tf/scripts/wait_for_user_input_dns.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +echo "Please configure DNS using the IP address from the previous stage." +echo "you have 120 seconds." +for i in {120..1}; do + echo -ne "Time remaining: $i seconds\r" + sleep 1 +done +echo "" + +exit 0 \ No newline at end of file