Add CI workflow, install.sh, and example config

This commit is contained in:
Stefan Koelle
2026-08-09 11:25:00 +02:00
parent c9ec4a1a77
commit 24edb42dfc
3 changed files with 168 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
name: Build and Test
on:
push:
branches: [ "main" ]
tags: [ "v*" ]
pull_request:
branches: [ "main" ]
permissions:
contents: write
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Download dependencies
run: go mod download
- name: Vet
run: go vet ./...
- name: Run tests
run: go test ./... -v -cover
build:
name: Build binaries
needs: test
runs-on: ubuntu-latest
strategy:
matrix:
goos: [linux, windows, darwin]
goarch: [amd64, arm64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Download dependencies
run: go mod download
- name: Build
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
CGO_ENABLED: 0
run: |
mkdir -p dist
ext=""
if [ "${{ matrix.goos }}" = "windows" ]; then ext=".exe"; fi
out="dist/kctl-tui-${{ matrix.goos }}-${{ matrix.goarch }}${ext}"
go build -o "$out" -ldflags "-s -w" ./cmd/kctl-tui
echo "Built $out"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: kctl-tui-${{ matrix.goos }}-${{ matrix.goarch }}
path: dist/*
release:
name: Attach binaries to GitHub Release
if: startsWith(github.ref, 'refs/tags/v')
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Create release and upload binaries
uses: softprops/action-gh-release@v2
with:
files: dist/*
generate_release_notes: true
+19
View File
@@ -0,0 +1,19 @@
# Example configuration for kctl-tui.
# Copy this file to ~/.kctl-tui/config.yaml and adjust the values to your
# own cluster setup. Do NOT commit your real config.yaml with company- or
# project-specific context/namespace/label names to a public repository.
# Groups of kubectl contexts that belong together (e.g. the same
# environment pair, such as staging/production of the same cluster).
# Pressing TAB in the control pane cycles through the contexts listed here
# while keeping the current namespace.
context_pairs:
- name: "example-environment-pair"
contexts:
- "example-context-a"
- "example-context-b"
# The namespace label key used to group namespaces by team/ownership in the
# team-selection screen. Adjust this to whatever label your organization
# actually uses (can contain a domain prefix, e.g. "example.org/team").
team_label_key: "example.org/team"
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env bash
# Install script for kctl-tui.
# Downloads the latest GitHub release binary matching the current OS/arch
# and installs it to /usr/local/bin (or $INSTALL_DIR if set).
#
# Usage:
# curl -fsSL https://raw.githubusercontent.com/skoelle/kctl-tui/main/install.sh | bash
#
# Requires: curl, a supported OS (linux, darwin).
# Native Windows is not supported by this script; use WSL, or download the
# .exe asset manually from the Releases page.
set -euo pipefail
REPO="skoelle/kctl-tui"
INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}"
BIN_NAME="kctl-tui"
os="$(uname -s | tr '[:upper:]' '[:lower:]')"
arch="$(uname -m)"
case "$arch" in
x86_64|amd64) arch="amd64" ;;
arm64|aarch64) arch="arm64" ;;
*)
echo "Unsupported architecture: $arch" >&2
exit 1
;;
esac
case "$os" in
linux|darwin) ;;
*)
echo "Unsupported OS: $os. On Windows, use WSL or download the .exe from the Releases page." >&2
exit 1
;;
esac
echo "Detecting latest release for $REPO ..."
latest_tag="$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep -m1 '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')"
if [ -z "$latest_tag" ]; then
echo "Could not determine latest release tag. Is there at least one published release?" >&2
exit 1
fi
asset="kctl-tui-${os}-${arch}"
url="https://github.com/${REPO}/releases/download/${latest_tag}/${asset}"
echo "Downloading ${asset} (${latest_tag}) ..."
tmp_file="$(mktemp)"
curl -fsSL "$url" -o "$tmp_file"
chmod +x "$tmp_file"
if [ -w "$INSTALL_DIR" ]; then
mv "$tmp_file" "${INSTALL_DIR}/${BIN_NAME}"
else
echo "Elevated permissions required to write to ${INSTALL_DIR}"
sudo mv "$tmp_file" "${INSTALL_DIR}/${BIN_NAME}"
fi
echo "Installed ${BIN_NAME} to ${INSTALL_DIR}/${BIN_NAME}"
"${INSTALL_DIR}/${BIN_NAME}" --help >/dev/null 2>&1 || true
echo "Done. Run '${BIN_NAME}' to get started."