From c3e4ceda8a225356c0247079ef88ef737ba6a721 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 15:24:42 +0000 Subject: [PATCH 1/7] Add onboarding orchestration CLI and Chennai FOSS demo assets Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- cli/devopsos.py | 44 ++ cli/onboard.py | 455 ++++++++++++++++++ cli/test_cli.py | 74 +++ .../chennai-foss-2026/demo-command-list.md | 5 + .../.devcontainer/devcontainer.env.json | 68 +++ .../.devcontainer/devcontainer.json | 81 ++++ .../workflows/go-idp-service-complete.yml | 99 ++++ .../go-idp-service/onboarding-summary.json | 131 +++++ .../go-idp-service/unittest/Makefile.test | 26 + .../unittest/go_idp_service_test.go | 37 ++ .../demo-source/go-idp-service/README.md | 3 + .../demo-source/go-idp-service/go.mod | 3 + .../demo-source/go-idp-service/main.go | 19 + .../idp-onboarding-demo.html | 400 +++++++++++++++ .../content/docs/talks/chennai-foss-2026.md | 1 + .../.devcontainer/devcontainer.env.json | 68 +++ .../.devcontainer/devcontainer.json | 81 ++++ .../workflows/go-idp-service-complete.yml | 99 ++++ .../go-idp-service/onboarding-summary.json | 131 +++++ .../go-idp-service/unittest/Makefile.test | 26 + .../unittest/go_idp_service_test.go | 37 ++ .../idp-onboarding-demo.html | 400 +++++++++++++++ 22 files changed, 2288 insertions(+) create mode 100644 cli/onboard.py create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test create mode 100644 feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod create mode 100644 feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go create mode 100644 feature-announcements/chennai-foss-2026/idp-onboarding-demo.html create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go create mode 100644 hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html diff --git a/cli/devopsos.py b/cli/devopsos.py index 915a093..e83e9ec 100644 --- a/cli/devopsos.py +++ b/cli/devopsos.py @@ -17,6 +17,7 @@ import cli.scaffold_devcontainer as scaffold_devcontainer import cli.scaffold_unittest as scaffold_unittest import cli.process_first as process_first +import cli.onboard as onboard from cli import __version__ class ProcessFirstSection(str, enum.Enum): @@ -61,6 +62,7 @@ def main( python -m cli.devopsos scaffold sre --help # SRE resources (SLOs, alerts, dashboards) python -m cli.devopsos scaffold devcontainer --help # dev container configuration python -m cli.devopsos scaffold cicd --help # combined CI/CD scaffold + python -m cli.devopsos onboard --repo . # onboarding POC for a local repo python -m cli.devopsos process-first # Process-First SDLC overview python -m cli.devopsos --version # show installed version """ @@ -843,6 +845,48 @@ def _sel(group): return selected_by_group.get(group, []) typer.echo("Dockerfile uses build args; ensure it references the correct ARGs.") +@app.command("onboard") +def onboard_cmd( + repo: str = typer.Option(".", "--repo", help="Local git repository path to analyze"), + repo_url: str = typer.Option("", "--repo-url", help="Optional repository URL shown in the dashboard"), + name: str = typer.Option("demo-app", "--name", help="Application name used in generated assets"), + output_dir: str = typer.Option("", "--output-dir", help="Output directory for generated assets (defaults to repo path)"), + enable_ci: bool = typer.Option(True, "--enable-ci/--disable-ci", help="Generate GitHub Actions CI assets"), + enable_unittest: bool = typer.Option(True, "--enable-unittest/--disable-unittest", help="Generate unit test scaffold assets"), + enable_container: bool = typer.Option(True, "--enable-container/--disable-container", help="Generate container/devcontainer assets"), + enable_cd: bool = typer.Option(False, "--enable-cd/--disable-cd", help="Generate ArgoCD GitOps assets"), + enable_sre: bool = typer.Option(False, "--enable-sre/--disable-sre", help="Generate SRE/monitoring assets"), +): + """Analyze a repo and scaffold a lightweight IDP onboarding POC.""" + flags = [ + "--repo", repo, + "--repo-url", repo_url, + "--name", name, + "--output-dir", output_dir, + ] + if enable_ci: + flags.append("--enable-ci") + else: + flags.append("--disable-ci") + if enable_unittest: + flags.append("--enable-unittest") + else: + flags.append("--disable-unittest") + if enable_container: + flags.append("--enable-container") + else: + flags.append("--disable-container") + if enable_cd: + flags.append("--enable-cd") + else: + flags.append("--disable-cd") + if enable_sre: + flags.append("--enable-sre") + else: + flags.append("--disable-sre") + _run_scaffold(onboard.main, flags) + + @app.command("process-first") def process_first_cmd( section: ProcessFirstSection = typer.Option( diff --git a/cli/onboard.py b/cli/onboard.py new file mode 100644 index 0000000..23e1a26 --- /dev/null +++ b/cli/onboard.py @@ -0,0 +1,455 @@ +#!/usr/bin/env python3 +""" +DevOps-OS onboarding POC orchestration for the Chennai FOSS demo. + +This module analyzes a local Git repository, detects the primary language, +reuses the existing DevOps-OS scaffold generators, and writes a compact JSON +summary that can be consumed by a static dashboard page. +""" + +from __future__ import annotations + +import argparse +import json +import os +import subprocess +import sys +from collections import Counter +from pathlib import Path +from typing import Any + +from cli import scaffold_argocd, scaffold_devcontainer, scaffold_gha, scaffold_sre, scaffold_unittest + + +ENV_PREFIX = "DEVOPS_OS_ONBOARD_" + +LANGUAGE_EXTENSIONS = { + "go": {".go"}, + "python": {".py"}, + "javascript": {".js", ".jsx", ".mjs", ".cjs"}, + "typescript": {".ts", ".tsx"}, + "java": {".java"}, +} + +IGNORED_DIRS = { + ".git", + ".venv", + "venv", + "__pycache__", + "node_modules", + ".idea", + ".vscode", + ".pytest_cache", + "dist", + "build", + ".next", + ".turbo", + ".github", + ".devcontainer", + "argocd", + "flux", + "sre", + "unittest", +} + +DEVCONTAINER_LANGS = {"go", "python", "javascript", "typescript", "java"} +UNITTEST_LANGS = {"go", "python", "javascript", "typescript"} + + +def parse_arguments() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Analyze a repo and scaffold a Chennai FOSS onboarding demo output." + ) + parser.add_argument( + "--repo", + default=os.environ.get(f"{ENV_PREFIX}REPO", "."), + help="Local git repository path to analyze and scaffold.", + ) + parser.add_argument( + "--repo-url", + default=os.environ.get(f"{ENV_PREFIX}REPO_URL", ""), + help="Optional repository URL shown in the dashboard.", + ) + parser.add_argument( + "--name", + default=os.environ.get(f"{ENV_PREFIX}NAME", "demo-app"), + help="Application name used in generated templates.", + ) + parser.add_argument( + "--output-dir", + default=os.environ.get(f"{ENV_PREFIX}OUTPUT_DIR", ""), + help="Output directory for generated assets. Defaults to the repo path.", + ) + parser.add_argument( + "--enable-ci", + dest="enable_ci", + action="store_true", + default=os.environ.get(f"{ENV_PREFIX}ENABLE_CI", "true").lower() in ("1", "true", "yes"), + help="Generate GitHub Actions CI assets.", + ) + parser.add_argument("--disable-ci", dest="enable_ci", action="store_false") + parser.add_argument( + "--enable-unittest", + dest="enable_unittest", + action="store_true", + default=os.environ.get(f"{ENV_PREFIX}ENABLE_UNITTEST", "true").lower() + in ("1", "true", "yes"), + help="Generate unit test scaffold assets.", + ) + parser.add_argument("--disable-unittest", dest="enable_unittest", action="store_false") + parser.add_argument( + "--enable-container", + dest="enable_container", + action="store_true", + default=os.environ.get(f"{ENV_PREFIX}ENABLE_CONTAINER", "true").lower() + in ("1", "true", "yes"), + help="Generate container/devcontainer assets.", + ) + parser.add_argument("--disable-container", dest="enable_container", action="store_false") + parser.add_argument( + "--enable-cd", + dest="enable_cd", + action="store_true", + default=os.environ.get(f"{ENV_PREFIX}ENABLE_CD", "false").lower() in ("1", "true", "yes"), + help="Generate ArgoCD GitOps assets.", + ) + parser.add_argument("--disable-cd", dest="enable_cd", action="store_false") + parser.add_argument( + "--enable-sre", + dest="enable_sre", + action="store_true", + default=os.environ.get(f"{ENV_PREFIX}ENABLE_SRE", "false").lower() in ("1", "true", "yes"), + help="Generate SRE/monitoring assets.", + ) + parser.add_argument("--disable-sre", dest="enable_sre", action="store_false") + return parser.parse_args() + + +def _run_module_main(module_main, flags: list[str]) -> None: + saved = sys.argv[:] + sys.argv = sys.argv[:1] + flags + try: + module_main() + except SystemExit as exc: + if exc.code not in (None, 0): + raise RuntimeError(f"Generator exited with code {exc.code}: {' '.join(flags)}") from exc + finally: + sys.argv = saved + + +def _git(repo_path: Path, *args: str) -> str: + result = subprocess.run( + ["git", "-C", str(repo_path), *args], + capture_output=True, + text=True, + check=False, + ) + if result.returncode != 0: + raise RuntimeError(result.stderr.strip() or f"git {' '.join(args)} failed") + return result.stdout.strip() + + +def _relative_to_output(output_dir: Path, path: Path) -> str: + try: + return str(path.resolve().relative_to(output_dir.resolve())) + except ValueError: + return str(path.resolve()) + + +def _safe_read_preview(path: Path, limit: int = 220) -> str: + try: + content = path.read_text() + except UnicodeDecodeError: + content = path.read_text(encoding="utf-8", errors="replace") + return content[:limit].strip() + + +def _find_first_file(path: Path) -> Path: + if path.is_file(): + return path + for candidate in sorted(path.rglob("*")): + if candidate.is_file(): + return candidate + return path + + +def detect_primary_language(repo_path: Path) -> tuple[str, dict[str, int]]: + counts: Counter[str] = Counter() + for root, dirs, files in os.walk(repo_path): + dirs[:] = [d for d in dirs if d not in IGNORED_DIRS] + for file_name in files: + extension = Path(file_name).suffix.lower() + for language, extensions in LANGUAGE_EXTENSIONS.items(): + if extension in extensions: + counts[language] += 1 + if not counts: + return "unknown", {} + primary_language = sorted(counts.items(), key=lambda item: (-item[1], item[0]))[0][0] + return primary_language, dict(counts) + + +def analyze_repository(repo_path: Path, repo_url: str = "") -> dict[str, Any]: + branch = _git(repo_path, "rev-parse", "--abbrev-ref", "HEAD") + commit = _git(repo_path, "rev-parse", "--short", "HEAD") + if repo_url: + detected_url = repo_url + else: + try: + detected_url = _git(repo_path, "config", "--get", "remote.origin.url") + except RuntimeError: + detected_url = "" + primary_language, language_counts = detect_primary_language(repo_path) + recommended = { + "ci": True, + "unittest": primary_language in UNITTEST_LANGS, + "container": primary_language in DEVCONTAINER_LANGS, + "cd": False, + "sre": False, + } + return { + "repo_path": str(repo_path.resolve()), + "repo_url": detected_url, + "branch": branch, + "commit": commit, + "primary_language": primary_language, + "language_counts": language_counts, + "recommended_templates": recommended, + } + + +def _workflow_filename(name: str) -> str: + return f"{name.lower().replace(' ', '-')}-complete.yml" + + +def generate_onboarding_assets( + repo_path: Path, + output_dir: Path, + name: str, + repo_url: str, + enable_ci: bool, + enable_unittest: bool, + enable_container: bool, + enable_cd: bool, + enable_sre: bool, +) -> dict[str, Any]: + analysis = analyze_repository(repo_path, repo_url=repo_url) + language = analysis["primary_language"] + languages_for_scaffold = language if language != "unknown" else "python" + + output_dir.mkdir(parents=True, exist_ok=True) + artifact_records: list[dict[str, str]] = [] + + if enable_ci: + gha_flags = [ + "--name", + name, + "--languages", + languages_for_scaffold, + "--type", + "complete", + "--output", + str(output_dir / ".github" / "workflows"), + ] + if enable_cd: + gha_flags += ["--kubernetes", "--k8s-method", "argocd"] + _run_module_main(scaffold_gha.main, gha_flags) + workflow_path = output_dir / ".github" / "workflows" / _workflow_filename(name) + artifact_records.append( + { + "key": "ci", + "label": "GitHub Actions workflow", + "path": _relative_to_output(output_dir, workflow_path), + "preview": _safe_read_preview(workflow_path), + } + ) + + if enable_unittest: + _run_module_main( + scaffold_unittest.main, + [ + "--name", + name, + "--languages", + languages_for_scaffold, + "--output-dir", + str(output_dir / "unittest"), + ], + ) + unit_target = output_dir / "unittest" + artifact_records.append( + { + "key": "unittest", + "label": "Unit test scaffold", + "path": _relative_to_output(output_dir, unit_target), + "preview": _safe_read_preview(_find_first_file(unit_target)), + } + ) + + if enable_container: + devops_tools = [] + if enable_sre: + devops_tools = ["prometheus", "grafana"] + kubernetes_tools = ["kubectl", "helm"] + if enable_cd: + kubernetes_tools.extend(["argocd_cli", "flux"]) + _run_module_main( + scaffold_devcontainer.main, + [ + "--languages", + languages_for_scaffold, + "--cicd-tools", + "docker,github_actions", + "--kubernetes-tools", + ",".join(kubernetes_tools), + "--devops-tools", + ",".join(devops_tools), + "--output-dir", + str(output_dir), + ], + ) + devcontainer_path = output_dir / ".devcontainer" / "devcontainer.json" + artifact_records.append( + { + "key": "container", + "label": "Dev container / container baseline", + "path": _relative_to_output(output_dir, devcontainer_path), + "preview": _safe_read_preview(devcontainer_path), + } + ) + + if enable_cd: + _run_module_main( + scaffold_argocd.main, + [ + "--name", + name, + "--repo", + analysis["repo_url"] or "https://github.com/cloudengine-labs/devops_os.git", + "--path", + "k8s", + "--auto-sync", + "--output-dir", + str(output_dir), + ], + ) + argocd_path = output_dir / "argocd" / "application.yaml" + artifact_records.append( + { + "key": "cd", + "label": "ArgoCD deployment template", + "path": _relative_to_output(output_dir, argocd_path), + "preview": _safe_read_preview(argocd_path), + } + ) + + if enable_sre: + _run_module_main( + scaffold_sre.main, + [ + "--name", + name, + "--team", + "platform", + "--slo-target", + "99.9", + "--output-dir", + str(output_dir / "sre"), + ], + ) + sre_path = output_dir / "sre" / "grafana-dashboard.json" + artifact_records.append( + { + "key": "sre", + "label": "SRE dashboard template", + "path": _relative_to_output(output_dir, sre_path), + "preview": _safe_read_preview(sre_path), + } + ) + + stages = [ + {"key": "connected", "label": "Repo connected", "state": "done"}, + {"key": "analysed", "label": "Branch / commit detected", "state": "done"}, + {"key": "language", "label": f"Language detected: {analysis['primary_language']}", "state": "done"}, + {"key": "ci", "label": "CI scaffolded", "state": "done" if enable_ci else "skipped"}, + { + "key": "unittest", + "label": "Unit tests scaffolded", + "state": "done" if enable_unittest else "skipped", + }, + { + "key": "container", + "label": "Containerization scaffolded", + "state": "done" if enable_container else "skipped", + }, + {"key": "cd", "label": "CD scaffolded", "state": "done" if enable_cd else "skipped"}, + {"key": "sre", "label": "SRE scaffolded", "state": "done" if enable_sre else "skipped"}, + {"key": "review", "label": "Ready for review", "state": "done"}, + ] + + summary = { + "demo": { + "title": "Chennai FOSS IDP Onboarding POC", + "app_name": name, + "status_model": [ + "Connected", + "Analysed", + "Templates selected", + "Generated", + "Ready for review", + "Optional deploy enabled", + "Optional observability enabled", + ], + "todo": { + "jira": [ + "Create onboarding tasks automatically", + "Link generated assets to epics or stories", + "Sync dashboard stage updates back to Jira", + ], + "cloud": [ + "Add cloud target selection during onboarding", + "Generate cloud-specific deployment overlays", + "Show environment and rollout status in the dashboard", + ], + }, + }, + "repo": analysis, + "selected_templates": { + "ci": enable_ci, + "unittest": enable_unittest, + "container": enable_container, + "cd": enable_cd, + "sre": enable_sre, + }, + "stages": stages, + "artifacts": artifact_records, + "generated_output_dir": str(output_dir.resolve()), + } + + summary_path = output_dir / "onboarding-summary.json" + summary_path.write_text(json.dumps(summary, indent=2)) + return summary + + +def main() -> None: + args = parse_arguments() + repo_path = Path(args.repo).resolve() + if not repo_path.exists() or not repo_path.is_dir(): + raise SystemExit(f"Repository path does not exist or is not a directory: {repo_path}") + + output_dir = Path(args.output_dir).resolve() if args.output_dir else repo_path + summary = generate_onboarding_assets( + repo_path=repo_path, + output_dir=output_dir, + name=args.name, + repo_url=args.repo_url, + enable_ci=args.enable_ci, + enable_unittest=args.enable_unittest, + enable_container=args.enable_container, + enable_cd=args.enable_cd, + enable_sre=args.enable_sre, + ) + print(json.dumps(summary, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/cli/test_cli.py b/cli/test_cli.py index 48884e0..add78df 100644 --- a/cli/test_cli.py +++ b/cli/test_cli.py @@ -31,6 +31,7 @@ def test_help(): assert "DevOps-OS" in out assert "scaffold" in out assert "init" in out + assert "onboard" in out assert "Examples:" in out @@ -118,6 +119,79 @@ def test_init_checkbox_includes_space_instruction(): f"instruction '{instruction}' should mention Space so users know how to select" ) + +def test_onboard_help_shows_repo_option(): + result = _run(["-m", "cli.devopsos", "onboard", "--help"]) + assert result.returncode == 0 + out = _strip_ansi(result.stdout) + assert "--repo" in out + assert "--enable-cd" in out + assert "--enable-sre" in out + + +def test_onboard_generates_summary_and_assets_for_go_repo(): + with tempfile.TemporaryDirectory() as repo_tmp, tempfile.TemporaryDirectory() as out_tmp: + repo = Path(repo_tmp) + (repo / "go.mod").write_text("module example.com/go-demo\n\ngo 1.22\n") + (repo / "main.go").write_text( + 'package main\n\nimport "fmt"\n\nfunc main() {\n\tfmt.Println("hello")\n}\n' + ) + subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True, text=True) + subprocess.run( + ["git", "config", "user.name", "DevOps OS"], + cwd=repo, + check=True, + capture_output=True, + text=True, + ) + subprocess.run( + ["git", "config", "user.email", "devops-os@example.com"], + cwd=repo, + check=True, + capture_output=True, + text=True, + ) + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True, text=True) + subprocess.run( + ["git", "commit", "-m", "Initial commit"], + cwd=repo, + check=True, + capture_output=True, + text=True, + ) + + result = _run( + [ + "-m", + "cli.devopsos", + "onboard", + "--repo", + repo_tmp, + "--repo-url", + "https://example.com/go-demo.git", + "--name", + "go-demo", + "--output-dir", + out_tmp, + "--enable-cd", + "--enable-sre", + ] + ) + assert result.returncode == 0, result.stderr + + summary_path = Path(out_tmp) / "onboarding-summary.json" + assert summary_path.exists() + summary = json.loads(summary_path.read_text()) + assert summary["repo"]["primary_language"] == "go" + assert summary["repo"]["commit"] + assert summary["selected_templates"]["cd"] is True + assert summary["selected_templates"]["sre"] is True + assert (Path(out_tmp) / ".github" / "workflows" / "go-demo-complete.yml").exists() + assert (Path(out_tmp) / "unittest").exists() + assert (Path(out_tmp) / ".devcontainer" / "devcontainer.json").exists() + assert (Path(out_tmp) / "argocd" / "application.yaml").exists() + assert (Path(out_tmp) / "sre" / "grafana-dashboard.json").exists() + def test_init_selections_written_to_config(): """Selections made in the wizard must be reflected as True in devcontainer.env.json.""" from unittest.mock import MagicMock, patch diff --git a/feature-announcements/chennai-foss-2026/demo-command-list.md b/feature-announcements/chennai-foss-2026/demo-command-list.md index 90d7808..6b1b913 100644 --- a/feature-announcements/chennai-foss-2026/demo-command-list.md +++ b/feature-announcements/chennai-foss-2026/demo-command-list.md @@ -2,6 +2,11 @@ This demo should show **Process-First DevOps automation for a Go service** with the fewest commands possible, while still telling the full story from **build → test → deploy → monitoring**. +## IDP onboarding POC page + +- Open the lightweight onboarding dashboard: `feature-announcements/chennai-foss-2026/idp-onboarding-demo.html` +- Demo output is backed by the generated sample app assets in `feature-announcements/chennai-foss-2026/demo-output/go-idp-service/` + ## Demo objective Show that DevOps-OS can act as a **self-service internal developer platform (IDP) entry point** where platform teams publish reusable templates and application teams consume them with simple CLI commands. diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json new file mode 100644 index 0000000..c67d782 --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json @@ -0,0 +1,68 @@ +{ + "languages": { + "python": false, + "java": false, + "node": false, + "ruby": false, + "csharp": false, + "php": false, + "rust": false, + "typescript": false, + "kotlin": false, + "c": false, + "cpp": false, + "javascript": false, + "go": true + }, + "cicd": { + "docker": true, + "podman": false, + "terraform": false, + "kubectl": false, + "helm": false, + "github_actions": true, + "jenkins": false + }, + "kubernetes": { + "k9s": false, + "kustomize": false, + "argocd_cli": true, + "lens": false, + "kubeseal": false, + "flux": true, + "kind": false, + "minikube": false, + "openshift_cli": false + }, + "build_tools": { + "gradle": false, + "maven": false, + "ant": false, + "make": false, + "cmake": false + }, + "code_analysis": { + "sonarqube": false, + "checkstyle": false, + "pmd": false, + "eslint": false, + "pylint": false + }, + "devops_tools": { + "nexus": false, + "prometheus": true, + "grafana": true, + "elk": false, + "jenkins": false + }, + "versions": { + "python": "3.12", + "java": "21", + "node": "22", + "go": "1.25.0", + "argocd": "3.3.6", + "flux": "2.8.5", + "prometheus": "3.5.1", + "grafana": "12.4.2" + } +} \ No newline at end of file diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json new file mode 100644 index 0000000..da9675a --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json @@ -0,0 +1,81 @@ +{ + "name": "DevOps OS - Multi-Language Development Environment", + "build": { + "dockerfile": "Dockerfile", + "args": { + "INSTALL_PYTHON": "false", + "INSTALL_JAVA": "false", + "INSTALL_JS": "false", + "INSTALL_RUBY": "false", + "INSTALL_CSHARP": "false", + "INSTALL_PHP": "false", + "INSTALL_RUST": "false", + "INSTALL_TYPESCRIPT": "false", + "INSTALL_KOTLIN": "false", + "INSTALL_C": "false", + "INSTALL_CPP": "false", + "INSTALL_GO": "true", + "INSTALL_DOCKER": "true", + "INSTALL_PODMAN": "false", + "INSTALL_TERRAFORM": "false", + "INSTALL_KUBECTL": "false", + "INSTALL_HELM": "false", + "INSTALL_GITHUB_ACTIONS": "true", + "INSTALL_JENKINS": "false", + "INSTALL_K9S": "false", + "INSTALL_KUSTOMIZE": "false", + "INSTALL_ARGOCD_CLI": "true", + "INSTALL_LENS": "false", + "INSTALL_KUBESEAL": "false", + "INSTALL_FLUX": "true", + "INSTALL_KIND": "false", + "INSTALL_MINIKUBE": "false", + "INSTALL_OPENSHIFT_CLI": "false", + "INSTALL_GRADLE": "false", + "INSTALL_MAVEN": "false", + "INSTALL_ANT": "false", + "INSTALL_MAKE": "false", + "INSTALL_CMAKE": "false", + "INSTALL_SONARQUBE": "false", + "INSTALL_CHECKSTYLE": "false", + "INSTALL_PMD": "false", + "INSTALL_ESLINT": "false", + "INSTALL_PYLINT": "false", + "INSTALL_NEXUS": "false", + "INSTALL_PROMETHEUS": "true", + "INSTALL_GRAFANA": "true", + "INSTALL_ELK": "false", + "GO_VERSION": "1.25.0", + "ARGOCD_VERSION": "3.3.6", + "FLUX_VERSION": "2.8.5", + "PROMETHEUS_VERSION": "3.5.1", + "GRAFANA_VERSION": "12.4.2" + } + }, + "mounts": [ + "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" + ], + "customizations": { + "vscode": { + "extensions": [ + "golang.go", + "ms-azuretools.vscode-docker", + "ms-kubernetes-tools.vscode-kubernetes-tools", + "mindaro.mindaro", + "argoproj.argocd-vscode-extension", + "weaveworks.vscode-gitops-tools", + "github.vscode-github-actions", + "github.copilot", + "github.copilot-chat", + "ms-vsliveshare.vsliveshare", + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens" + ] + } + }, + "forwardPorts": [ + 9090, + 3000 + ], + "postCreateCommand": "chmod +x /workspaces/.devcontainer/k8s-config-generator.py && ln -sf /workspaces/.devcontainer/k8s-config-generator.py /usr/local/bin/k8s-config-generator" +} \ No newline at end of file diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml new file mode 100644 index 0000000..69c665a --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml @@ -0,0 +1,99 @@ +name: go-idp-service CI/CD +'on': + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + inputs: + environment: + description: Environment to deploy to + required: true + default: dev + type: choice + options: + - dev + - test + - staging + - prod +jobs: + build: + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up build environment + run: echo 'Setting up build environment for DevOps-OS' + - name: Build Go application + run: if [ -f go.mod ]; then go build -v ./...; fi + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: build-artifacts + path: dist/ + retention-days: 1 + test: + needs: + - build + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up test environment + run: echo 'Setting up test environment for DevOps-OS' + - name: Run Go tests + run: if [ -f go.mod ]; then go test -v ./...; fi + - name: Upload test results + uses: actions/upload-artifact@v3 + with: + name: test-results + path: test-reports/ + retention-days: 1 + - name: Upload coverage reports + uses: codecov/codecov-action@v3 + with: + files: ./coverage.xml,./coverage/lcov.info + fail_ci_if_error: false + deploy: + needs: + - test + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up deployment environment + run: echo 'Setting up deployment environment for DevOps-OS' + - name: Build and Push Docker Image + if: github.ref == 'refs/heads/main' + run: 'echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor + }} --password-stdin + + docker build -t ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name + }}:latest . + + docker push ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name + }}:latest' + - name: Deploy with ArgoCD + if: github.ref == 'refs/heads/main' + run: 'argocd login $ARGOCD_SERVER --username $ARGOCD_USERNAME --password $ARGOCD_PASSWORD + --insecure + + argocd app sync my-application + + argocd app wait my-application --health' + env: + ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }} + ARGOCD_USERNAME: ${{ secrets.ARGOCD_USERNAME }} + ARGOCD_PASSWORD: ${{ secrets.ARGOCD_PASSWORD }} diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json new file mode 100644 index 0000000..7144a50 --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json @@ -0,0 +1,131 @@ +{ + "demo": { + "title": "Chennai FOSS IDP Onboarding POC", + "app_name": "go-idp-service", + "status_model": [ + "Connected", + "Analysed", + "Templates selected", + "Generated", + "Ready for review", + "Optional deploy enabled", + "Optional observability enabled" + ], + "todo": { + "jira": [ + "Create onboarding tasks automatically", + "Link generated assets to epics or stories", + "Sync dashboard stage updates back to Jira" + ], + "cloud": [ + "Add cloud target selection during onboarding", + "Generate cloud-specific deployment overlays", + "Show environment and rollout status in the dashboard" + ] + } + }, + "repo": { + "repo_path": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-source/go-idp-service", + "repo_url": "https://github.com/cloudengine-labs/go-idp-service-demo.git", + "branch": "master", + "commit": "c5f0654", + "primary_language": "go", + "language_counts": { + "go": 1 + }, + "recommended_templates": { + "ci": true, + "unittest": true, + "container": true, + "cd": false, + "sre": false + } + }, + "selected_templates": { + "ci": true, + "unittest": true, + "container": true, + "cd": true, + "sre": true + }, + "stages": [ + { + "key": "connected", + "label": "Repo connected", + "state": "done" + }, + { + "key": "analysed", + "label": "Branch / commit detected", + "state": "done" + }, + { + "key": "language", + "label": "Language detected: go", + "state": "done" + }, + { + "key": "ci", + "label": "CI scaffolded", + "state": "done" + }, + { + "key": "unittest", + "label": "Unit tests scaffolded", + "state": "done" + }, + { + "key": "container", + "label": "Containerization scaffolded", + "state": "done" + }, + { + "key": "cd", + "label": "CD scaffolded", + "state": "done" + }, + { + "key": "sre", + "label": "SRE scaffolded", + "state": "done" + }, + { + "key": "review", + "label": "Ready for review", + "state": "done" + } + ], + "artifacts": [ + { + "key": "ci", + "label": "GitHub Actions workflow", + "path": ".github/workflows/go-idp-service-complete.yml", + "preview": "name: go-idp-service CI/CD\n'on':\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n workflow_dispatch:\n inputs:\n environment:\n description: Environment to deploy to\n require" + }, + { + "key": "unittest", + "label": "Unit test scaffold", + "path": "unittest", + "preview": "# Makefile test targets for go-idp-service\n# Include these targets in your project Makefile\n\n.PHONY: test test-verbose test-race lint\n\n# Run all tests\ntest:\n\tgo test -v -count=1 ./...\n\n# Run tests with race-condition det" + }, + { + "key": "container", + "label": "Dev container / container baseline", + "path": ".devcontainer/devcontainer.json", + "preview": "{\n \"name\": \"DevOps OS - Multi-Language Development Environment\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\",\n \"args\": {\n \"INSTALL_PYTHON\": \"false\",\n \"INSTALL_JAVA\": \"false\",\n \"INSTALL_JS\": \"false\"," + }, + { + "key": "cd", + "label": "ArgoCD deployment template", + "path": "argocd/application.yaml", + "preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: go-idp-service\n namespace: argocd\n labels:\n app.kubernetes.io/name: go-idp-service\nspec:\n project: default\n source:\n repoURL: https://github." + }, + { + "key": "sre", + "label": "SRE dashboard template", + "path": "sre/grafana-dashboard.json", + "preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_PROMETHEUS\",\n \"label\": \"Prometheus\",\n \"type\": \"datasource\",\n \"pluginId\": \"prometheus\"\n }\n ],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"graf" + } + ], + "generated_output_dir": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-output/go-idp-service" +} \ No newline at end of file diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test new file mode 100644 index 0000000..6021b48 --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test @@ -0,0 +1,26 @@ +# Makefile test targets for go-idp-service +# Include these targets in your project Makefile + +.PHONY: test test-verbose test-race lint + +# Run all tests +test: + go test -v -count=1 ./... + +# Run tests with race-condition detector +test-race: + go test -race -v ./... + +# Run tests with coverage +test-cov: + go test -v -coverprofile=coverage_go_idp_service.out ./... + go tool cover -func=coverage_go_idp_service.out + +# Generate HTML coverage report +test-coverage: test + go tool cover -html=coverage_go_idp_service.out -o coverage_go_idp_service.html + @echo "Coverage report: coverage_go_idp_service.html" + +# Run go vet and staticcheck +lint: + go vet ./... diff --git a/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go new file mode 100644 index 0000000..4075bbb --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go @@ -0,0 +1,37 @@ +// Package go_idp_service provides unit tests for go-idp-service. +package go_idp_service_test + +import ( + "testing" +) + +// TestAdd verifies basic arithmetic — replace with real application tests. +func TestAdd(t *testing.T) { + result := 1 + 1 + if result != 2 { + t.Errorf("expected 2, got %d", result) + } +} + +func TestStringContains(t *testing.T) { + greeting := "Hello from go-idp-service" + if len(greeting) == 0 { + t.Error("expected non-empty greeting") + } +} + +func TestTableDriven(t *testing.T) { + cases := []struct { + a, b, want int + }{ + {1, 2, 3}, + {0, 0, 0}, + {-1, 1, 0}, + } + for _, tc := range cases { + got := tc.a + tc.b + if got != tc.want { + t.Errorf("add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want) + } + } +} diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md new file mode 100644 index 0000000..821688c --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/README.md @@ -0,0 +1,3 @@ +# Go IDP Service + +Minimal Go service used as the Chennai FOSS onboarding demo input. diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod new file mode 100644 index 0000000..e114973 --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/go.mod @@ -0,0 +1,3 @@ +module example.com/go-idp-service + +go 1.22 diff --git a/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go new file mode 100644 index 0000000..e6c048a --- /dev/null +++ b/feature-announcements/chennai-foss-2026/demo-source/go-idp-service/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" +) + +func main() { + http.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { + _ = json.NewEncoder(w).Encode(map[string]string{ + "status": "ok", + "service": "go-idp-service", + }) + }) + + log.Println("go-idp-service listening on :8080") + log.Fatal(http.ListenAndServe(":8080", nil)) +} diff --git a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html new file mode 100644 index 0000000..edfb2bc --- /dev/null +++ b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html @@ -0,0 +1,400 @@ + + + + + + DevOps-OS IDP Onboarding Demo + + + +
+
+ Chennai FOSS • IDP POC +

App onboarding as a lightweight internal developer platform

+

+ This demo turns DevOps-OS into a self-service onboarding experience: detect repo metadata, + infer the main language, preselect platform templates, generate delivery assets, and show + onboarding status in one dashboard. +

+

+ Back to presentation +

+
+ +
+
+
+ Onboarding form +

Platform defaults

+
+ +
+ + +
+
+ + +
+
+
+ Branch + +
+
+ Commit + +
+
+ Primary language + +
+
+ App name + +
+
+ +
+
Template selection
+
+ + + + + +
+
+ + +

The committed demo output below was generated by the new devopsos onboard command.

+
+ +
+
+ Dashboard +

Status

+
+
+ +
+ Generated assets +

What the platform created

+
+
+ +
+ Next integrations +

TODO

+
+
+ Jira / task management +
    +
    +
    + Cloud integration +
      +
      +
      +
      +
      +
      +
      + + + + diff --git a/hugo-docs/content/docs/talks/chennai-foss-2026.md b/hugo-docs/content/docs/talks/chennai-foss-2026.md index 67a2527..b0dc29c 100644 --- a/hugo-docs/content/docs/talks/chennai-foss-2026.md +++ b/hugo-docs/content/docs/talks/chennai-foss-2026.md @@ -8,6 +8,7 @@ weight: 10 Open the deck directly or use the embedded view below during the session. - [Open presentation in a new tab](../../../feature-announcements/chennai-foss-2026/) +- [Open the IDP onboarding demo](../../../feature-announcements/chennai-foss-2026/idp-onboarding-demo.html) - [Open the Talks section]({{< relref "/docs/talks" >}})
      diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json new file mode 100644 index 0000000..c67d782 --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.env.json @@ -0,0 +1,68 @@ +{ + "languages": { + "python": false, + "java": false, + "node": false, + "ruby": false, + "csharp": false, + "php": false, + "rust": false, + "typescript": false, + "kotlin": false, + "c": false, + "cpp": false, + "javascript": false, + "go": true + }, + "cicd": { + "docker": true, + "podman": false, + "terraform": false, + "kubectl": false, + "helm": false, + "github_actions": true, + "jenkins": false + }, + "kubernetes": { + "k9s": false, + "kustomize": false, + "argocd_cli": true, + "lens": false, + "kubeseal": false, + "flux": true, + "kind": false, + "minikube": false, + "openshift_cli": false + }, + "build_tools": { + "gradle": false, + "maven": false, + "ant": false, + "make": false, + "cmake": false + }, + "code_analysis": { + "sonarqube": false, + "checkstyle": false, + "pmd": false, + "eslint": false, + "pylint": false + }, + "devops_tools": { + "nexus": false, + "prometheus": true, + "grafana": true, + "elk": false, + "jenkins": false + }, + "versions": { + "python": "3.12", + "java": "21", + "node": "22", + "go": "1.25.0", + "argocd": "3.3.6", + "flux": "2.8.5", + "prometheus": "3.5.1", + "grafana": "12.4.2" + } +} \ No newline at end of file diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json new file mode 100644 index 0000000..da9675a --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.devcontainer/devcontainer.json @@ -0,0 +1,81 @@ +{ + "name": "DevOps OS - Multi-Language Development Environment", + "build": { + "dockerfile": "Dockerfile", + "args": { + "INSTALL_PYTHON": "false", + "INSTALL_JAVA": "false", + "INSTALL_JS": "false", + "INSTALL_RUBY": "false", + "INSTALL_CSHARP": "false", + "INSTALL_PHP": "false", + "INSTALL_RUST": "false", + "INSTALL_TYPESCRIPT": "false", + "INSTALL_KOTLIN": "false", + "INSTALL_C": "false", + "INSTALL_CPP": "false", + "INSTALL_GO": "true", + "INSTALL_DOCKER": "true", + "INSTALL_PODMAN": "false", + "INSTALL_TERRAFORM": "false", + "INSTALL_KUBECTL": "false", + "INSTALL_HELM": "false", + "INSTALL_GITHUB_ACTIONS": "true", + "INSTALL_JENKINS": "false", + "INSTALL_K9S": "false", + "INSTALL_KUSTOMIZE": "false", + "INSTALL_ARGOCD_CLI": "true", + "INSTALL_LENS": "false", + "INSTALL_KUBESEAL": "false", + "INSTALL_FLUX": "true", + "INSTALL_KIND": "false", + "INSTALL_MINIKUBE": "false", + "INSTALL_OPENSHIFT_CLI": "false", + "INSTALL_GRADLE": "false", + "INSTALL_MAVEN": "false", + "INSTALL_ANT": "false", + "INSTALL_MAKE": "false", + "INSTALL_CMAKE": "false", + "INSTALL_SONARQUBE": "false", + "INSTALL_CHECKSTYLE": "false", + "INSTALL_PMD": "false", + "INSTALL_ESLINT": "false", + "INSTALL_PYLINT": "false", + "INSTALL_NEXUS": "false", + "INSTALL_PROMETHEUS": "true", + "INSTALL_GRAFANA": "true", + "INSTALL_ELK": "false", + "GO_VERSION": "1.25.0", + "ARGOCD_VERSION": "3.3.6", + "FLUX_VERSION": "2.8.5", + "PROMETHEUS_VERSION": "3.5.1", + "GRAFANA_VERSION": "12.4.2" + } + }, + "mounts": [ + "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" + ], + "customizations": { + "vscode": { + "extensions": [ + "golang.go", + "ms-azuretools.vscode-docker", + "ms-kubernetes-tools.vscode-kubernetes-tools", + "mindaro.mindaro", + "argoproj.argocd-vscode-extension", + "weaveworks.vscode-gitops-tools", + "github.vscode-github-actions", + "github.copilot", + "github.copilot-chat", + "ms-vsliveshare.vsliveshare", + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens" + ] + } + }, + "forwardPorts": [ + 9090, + 3000 + ], + "postCreateCommand": "chmod +x /workspaces/.devcontainer/k8s-config-generator.py && ln -sf /workspaces/.devcontainer/k8s-config-generator.py /usr/local/bin/k8s-config-generator" +} \ No newline at end of file diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml new file mode 100644 index 0000000..69c665a --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/.github/workflows/go-idp-service-complete.yml @@ -0,0 +1,99 @@ +name: go-idp-service CI/CD +'on': + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + inputs: + environment: + description: Environment to deploy to + required: true + default: dev + type: choice + options: + - dev + - test + - staging + - prod +jobs: + build: + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up build environment + run: echo 'Setting up build environment for DevOps-OS' + - name: Build Go application + run: if [ -f go.mod ]; then go build -v ./...; fi + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: build-artifacts + path: dist/ + retention-days: 1 + test: + needs: + - build + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up test environment + run: echo 'Setting up test environment for DevOps-OS' + - name: Run Go tests + run: if [ -f go.mod ]; then go test -v ./...; fi + - name: Upload test results + uses: actions/upload-artifact@v3 + with: + name: test-results + path: test-reports/ + retention-days: 1 + - name: Upload coverage reports + uses: codecov/codecov-action@v3 + with: + files: ./coverage.xml,./coverage/lcov.info + fail_ci_if_error: false + deploy: + needs: + - test + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + container: + image: ghcr.io/yourorg/devops-os:latest + options: --user root + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up deployment environment + run: echo 'Setting up deployment environment for DevOps-OS' + - name: Build and Push Docker Image + if: github.ref == 'refs/heads/main' + run: 'echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor + }} --password-stdin + + docker build -t ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name + }}:latest . + + docker push ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name + }}:latest' + - name: Deploy with ArgoCD + if: github.ref == 'refs/heads/main' + run: 'argocd login $ARGOCD_SERVER --username $ARGOCD_USERNAME --password $ARGOCD_PASSWORD + --insecure + + argocd app sync my-application + + argocd app wait my-application --health' + env: + ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }} + ARGOCD_USERNAME: ${{ secrets.ARGOCD_USERNAME }} + ARGOCD_PASSWORD: ${{ secrets.ARGOCD_PASSWORD }} diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json new file mode 100644 index 0000000..7144a50 --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/onboarding-summary.json @@ -0,0 +1,131 @@ +{ + "demo": { + "title": "Chennai FOSS IDP Onboarding POC", + "app_name": "go-idp-service", + "status_model": [ + "Connected", + "Analysed", + "Templates selected", + "Generated", + "Ready for review", + "Optional deploy enabled", + "Optional observability enabled" + ], + "todo": { + "jira": [ + "Create onboarding tasks automatically", + "Link generated assets to epics or stories", + "Sync dashboard stage updates back to Jira" + ], + "cloud": [ + "Add cloud target selection during onboarding", + "Generate cloud-specific deployment overlays", + "Show environment and rollout status in the dashboard" + ] + } + }, + "repo": { + "repo_path": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-source/go-idp-service", + "repo_url": "https://github.com/cloudengine-labs/go-idp-service-demo.git", + "branch": "master", + "commit": "c5f0654", + "primary_language": "go", + "language_counts": { + "go": 1 + }, + "recommended_templates": { + "ci": true, + "unittest": true, + "container": true, + "cd": false, + "sre": false + } + }, + "selected_templates": { + "ci": true, + "unittest": true, + "container": true, + "cd": true, + "sre": true + }, + "stages": [ + { + "key": "connected", + "label": "Repo connected", + "state": "done" + }, + { + "key": "analysed", + "label": "Branch / commit detected", + "state": "done" + }, + { + "key": "language", + "label": "Language detected: go", + "state": "done" + }, + { + "key": "ci", + "label": "CI scaffolded", + "state": "done" + }, + { + "key": "unittest", + "label": "Unit tests scaffolded", + "state": "done" + }, + { + "key": "container", + "label": "Containerization scaffolded", + "state": "done" + }, + { + "key": "cd", + "label": "CD scaffolded", + "state": "done" + }, + { + "key": "sre", + "label": "SRE scaffolded", + "state": "done" + }, + { + "key": "review", + "label": "Ready for review", + "state": "done" + } + ], + "artifacts": [ + { + "key": "ci", + "label": "GitHub Actions workflow", + "path": ".github/workflows/go-idp-service-complete.yml", + "preview": "name: go-idp-service CI/CD\n'on':\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n workflow_dispatch:\n inputs:\n environment:\n description: Environment to deploy to\n require" + }, + { + "key": "unittest", + "label": "Unit test scaffold", + "path": "unittest", + "preview": "# Makefile test targets for go-idp-service\n# Include these targets in your project Makefile\n\n.PHONY: test test-verbose test-race lint\n\n# Run all tests\ntest:\n\tgo test -v -count=1 ./...\n\n# Run tests with race-condition det" + }, + { + "key": "container", + "label": "Dev container / container baseline", + "path": ".devcontainer/devcontainer.json", + "preview": "{\n \"name\": \"DevOps OS - Multi-Language Development Environment\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\",\n \"args\": {\n \"INSTALL_PYTHON\": \"false\",\n \"INSTALL_JAVA\": \"false\",\n \"INSTALL_JS\": \"false\"," + }, + { + "key": "cd", + "label": "ArgoCD deployment template", + "path": "argocd/application.yaml", + "preview": "apiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n name: go-idp-service\n namespace: argocd\n labels:\n app.kubernetes.io/name: go-idp-service\nspec:\n project: default\n source:\n repoURL: https://github." + }, + { + "key": "sre", + "label": "SRE dashboard template", + "path": "sre/grafana-dashboard.json", + "preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_PROMETHEUS\",\n \"label\": \"Prometheus\",\n \"type\": \"datasource\",\n \"pluginId\": \"prometheus\"\n }\n ],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"graf" + } + ], + "generated_output_dir": "/home/runner/work/devops_os/devops_os/feature-announcements/chennai-foss-2026/demo-output/go-idp-service" +} \ No newline at end of file diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test new file mode 100644 index 0000000..6021b48 --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/Makefile.test @@ -0,0 +1,26 @@ +# Makefile test targets for go-idp-service +# Include these targets in your project Makefile + +.PHONY: test test-verbose test-race lint + +# Run all tests +test: + go test -v -count=1 ./... + +# Run tests with race-condition detector +test-race: + go test -race -v ./... + +# Run tests with coverage +test-cov: + go test -v -coverprofile=coverage_go_idp_service.out ./... + go tool cover -func=coverage_go_idp_service.out + +# Generate HTML coverage report +test-coverage: test + go tool cover -html=coverage_go_idp_service.out -o coverage_go_idp_service.html + @echo "Coverage report: coverage_go_idp_service.html" + +# Run go vet and staticcheck +lint: + go vet ./... diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go new file mode 100644 index 0000000..4075bbb --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/demo-output/go-idp-service/unittest/go_idp_service_test.go @@ -0,0 +1,37 @@ +// Package go_idp_service provides unit tests for go-idp-service. +package go_idp_service_test + +import ( + "testing" +) + +// TestAdd verifies basic arithmetic — replace with real application tests. +func TestAdd(t *testing.T) { + result := 1 + 1 + if result != 2 { + t.Errorf("expected 2, got %d", result) + } +} + +func TestStringContains(t *testing.T) { + greeting := "Hello from go-idp-service" + if len(greeting) == 0 { + t.Error("expected non-empty greeting") + } +} + +func TestTableDriven(t *testing.T) { + cases := []struct { + a, b, want int + }{ + {1, 2, 3}, + {0, 0, 0}, + {-1, 1, 0}, + } + for _, tc := range cases { + got := tc.a + tc.b + if got != tc.want { + t.Errorf("add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want) + } + } +} diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html new file mode 100644 index 0000000..edfb2bc --- /dev/null +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html @@ -0,0 +1,400 @@ + + + + + + DevOps-OS IDP Onboarding Demo + + + +
      +
      + Chennai FOSS • IDP POC +

      App onboarding as a lightweight internal developer platform

      +

      + This demo turns DevOps-OS into a self-service onboarding experience: detect repo metadata, + infer the main language, preselect platform templates, generate delivery assets, and show + onboarding status in one dashboard. +

      +

      + Back to presentation +

      +
      + +
      +
      +
      + Onboarding form +

      Platform defaults

      +
      + +
      + + +
      +
      + + +
      +
      +
      + Branch + +
      +
      + Commit + +
      +
      + Primary language + +
      +
      + App name + +
      +
      + +
      +
      Template selection
      +
      + + + + + +
      +
      + + +

      The committed demo output below was generated by the new devopsos onboard command.

      +
      + +
      +
      + Dashboard +

      Status

      +
      +
      + +
      + Generated assets +

      What the platform created

      +
      +
      + +
      + Next integrations +

      TODO

      +
      +
      + Jira / task management +
        +
        +
        + Cloud integration +
          +
          +
          +
          +
          +
          +
          + + + + From 7d62465e2b7cd87277865946faf6cf4c447999a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 15:27:28 +0000 Subject: [PATCH 2/7] Polish Chennai FOSS onboarding dashboard flow Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- .../chennai-foss-2026/idp-onboarding-demo.html | 2 +- go-project/go.mod | 4 ---- go-project/go.sum | 7 ------- hugo-docs/go.mod | 2 -- hugo-docs/go.sum | 2 -- .../chennai-foss-2026/idp-onboarding-demo.html | 2 +- 6 files changed, 2 insertions(+), 17 deletions(-) diff --git a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html index edfb2bc..9a95140 100644 --- a/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html +++ b/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html @@ -372,7 +372,7 @@

          TODO

          setToggle("toggle-container", summary.selected_templates.container); setToggle("toggle-cd", summary.selected_templates.cd); setToggle("toggle-sre", summary.selected_templates.sre); - renderTimeline(summary.stages.map((stage, index) => ({...stage, state: index === 0 ? "pending" : "pending"}))); + renderTimeline(summary.stages.map((stage) => ({...stage, state: "pending"}))); renderArtifacts(summary.artifacts); renderList("jira-list", summary.demo.todo.jira); renderList("cloud-list", summary.demo.todo.cloud); diff --git a/go-project/go.mod b/go-project/go.mod index 12b37ce..dd04cd6 100644 --- a/go-project/go.mod +++ b/go-project/go.mod @@ -1,7 +1,3 @@ module go-project go 1.16 - -require ( - // Add your dependencies here -) \ No newline at end of file diff --git a/go-project/go.sum b/go-project/go.sum index 06e0d10..e69de29 100644 --- a/go-project/go.sum +++ b/go-project/go.sum @@ -1,7 +0,0 @@ -go: module example.com/go-project - -# indirect -github.com/gin-gonic/gin v1.7.4 // indirect -github.com/stretchr/testify v1.7.0 // indirect -golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect -golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect \ No newline at end of file diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod index c363f3e..5d91405 100644 --- a/hugo-docs/go.mod +++ b/hugo-docs/go.mod @@ -1,5 +1,3 @@ module github.com/cloudengine-labs/devops_os/hugo-docs go 1.21.0 - -require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum index 2510024..e69de29 100644 --- a/hugo-docs/go.sum +++ b/hugo-docs/go.sum @@ -1,2 +0,0 @@ -github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo= -github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds= diff --git a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html index edfb2bc..9a95140 100644 --- a/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html +++ b/hugo-docs/static/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html @@ -372,7 +372,7 @@

          TODO

          setToggle("toggle-container", summary.selected_templates.container); setToggle("toggle-cd", summary.selected_templates.cd); setToggle("toggle-sre", summary.selected_templates.sre); - renderTimeline(summary.stages.map((stage, index) => ({...stage, state: index === 0 ? "pending" : "pending"}))); + renderTimeline(summary.stages.map((stage) => ({...stage, state: "pending"}))); renderArtifacts(summary.artifacts); renderList("jira-list", summary.demo.todo.jira); renderList("cloud-list", summary.demo.todo.cloud); From 56f0dbea57ee05bed58a6fd2e0da33f6632a90a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 15:28:40 +0000 Subject: [PATCH 3/7] Restore unrelated Go module metadata Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/ea0c7a95-2d9a-453e-aaa1-7b54e2e22c94 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- go-project/go.mod | 4 ++++ go-project/go.sum | 7 +++++++ hugo-docs/go.mod | 2 ++ hugo-docs/go.sum | 2 ++ 4 files changed, 15 insertions(+) diff --git a/go-project/go.mod b/go-project/go.mod index dd04cd6..12b37ce 100644 --- a/go-project/go.mod +++ b/go-project/go.mod @@ -1,3 +1,7 @@ module go-project go 1.16 + +require ( + // Add your dependencies here +) \ No newline at end of file diff --git a/go-project/go.sum b/go-project/go.sum index e69de29..06e0d10 100644 --- a/go-project/go.sum +++ b/go-project/go.sum @@ -0,0 +1,7 @@ +go: module example.com/go-project + +# indirect +github.com/gin-gonic/gin v1.7.4 // indirect +github.com/stretchr/testify v1.7.0 // indirect +golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect +golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect \ No newline at end of file diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod index 5d91405..c363f3e 100644 --- a/hugo-docs/go.mod +++ b/hugo-docs/go.mod @@ -1,3 +1,5 @@ module github.com/cloudengine-labs/devops_os/hugo-docs go 1.21.0 + +require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum index e69de29..2510024 100644 --- a/hugo-docs/go.sum +++ b/hugo-docs/go.sum @@ -0,0 +1,2 @@ +github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo= +github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds= From 9c56138d1b15d24f91600af55d12e6bb27958aa7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:17:16 +0000 Subject: [PATCH 4/7] Plan Hugo branch preview support Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- hugo-docs/go.mod | 2 +- hugo-docs/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod index c363f3e..1a12a8b 100644 --- a/hugo-docs/go.mod +++ b/hugo-docs/go.mod @@ -2,4 +2,4 @@ module github.com/cloudengine-labs/devops_os/hugo-docs go 1.21.0 -require github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 // indirect +require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum index 2510024..2182013 100644 --- a/hugo-docs/go.sum +++ b/hugo-docs/go.sum @@ -1,2 +1,2 @@ -github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62 h1:LQYO67RaSBiWnW3ZPyVPZCVTOFaNK/dc/ZRbh8Wu8Wo= -github.com/alex-shpak/hugo-book v0.0.0-20260108111751-81a841c92d62/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds= +github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg= +github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds= From 4e0f99ccc1737f4c5daefe34a71912e48377b125 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:20:54 +0000 Subject: [PATCH 5/7] Add Hugo branch preview workflow Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- .github/workflows/hugo-preview.yml | 94 ++++++++++++++++++++++++++++++ .github/workflows/pages.yml | 2 +- CONTRIBUTING.md | 10 ++++ README.md | 31 ++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/hugo-preview.yml diff --git a/.github/workflows/hugo-preview.yml b/.github/workflows/hugo-preview.yml new file mode 100644 index 0000000..8bea550 --- /dev/null +++ b/.github/workflows/hugo-preview.yml @@ -0,0 +1,94 @@ +name: Build Hugo Preview + +on: + push: + branches-ignore: + - main + paths: + - ".github/workflows/pages.yml" + - ".github/workflows/hugo-preview.yml" + - "hugo-docs/**" + - "feature-announcements/**" + pull_request: + branches: + - main + paths: + - ".github/workflows/pages.yml" + - ".github/workflows/hugo-preview.yml" + - "hugo-docs/**" + - "feature-announcements/**" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: "hugo-preview-${{ github.ref }}" + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + build-preview: + runs-on: ubuntu-latest + env: + HUGO_VERSION: "0.158.0" + PREVIEW_BASEURL: "http://127.0.0.1:1313/" + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.22" + + - name: Install Hugo CLI + run: | + wget -O "${{ runner.temp }}/hugo.deb" \ + "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb" + sudo dpkg -i "${{ runner.temp }}/hugo.deb" + + - name: Download Hugo modules + working-directory: ./hugo-docs + run: hugo mod tidy + + - name: Build Hugo preview site + working-directory: ./hugo-docs + env: + HUGO_ENVIRONMENT: production + HUGO_BASEURL: ${{ env.PREVIEW_BASEURL }} + run: hugo --gc --minify + + - name: Upload Hugo preview artifact + uses: actions/upload-artifact@v4 + with: + name: hugo-preview-${{ github.run_number }} + path: ./hugo-docs/public + if-no-files-found: error + retention-days: 7 + + - name: Publish preview instructions + run: | + { + echo "## Hugo branch preview" + echo + echo "Artifact: \`hugo-preview-${{ github.run_number }}\`" + echo + echo "After downloading the artifact, serve the extracted \`public/\` directory locally:" + echo + echo "\`\`\`bash" + echo "python -m http.server 1313 -d public" + echo "\`\`\`" + echo + echo "Then verify:" + echo + echo "- http://127.0.0.1:1313/docs/talks/chennai-foss-2026/" + echo "- http://127.0.0.1:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html" + echo + echo "For a one-off hosted check, you can still run the production Pages workflow manually on this branch, but that deploys to the shared GitHub Pages environment." + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 3e833ca..d8fbd91 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -24,7 +24,7 @@ jobs: build: runs-on: ubuntu-latest env: - HUGO_VERSION: "0.147.0" + HUGO_VERSION: "0.158.0" steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 034f172..b03ce3f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,6 +32,16 @@ Please be respectful and constructive in all interactions. We are committed to p ```bash python -m pytest cli/test_cli.py mcp_server/test_server.py tests/test_comprehensive.py -v ``` +4. If your change touches the Hugo docs or the Chennai FOSS demo pages, preview them from your branch before opening a PR: + ```bash + cd /home/runner/work/devops_os/devops_os/hugo-docs + hugo mod tidy + hugo server --bind 0.0.0.0 --baseURL http://localhost:1313/ + ``` + Verify: + - `http://localhost:1313/docs/talks/chennai-foss-2026/` + - `http://localhost:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html` + You can also run the **Build Hugo Preview** workflow to get a downloadable preview artifact without deploying to the production Pages site. --- diff --git a/README.md b/README.md index f9c2dee..8871b42 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,37 @@ You can also customize `.devcontainer/devcontainer.env.json` directly to enable --- +## 🌐 Hugo branch preview + +The production GitHub Pages site is still deployed only from `main`, but you can test the Hugo-hosted Chennai FOSS IDP UI from your current branch in two safe ways. + +### Local preview + +```bash +cd /home/runner/work/devops_os/devops_os/hugo-docs +hugo mod tidy +hugo server --bind 0.0.0.0 --baseURL http://localhost:1313/ +``` + +Then verify: + +- `http://localhost:1313/docs/talks/chennai-foss-2026/` +- `http://localhost:1313/feature-announcements/chennai-foss-2026/idp-onboarding-demo.html` + +### GitHub Actions preview artifact + +Use the **Build Hugo Preview** workflow on your branch. It builds the Hugo site without deploying to the shared GitHub Pages environment and uploads the generated `public/` directory as an artifact. + +After downloading the artifact, serve it locally: + +```bash +python -m http.server 1313 -d public +``` + +For a one-off hosted verification, you can still manually run **Deploy Hugo Documentation** on your branch with `workflow_dispatch`, but that updates the shared Pages site. + +--- + ## 🤝 Contributing Contributions are welcome! Whether it's a bug fix, a new scaffold generator, or documentation improvement — feel free to open an issue or submit a pull request. From 0a036c0ca7c38b2724cee80271c3d510c037e679 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:22:31 +0000 Subject: [PATCH 6/7] Finalize Hugo branch preview support Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- go-project/go.mod | 4 ---- go-project/go.sum | 7 ------- hugo-docs/go.mod | 2 -- hugo-docs/go.sum | 2 -- 4 files changed, 15 deletions(-) diff --git a/go-project/go.mod b/go-project/go.mod index 12b37ce..dd04cd6 100644 --- a/go-project/go.mod +++ b/go-project/go.mod @@ -1,7 +1,3 @@ module go-project go 1.16 - -require ( - // Add your dependencies here -) \ No newline at end of file diff --git a/go-project/go.sum b/go-project/go.sum index 06e0d10..e69de29 100644 --- a/go-project/go.sum +++ b/go-project/go.sum @@ -1,7 +0,0 @@ -go: module example.com/go-project - -# indirect -github.com/gin-gonic/gin v1.7.4 // indirect -github.com/stretchr/testify v1.7.0 // indirect -golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect -golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect \ No newline at end of file diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod index 1a12a8b..5d91405 100644 --- a/hugo-docs/go.mod +++ b/hugo-docs/go.mod @@ -1,5 +1,3 @@ module github.com/cloudengine-labs/devops_os/hugo-docs go 1.21.0 - -require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum index 2182013..e69de29 100644 --- a/hugo-docs/go.sum +++ b/hugo-docs/go.sum @@ -1,2 +0,0 @@ -github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg= -github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds= From bb995857ddede3b3e520aacd193d174f1903b54d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:24:09 +0000 Subject: [PATCH 7/7] Restore module metadata after Hugo preview update Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/da764e3f-6ccf-4173-87cc-3bff9ee56e38 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- go-project/go.mod | 4 ++++ go-project/go.sum | 7 +++++++ hugo-docs/go.mod | 2 ++ hugo-docs/go.sum | 2 ++ 4 files changed, 15 insertions(+) diff --git a/go-project/go.mod b/go-project/go.mod index dd04cd6..12b37ce 100644 --- a/go-project/go.mod +++ b/go-project/go.mod @@ -1,3 +1,7 @@ module go-project go 1.16 + +require ( + // Add your dependencies here +) \ No newline at end of file diff --git a/go-project/go.sum b/go-project/go.sum index e69de29..06e0d10 100644 --- a/go-project/go.sum +++ b/go-project/go.sum @@ -0,0 +1,7 @@ +go: module example.com/go-project + +# indirect +github.com/gin-gonic/gin v1.7.4 // indirect +github.com/stretchr/testify v1.7.0 // indirect +golang.org/x/net v0.0.0-20220316182356-1c4e7f4e8b2e // indirect +golang.org/x/sys v0.0.0-20220316182356-1c4e7f4e8b2e // indirect \ No newline at end of file diff --git a/hugo-docs/go.mod b/hugo-docs/go.mod index 5d91405..1a12a8b 100644 --- a/hugo-docs/go.mod +++ b/hugo-docs/go.mod @@ -1,3 +1,5 @@ module github.com/cloudengine-labs/devops_os/hugo-docs go 1.21.0 + +require github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 // indirect diff --git a/hugo-docs/go.sum b/hugo-docs/go.sum index e69de29..2182013 100644 --- a/hugo-docs/go.sum +++ b/hugo-docs/go.sum @@ -0,0 +1,2 @@ +github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1 h1:vwHQ2uXe6gC9kXre7P29AqWYB8Gek5iQTGnJHKBbqDg= +github.com/alex-shpak/hugo-book v0.0.0-20260408113943-97d7ee40edf1/go.mod h1:L4NMyzbn15fpLIpmmtDg9ZFFyTZzw87/lk7M2bMQ7ds=