Add comprehensive .github/copilot-instructions.md for coding agents
Co-authored-by: yxxhero <11087727+yxxhero@users.noreply.github.com>
This commit is contained in:
parent
481d8ed433
commit
206d07a25e
|
|
@ -0,0 +1,231 @@
|
||||||
|
# Copilot Instructions for Helmfile
|
||||||
|
|
||||||
|
## Repository Overview
|
||||||
|
|
||||||
|
Helmfile is a declarative spec for deploying Helm charts that manages Kubernetes deployments as code. It provides templating, environment management, and GitOps workflows for Helm chart deployments.
|
||||||
|
|
||||||
|
**Key Details:**
|
||||||
|
- **Language:** Go 1.24.2+
|
||||||
|
- **Type:** CLI tool / Kubernetes deployment management
|
||||||
|
- **Size:** Large codebase (~229MB binary, 200+ dependencies)
|
||||||
|
- **Runtime:** Requires Helm 3.x as external dependency
|
||||||
|
- **Target Platform:** Linux/macOS/Windows, Kubernetes clusters
|
||||||
|
|
||||||
|
## Build and Validation Commands
|
||||||
|
|
||||||
|
### Essential Setup
|
||||||
|
Helmfile requires Helm 3.x as a runtime dependency:
|
||||||
|
```bash
|
||||||
|
# Check for Helm dependency (REQUIRED)
|
||||||
|
helm version # Must show version 3.x
|
||||||
|
|
||||||
|
# Initialize Helm plugins after helmfile installation
|
||||||
|
./helmfile init # Installs required helm-diff plugin
|
||||||
|
|
||||||
|
# Alternative: Force install without prompts
|
||||||
|
./helmfile init --force
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Process
|
||||||
|
```bash
|
||||||
|
# Standard build (takes 2-3 minutes due to many dependencies)
|
||||||
|
make build
|
||||||
|
|
||||||
|
# Alternative direct build
|
||||||
|
go build -o helmfile .
|
||||||
|
|
||||||
|
# Build with test tools (required for integration tests, ~1 minute)
|
||||||
|
make build-test-tools # Creates diff-yamls and downloads dyff
|
||||||
|
|
||||||
|
# Cross-platform builds
|
||||||
|
make cross
|
||||||
|
```
|
||||||
|
|
||||||
|
**Build Timing:** First build downloads 200+ Go packages and takes 2-3 minutes. Subsequent builds are faster due to module cache. Test tools build is faster (~1 minute).
|
||||||
|
|
||||||
|
### Validation Pipeline
|
||||||
|
Run in this exact order to match CI requirements:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Code formatting and linting
|
||||||
|
make check # Run go vet (required - always works)
|
||||||
|
# Note: make fmt requires gci tool (go install github.com/daixiang0/gci@latest)
|
||||||
|
|
||||||
|
# 2. Unit tests (fast, ~30 seconds)
|
||||||
|
go test -v ./pkg/... -race -p=1
|
||||||
|
|
||||||
|
# 3. Integration tests (requires Kubernetes - see Environment Setup)
|
||||||
|
make integration # Takes 5-10 minutes, needs minikube/k8s cluster
|
||||||
|
|
||||||
|
# 4. E2E tests (optional, needs expect package)
|
||||||
|
sudo apt-get install expect # On Ubuntu/Debian
|
||||||
|
bash test/e2e/helmfile-init/init_linux.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linting Configuration
|
||||||
|
Uses golangci-lint with configuration in `.golangci.yaml`. Install via:
|
||||||
|
```bash
|
||||||
|
# For local development
|
||||||
|
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.6
|
||||||
|
golangci-lint run
|
||||||
|
```
|
||||||
|
|
||||||
|
**Critical Lint Rules:** staticcheck, errcheck, revive, unused. Fix lint errors before committing.
|
||||||
|
|
||||||
|
## Environment Setup Requirements
|
||||||
|
|
||||||
|
### Dependencies for Development
|
||||||
|
```bash
|
||||||
|
# Required for building/testing
|
||||||
|
go version # Must be 1.24.2+
|
||||||
|
helm version # Must be 3.x
|
||||||
|
kubectl version # For K8s integration
|
||||||
|
|
||||||
|
# Required for integration tests
|
||||||
|
minikube start # Or other K8s cluster
|
||||||
|
kustomize version # v5.2.1+ for some tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration Test Environment
|
||||||
|
Integration tests require a running Kubernetes cluster:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Using minikube (recommended for CI)
|
||||||
|
minikube start
|
||||||
|
export KUBECONFIG=$(minikube kubeconfig-path)
|
||||||
|
|
||||||
|
# Using kind (alternative)
|
||||||
|
kind create cluster --name helmfile-test
|
||||||
|
|
||||||
|
# Verify cluster access
|
||||||
|
kubectl cluster-info
|
||||||
|
```
|
||||||
|
|
||||||
|
**Timing:** Integration tests take 5-10 minutes and may fail due to timing issues in resource-constrained environments.
|
||||||
|
|
||||||
|
## Project Architecture and Layout
|
||||||
|
|
||||||
|
### Core Directory Structure
|
||||||
|
```
|
||||||
|
/
|
||||||
|
├── main.go # Entry point - CLI initialization and signal handling
|
||||||
|
├── cmd/ # CLI commands (apply, diff, sync, template, etc.)
|
||||||
|
│ ├── root.go # Main cobra command setup and global flags
|
||||||
|
│ ├── apply.go # helmfile apply command
|
||||||
|
│ ├── diff.go # helmfile diff command
|
||||||
|
│ └── ... # Other subcommands
|
||||||
|
├── pkg/ # Core library packages
|
||||||
|
│ ├── app/ # Main application logic and execution
|
||||||
|
│ ├── state/ # Helmfile state management and chart dependencies
|
||||||
|
│ ├── helmexec/ # Helm execution and command wrapper
|
||||||
|
│ ├── tmpl/ # Go template processing and functions
|
||||||
|
│ ├── environment/ # Environment and values management
|
||||||
|
│ └── ... # Other core packages
|
||||||
|
├── test/ # Test suites
|
||||||
|
│ ├── integration/ # Integration tests with real K8s clusters
|
||||||
|
│ ├── e2e/ # End-to-end user workflow tests
|
||||||
|
│ └── advanced/ # Advanced feature tests
|
||||||
|
├── docs/ # Documentation (mkdocs format)
|
||||||
|
├── examples/ # Example helmfile configurations
|
||||||
|
└── .github/workflows/ # CI/CD pipeline definitions
|
||||||
|
```
|
||||||
|
|
||||||
|
### Key Source Files
|
||||||
|
- **main.go:** Signal handling, CLI execution entry point
|
||||||
|
- **cmd/root.go:** Global CLI configuration, error handling, logging setup
|
||||||
|
- **pkg/app/app.go:** Main application orchestration, state management
|
||||||
|
- **pkg/state/state.go:** Helmfile state parsing, release management
|
||||||
|
- **pkg/helmexec/exec.go:** Helm command execution, version detection
|
||||||
|
|
||||||
|
### Configuration Files
|
||||||
|
- **go.mod/go.sum:** Go dependencies (many cloud providers, k8s libraries)
|
||||||
|
- **.golangci.yaml:** Linting rules and settings
|
||||||
|
- **Makefile:** Build targets and development workflows
|
||||||
|
- **mkdocs.yml:** Documentation generation configuration
|
||||||
|
- **.github/workflows/ci.yaml:** Complete CI pipeline definition
|
||||||
|
|
||||||
|
## Continuous Integration Pipeline
|
||||||
|
|
||||||
|
### GitHub Actions Workflow (`.github/workflows/ci.yaml`)
|
||||||
|
1. **Lint Job:** golangci-lint with custom configuration (~5 minutes)
|
||||||
|
2. **Test Job:** Unit tests + binary build (~10 minutes)
|
||||||
|
3. **Integration Job:** Tests with multiple Helm/Kustomize versions (~15-20 minutes each)
|
||||||
|
4. **E2E Job:** User workflow validation (~5 minutes)
|
||||||
|
|
||||||
|
**Matrix Testing:** CI tests against multiple Helm versions (3.17.x, 3.18.x) and Kustomize versions (5.2.x, 5.4.x).
|
||||||
|
|
||||||
|
### Pre-commit Validation Steps
|
||||||
|
Always run these locally before pushing:
|
||||||
|
```bash
|
||||||
|
make check # Format and vet (required)
|
||||||
|
go test ./pkg/... # Unit tests
|
||||||
|
make build # Verify build works
|
||||||
|
# Note: make fmt requires gci tool: go install github.com/daixiang0/gci@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common CI Failure Causes
|
||||||
|
- **Linting errors:** Run `golangci-lint run` locally first
|
||||||
|
- **Integration test timeouts:** K8s cluster setup timing issues
|
||||||
|
- **Version compatibility:** Ensure Go 1.24.2+ and Helm 3.x
|
||||||
|
- **Race conditions:** Some tests are sensitive to parallel execution
|
||||||
|
|
||||||
|
## Development Gotchas and Known Issues
|
||||||
|
|
||||||
|
### Build Issues
|
||||||
|
- **Long initial build time:** First `make build` downloads 200+ packages (~2-3 minutes)
|
||||||
|
- **Memory usage:** Large binary size due to embedded dependencies
|
||||||
|
- **Git tags:** Build may show version warnings if not on tagged commit
|
||||||
|
- **Tool dependencies:** `make fmt` requires `gci` tool installation
|
||||||
|
|
||||||
|
### Testing Issues
|
||||||
|
- **Integration tests require K8s:** Will fail without cluster access
|
||||||
|
- **Test isolation:** Use `-p=1` flag to avoid race conditions
|
||||||
|
- **Minikube timing:** May need to wait for cluster ready state
|
||||||
|
- **Plugin dependencies:** Tests need helm-diff and helm-secrets plugins
|
||||||
|
|
||||||
|
### Runtime Requirements
|
||||||
|
- **Helm dependency:** Always required at runtime, not just build time (available in CI)
|
||||||
|
- **kubectl access:** Most operations need valid kubeconfig
|
||||||
|
- **Plugin management:** `helmfile init` must be run after installation
|
||||||
|
|
||||||
|
### Common Error Patterns
|
||||||
|
```bash
|
||||||
|
# Missing Helm
|
||||||
|
"helm: command not found" → Install Helm first
|
||||||
|
|
||||||
|
# Plugin missing
|
||||||
|
"Error: plugin 'diff' not found" → Run helmfile init
|
||||||
|
|
||||||
|
# K8s access
|
||||||
|
"connection refused" → Check kubectl cluster-info
|
||||||
|
|
||||||
|
# Permission errors
|
||||||
|
"permission denied" → Check kubeconfig and cluster access
|
||||||
|
|
||||||
|
# Missing tools
|
||||||
|
"gci: No such file or directory" → go install github.com/daixiang0/gci@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Working with the Codebase
|
||||||
|
|
||||||
|
### Making Changes
|
||||||
|
- **Small, focused changes:** Each PR should address single concern
|
||||||
|
- **Test coverage:** Add unit tests for new pkg/ functionality
|
||||||
|
- **Integration tests:** Update test-cases/ for new CLI features
|
||||||
|
- **Documentation:** Update docs/ for user-facing changes
|
||||||
|
|
||||||
|
### Key Packages to Understand
|
||||||
|
- **pkg/app:** Main business logic, start here for feature changes
|
||||||
|
- **pkg/state:** Helmfile parsing and release orchestration
|
||||||
|
- **cmd/:** CLI interface changes and new subcommands
|
||||||
|
- **pkg/helmexec:** Helm integration and command execution
|
||||||
|
|
||||||
|
### Architecture Patterns
|
||||||
|
- **Dependency injection:** App uses interfaces for testability
|
||||||
|
- **State management:** Immutable state objects, functional transforms
|
||||||
|
- **Error handling:** Custom error types with exit codes
|
||||||
|
- **Plugin system:** Extensible via Helm plugins and Go templates
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Trust these instructions:** This information is validated against the current codebase. Only search for additional details if these instructions are incomplete or found to be incorrect for your specific task.
|
||||||
Loading…
Reference in New Issue