Skip to content

Commit f50b748

Browse files
committed
feat (infra): add helm chart and publish pipeline
Adds a production Helm chart under charts/skyflo/ with templates for all components, CRD, RBAC, secrets, and configmaps. CI publishes to charts.skyflo.ai via GitHub Pages on each release.
1 parent c756565 commit f50b748

55 files changed

Lines changed: 1959 additions & 580 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 91 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ on:
44
push:
55
tags:
66
- "v*"
7+
workflow_dispatch:
8+
inputs:
9+
version:
10+
description: "Chart version to publish (without v prefix, e.g. 0.6.0)"
11+
required: true
712

813
jobs:
9-
publish:
14+
dockerhub:
1015
runs-on: ubuntu-latest
1116
strategy:
1217
fail-fast: false
@@ -29,10 +34,15 @@ jobs:
2934
- name: Extract version metadata
3035
id: meta
3136
run: |
32-
TAG="${GITHUB_REF_NAME}"
33-
IS_TEST="false"
34-
if [[ "$TAG" == *"test"* ]]; then
37+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
38+
TAG="v${{ github.event.inputs.version }}"
3539
IS_TEST="true"
40+
else
41+
TAG="${GITHUB_REF_NAME}"
42+
IS_TEST="false"
43+
if [[ "$TAG" == *"test"* ]]; then
44+
IS_TEST="true"
45+
fi
3646
fi
3747
{
3848
echo "tag=${TAG}"
@@ -78,3 +88,80 @@ jobs:
7888
build-args: |
7989
APP_VERSION=${{ steps.meta.outputs.version }}
8090
NEXT_PUBLIC_APP_VERSION=${{ steps.meta.outputs.version }}
91+
92+
helm:
93+
runs-on: ubuntu-latest
94+
needs: dockerhub
95+
if: always() && !cancelled() && (needs.dockerhub.result == 'success' || needs.dockerhub.result == 'skipped')
96+
permissions:
97+
contents: write
98+
steps:
99+
- name: Checkout repository
100+
uses: actions/checkout@v4
101+
with:
102+
fetch-depth: 0
103+
104+
- name: Extract version
105+
id: meta
106+
run: |
107+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
108+
VERSION="${{ github.event.inputs.version }}"
109+
IS_TEST="false"
110+
else
111+
TAG="${GITHUB_REF_NAME}"
112+
VERSION="${TAG#v}"
113+
IS_TEST="false"
114+
if [[ "$TAG" == *"test"* ]]; then
115+
IS_TEST="true"
116+
fi
117+
fi
118+
{
119+
echo "version=${VERSION}"
120+
echo "is_test=${IS_TEST}"
121+
} >> "$GITHUB_OUTPUT"
122+
123+
- name: Install Helm
124+
uses: azure/setup-helm@v4
125+
126+
- name: Set chart version
127+
run: |
128+
sed -i "s/^version:.*/version: ${{ steps.meta.outputs.version }}/" charts/skyflo/Chart.yaml
129+
sed -i "s/^appVersion:.*/appVersion: \"${{ steps.meta.outputs.version }}\"/" charts/skyflo/Chart.yaml
130+
131+
- name: Package Helm chart
132+
run: helm package charts/skyflo
133+
134+
- name: Publish to charts.skyflo.ai (GitHub Pages)
135+
if: steps.meta.outputs.is_test != 'true'
136+
env:
137+
CHART_PKG: skyflo-${{ steps.meta.outputs.version }}.tgz
138+
run: |
139+
PAGES_DIR=$(mktemp -d)
140+
141+
git config --global user.name "github-actions[bot]"
142+
git config --global user.email "github-actions[bot]@users.noreply.github.com"
143+
144+
if git ls-remote --exit-code --heads origin gh-pages >/dev/null 2>&1; then
145+
git clone --single-branch --branch gh-pages \
146+
"https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" \
147+
"$PAGES_DIR"
148+
else
149+
git init "$PAGES_DIR"
150+
git -C "$PAGES_DIR" checkout --orphan gh-pages
151+
git -C "$PAGES_DIR" remote add origin \
152+
"https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git"
153+
fi
154+
155+
cp "$CHART_PKG" "$PAGES_DIR/"
156+
echo "charts.skyflo.ai" > "$PAGES_DIR/CNAME"
157+
158+
if [ -f "$PAGES_DIR/index.yaml" ]; then
159+
helm repo index "$PAGES_DIR" --url https://charts.skyflo.ai --merge "$PAGES_DIR/index.yaml"
160+
else
161+
helm repo index "$PAGES_DIR" --url https://charts.skyflo.ai
162+
fi
163+
164+
cd "$PAGES_DIR"
165+
git add .
166+
git commit -m "Release skyflo-${{ steps.meta.outputs.version }}"
167+
git push origin gh-pages

CONTRIBUTING.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# Contributing to Skyflo.ai
1+
# Contributing to Skyflo
22

3-
Thank you for considering contributing to Skyflo.ai. This document outlines how to contribute effectively and what standards are expected.
3+
Thank you for considering contributing to Skyflo. This document outlines how to contribute effectively and what standards are expected.
44

55
We are committed to providing a friendly, safe, and welcoming environment for all contributors. Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).
66

7-
Before making changes, read the [Architecture Guide](docs/architecture.md). It explains the system layout and will save you time.
7+
Before making changes, read the [Architecture Guide](https://skyflo.ai/docs/architecture). It explains the system layout and will save you time.
88

99
## Quick Start
1010

@@ -165,14 +165,13 @@ These timelines can be extended if the contributor communicates delays proactive
165165

166166
## License
167167

168-
Skyflo.ai is licensed under the Apache License 2.0.
168+
Skyflo is licensed under the Apache License 2.0.
169169

170170
By contributing, you agree that your contributions are licensed under Apache License 2.0.
171171

172172
## Trademarks
173173

174-
The Skyflo name and logos are trademarks and are **not** covered by the Apache License.
175-
See [TRADEMARKS.md](TRADEMARKS.md) for usage rules.
174+
The Skyflo name and logo are trademarks and are **not** covered by the Apache License. See [TRADEMARKS.md](TRADEMARKS.md) for usage rules.
176175

177176
## Community
178177

README.md

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<p align="center">
22
<a href="https://skyflo.ai">
3-
<img src="./assets/readme.png" alt="Skyflo – Self-Hosted AI Control Layer for Kubernetes and CI/CD (Jenkins)" width="1000"/>
3+
<img src="https://skyflo.ai/assets/hero.png" alt="Skyflo – Self-Hosted AI Agent for Kubernetes and CI/CD" width="1000"/>
44
</a>
55
</p>
66

7-
<h3 align="center">Self-Hosted AI Control Layer for Kubernetes & CI/CD</h3>
7+
<h3 align="center">Self-Hosted AI Agent for Kubernetes & CI/CD</h3>
88

99
<p align="center">
1010
<a href="https://github.com/skyflo-ai/skyflo/actions">
@@ -19,29 +19,64 @@
1919
</p>
2020

2121
<p align="center">
22-
<a href="https://skyflo.ai">Website</a> ·
23-
<a href="docs/install.md">Installation</a> ·
24-
<a href="docs/architecture.md">Architecture</a> ·
22+
<a href="https://skyflo.ai/docs">Docs</a> ·
23+
<a href="https://skyflo.ai/docs/architecture">Architecture</a> ·
2524
<a href="https://discord.gg/kCFNavMund">Discord</a>
2625
</p>
2726

2827
---
2928

30-
Skyflo is a **self-hosted AI operations agent** for **Kubernetes and CI/CD** with **native Jenkins support**. It turns natural language into **typed, auditable tool execution**, enforced by an **approval gate for every mutating operation**.
29+
Infrastructure automation tools fall into two categories.
3130

32-
Skyflo is not a CLI wrapper, not an autonomous mutation bot, and not a GitOps control plane. It is an **in-cluster execution runtime** that enforces deterministic control before anything changes in production.
31+
CLI assistants translate prompts into shell commands.
32+
Autonomous agents execute infrastructure changes without explicit approval.
33+
34+
Neither model guarantees a deterministic execution process or a complete audit trail.
35+
36+
Skyflo is a **self-hosted AI agent for Kubernetes and CI/CD systems**. It runs inside your cluster and executes infrastructure operations through a deterministic control loop:
37+
38+
**Plan → Approve → Execute → Verify**
39+
40+
> Every mutating tool call is approval-gated, typed, and auditable.
41+
42+
Skyflo is not a CLI wrapper, not an autonomous mutation bot, and not a GitOps control plane.
43+
44+
It is an **in-cluster AI control layer** that enforces safe infrastructure changes before anything reaches production.
3345

3446
---
3547

3648
### Quick Start
3749

38-
Install Skyflo inside your Kubernetes cluster:
50+
Install Skyflo inside your Kubernetes cluster.
51+
52+
**Helm:**
53+
54+
```bash
55+
helm repo add skyflo https://charts.skyflo.ai
56+
helm repo update skyflo
57+
helm install skyflo skyflo/skyflo -n skyflo-ai --create-namespace -f values.yaml
58+
```
59+
60+
Minimum `values.yaml`:
61+
62+
```yaml
63+
engine:
64+
secrets:
65+
llmModel: "gemini/gemini-2.5-pro"
66+
moonshotApiKey: "AI-..."
67+
```
68+
69+
See complete [Helm Values Reference](https://github.com/skyflo-ai/skyflo/blob/main/charts/skyflo/values.yaml) for full configuration.
70+
71+
**curl:**
72+
73+
Get started quickly with the interactive installer.
3974
4075
```bash
4176
curl -fsSL https://skyflo.ai/install.sh | bash
4277
```
4378

44-
Bring your own LLM (OpenAI, Anthropic, Gemini, Groq, self-hosted). See [docs/install.md](docs/install.md).
79+
Bring your own LLM (OpenAI, Anthropic, Gemini, Groq, self-hosted). See the [installation guide](https://skyflo.ai/docs/quick-start).
4580

4681
---
4782

@@ -52,7 +87,7 @@ Skyflo enforces a strict loop for every infrastructure change:
5287
1. **Plan**: generate a concrete, replayable plan
5388
2. **Approve**: explicit approval for every mutating tool call
5489
3. **Execute**: run typed tools via MCP (Kubernetes, Helm, Argo Rollouts, Jenkins)
55-
4. **Verify**: validate state against the declared intent
90+
4. **Verify**: validate cluster state against declared intent
5691
5. **Persist**: store tool-level audit history
5792

5893
No blind `kubectl apply`. No silent automation. No untracked changes.
@@ -61,13 +96,12 @@ No blind `kubectl apply`. No silent automation. No untracked changes.
6196

6297
### Safety Properties
6398

64-
* Approval gate for every mutating operation
65-
* Typed tool execution (schema-validated inputs)
99+
* Approval gate for every mutating tool call, enforced by the engine
100+
* Typed tool execution with schema-validated inputs
66101
* Persisted audit trail with tool results
67102
* Replayable control loop (plan → approve → execute → verify)
68-
* Runs inside your cluster (data stays in your environment)
69-
* No outbound data to Skyflo servers
70-
* LLM-agnostic (no vendor lock-in)
103+
* Runs inside your cluster. No Skyflo telemetry or phone-home
104+
* LLM-agnostic via LiteLLM. No vendor lock-in
71105

72106
---
73107

@@ -80,14 +114,14 @@ No blind `kubectl apply`. No silent automation. No untracked changes.
80114
| **Argo Rollouts** | status, pause/resume, promote/cancel, progressive delivery control |
81115
| **Jenkins** | jobs/builds/logs, parameters, SCM context, build control |
82116

83-
All mutating operations require explicit approval.
117+
All mutating tool calls require explicit approval.
84118

85119
---
86120

87121
### Demo
88122

89123
<p align="center">
90-
<img src="assets/demo.gif" alt="Skyflo Demo" width="100%"/>
124+
<img src="https://skyflo.ai/assets/demo.gif" alt="Skyflo Demo" width="100%"/>
91125
</p>
92126

93127
Deterministic plans. Explicit approval. Verified execution.
@@ -116,7 +150,7 @@ Deterministic plans. Explicit approval. Verified execution.
116150
| [**MCP Server**](mcp) | Typed tools for Kubernetes, Helm, Argo Rollouts, Jenkins |
117151
| [**Command Center**](ui) | Next.js UI with real-time streaming, approvals, team admin |
118152

119-
Details: [docs/architecture.md](docs/architecture.md)
153+
Details: [Architecture](https://skyflo.ai/docs/architecture)
120154

121155
---
122156

@@ -135,7 +169,7 @@ Apache 2.0. See [LICENSE](LICENSE).
135169
### Community
136170

137171
<p>
138-
<a href="https://skyflo.ai">Website</a> ·
172+
<a href="https://skyflo.ai/docs">Docs</a> ·
139173
<a href="https://discord.gg/kCFNavMund">Discord</a> ·
140174
<a href="https://x.com/skyflo_ai">X</a> ·
141175
<a href="https://www.linkedin.com/company/skyflo">LinkedIn</a>

charts/skyflo/.helmignore

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.DS_Store
2+
*.swp
3+
*.bak
4+
*.tmp
5+
*.orig
6+
*~
7+
.git
8+
.gitignore
9+
.bzr
10+
.bzrignore
11+
.hg
12+
.hgignore
13+
.svn

charts/skyflo/Chart.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: v2
2+
name: skyflo
3+
description: Self-hosted AI control layer for Kubernetes and CI/CD systems
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
7+
home: https://skyflo.ai
8+
sources:
9+
- https://github.com/skyflo-ai/skyflo
10+
maintainers:
11+
- name: skyflo-ai
12+
url: https://github.com/skyflo-ai
13+
keywords:
14+
- kubernetes
15+
- ai
16+
- infrastructure
17+
- cicd
18+
- mcp

0 commit comments

Comments
 (0)