UNPKG

@kubeasy-dev/kubeasy-cli

Version:

Command Line to interact with kubeasy.dev and challenges

353 lines (248 loc) 8.46 kB
# CI/CD Pipeline This document describes the continuous integration and deployment pipeline for `kubeasy-cli`. ## Overview The CI/CD pipeline is built with GitHub Actions and handles: - ✅ Code quality checks (linting, testing) - 📦 Multi-platform binary builds - 🚀 Automated releases to GitHub and NPM - 🔄 Automated dependency updates ## Workflows ### 1. Linting (`lint.yml`) **Triggers:** Push to `main`, Pull Requests **Purpose:** Ensure code quality and consistency **Steps:** 1. Run `golangci-lint` with project configuration 2. Check for common Go issues (unused code, complexity, etc.) 3. Validate GitHub Actions workflow files **Configuration:** `.github/linters/.golangci.yml` ### 2. Manual Release (`release-dispatch.yml`) **Triggers:** Manual workflow dispatch **Purpose:** Create new releases with version bump **Usage:** 1. Navigate to [Actions → Manual Release](https://github.com/kubeasy-dev/kubeasy-cli/actions/workflows/release-dispatch.yml) 2. Click "Run workflow" 3. Select version type: - `patch` - Bug fixes (1.0.0 → 1.0.1) - `minor` - New features (1.0.0 → 1.1.0) - `major` - Breaking changes (1.0.0 → 2.0.0) **What happens:** 1. **Pre-release validation:** - Verify on `main` branch - Check working directory is clean - Run tests with race detector - Run linters - Test build 2. **Version bump:** - Calculate new version - Update `package.json` and `package-lock.json` - Create commit: `chore: release vX.Y.Z` - Create tag: `vX.Y.Z` 3. **Trigger release:** - Push commit and tag to GitHub - Automatically triggers the release workflow ### 3. Release Build (`releasing.yml`) **Triggers:** Git tags matching `v*.*.*` (e.g., `v1.0.0`) **Purpose:** Build binaries and publish to all platforms **Steps:** #### Pre-release Checks - Run full test suite - Run linters - Test build #### Build Phase (GoReleaser) - Build binaries for 6 platforms: - Linux: amd64, arm64 - macOS: amd64 (Intel), arm64 (Apple Silicon) - Windows: amd64, arm64 - Generate checksums - Upload binaries to Cloudflare R2 - Create GitHub Release with artifacts #### NPM Publish Phase - Wait for binaries to be available on R2 - Run `npm ci` and `npm publish` - Publish `@kubeasy-dev/kubeasy-cli` package **Artifacts:** - GitHub Release with binaries and checksums - NPM package with binary downloader - Binaries on `https://download.kubeasy.dev` ### 4. AI Code Review (`claude-code-review.yml`) **Triggers:** Pull Requests **Purpose:** AI-powered code review with Claude **What it does:** - Analyzes code changes - Provides suggestions for improvements - Identifies potential issues ## Release Process ### Automated Release (Recommended) The easiest way to create a release: ``` 1. Go to GitHub Actions → Manual Release 2. Click "Run workflow" 3. Select version type (patch/minor/major) 4. Click "Run workflow" 5. Monitor progress in GitHub Actions ``` ### Manual Release (Alternative) If you need more control: ```bash # 1. Ensure you're on main and up to date git checkout main git pull origin main # 2. Run pre-release checks go test -v -race ./... golangci-lint run --config .github/linters/.golangci.yml go build . # 3. Create version and tag npm version patch # or minor/major git push --follow-tags ``` ## Configuration Files ### `.goreleaser.yaml` Defines the release build process: - Binary build settings (LDFLAGS, platforms, architectures) - Archive formats (tar.gz for Unix, zip for Windows) - Cloudflare R2 upload configuration - Changelog generation rules Key features: - Cross-compilation for all platforms - Version injection via LDFLAGS - Custom binary names and paths - Automated changelog from commits ### `package.json` NPM package configuration: - Package metadata and version - Binary download script in `postinstall` - Release scripts The NPM package acts as a wrapper that: 1. Detects user's platform (OS + architecture) 2. Downloads the correct binary from R2 3. Installs it globally as `kubeasy` ## Monitoring Releases ### GitHub Actions Monitor workflow runs: - https://github.com/kubeasy-dev/kubeasy-cli/actions Check for: - ✅ Green checkmarks (success) - ❌ Red X marks (failure) - ⏳ Yellow dots (in progress) ### GitHub Releases View published releases: - https://github.com/kubeasy-dev/kubeasy-cli/releases Each release includes: - Release notes (auto-generated from commits) - Binary downloads for all platforms - Checksums file (`checksums.txt`) ### NPM Package Check NPM publication: - https://www.npmjs.com/package/@kubeasy-dev/kubeasy-cli Verify: - Latest version is published - Package size is reasonable (~5-10 KB) - Install works: `npm install -g @kubeasy-dev/kubeasy-cli` ## Troubleshooting ### Release Workflow Fails on Pre-checks **Problem:** Tests or linters fail **Solution:** ```bash # Run locally to identify issue go test -v ./... golangci-lint run --config .github/linters/.golangci.yml # Fix issues, commit, and retry ``` ### NPM Publish Fails **Problem:** Package already exists or authentication fails **Solutions:** - Check if version already exists on NPM - Verify `NPM_TOKEN` secret is valid - Ensure token has publish permissions ### Binary Download Fails **Problem:** Users can't download binaries after NPM install **Solutions:** - Verify binaries are uploaded to R2: `https://download.kubeasy.dev/kubeasy-cli/vX.Y.Z/` - Check R2 credentials are valid - Ensure sufficient wait time in NPM publish job ### GoReleaser Build Fails **Problem:** Build fails for specific platform **Solutions:** - Test locally: `goreleaser release --snapshot --clean` - Check `.goreleaser.yaml` configuration - Verify LDFLAGS and build tags ## Security ### Secrets Management Required secrets in GitHub repository settings: - `GITHUB_TOKEN` - Auto-provided, used for releases - `NPM_TOKEN` - NPM authentication for publishing - `R2_ACCESS_KEY_ID` - Cloudflare R2 access key - `R2_SECRET_ACCESS_KEY` - Cloudflare R2 secret key ### Permissions Workflows use minimal permissions: - `contents: read` - Read repository code - `contents: write` - Create releases and tags - `id-token: write` - OIDC authentication ### Action Pinning All GitHub Actions are pinned to specific SHA hashes for security: ```yaml uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 ``` This prevents supply chain attacks from compromised action versions. ## Performance Optimizations ### Caching Workflows use caching to speed up builds: - **Go modules cache:** Dependencies are cached between runs - **Build cache:** Go build artifacts are cached - **Action cache:** Downloaded actions are cached Typical speedup: 2-3 minutes per workflow run ### Parallel Jobs Jobs run in parallel when possible: - Pre-release checks run before build - Build and NPM publish can run in parallel (NPM waits for R2) ### Smart Dependencies - Use `go mod download` explicitly for better caching - Only download dependencies when `go.sum` changes ## Best Practices ### Before Creating a Release 1. ✅ All tests pass locally 2. ✅ No linter warnings 3. ✅ Changes are merged to `main` 4. ✅ CHANGELOG or commit messages are clear 5. ✅ Version bump type is appropriate ### Semantic Versioning Follow [semver](https://semver.org/): - **Patch** (1.0.0 → 1.0.1) - Backward-compatible bug fixes - **Minor** (1.0.0 → 1.1.0) - Backward-compatible features - **Major** (1.0.0 → 2.0.0) - Breaking changes ### Commit Messages Use [Conventional Commits](https://www.conventionalcommits.org/): ``` feat: add new command fix: resolve authentication issue docs: update installation guide chore: update dependencies ``` These are used to auto-generate release notes. ## Local Testing ### Test Release Build Test the full release process without publishing: ```bash # Install GoReleaser brew install goreleaser # Run snapshot build goreleaser release --snapshot --clean # Check artifacts ls -lh dist/ ``` This creates binaries in `dist/` without creating a release. ### Test NPM Package Locally Test the NPM package installation: ```bash # Build binaries task build # Test NPM package npm pack npm install -g kubeasy-dev-kubeasy-cli-*.tgz # Verify installation kubeasy version ``` ## Related Documentation - [CONTRIBUTING.md](../CONTRIBUTING.md) - Development workflow - [README.md](../README.md) - Project overview - [.github/workflows/README.md](../.github/workflows/README.md) - Workflow details