From a7ec35200bb7b424d5877aeef4e6105811b8ff3e Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Mon, 11 Aug 2025 18:45:30 -0700 Subject: [PATCH 1/6] Adding app_grp option --- examples/e2e-test.sh | 4 +++ examples/helloworld/BUILD | 20 +++++++++++++ skylib/k8s.bzl | 2 ++ skylib/kustomize/kustomize.bzl | 20 ++++++++++--- skylib/kustomize/tests/BUILD | 51 ++++++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 4 deletions(-) diff --git a/examples/e2e-test.sh b/examples/e2e-test.sh index b76c9d95..eb8d5dfe 100755 --- a/examples/e2e-test.sh +++ b/examples/e2e-test.sh @@ -40,6 +40,7 @@ rm -rf cloud bazel run //helloworld:canary.gitops bazel run //helloworld:release.gitops bazel run //helloworld:gitops_custom_path.gitops +bazel run //helloworld:gitops_with_app_grp.gitops #the result of .gitops operation goes into /cloud directory and should be submitted back to the repo #apply everything generated @@ -48,5 +49,8 @@ kubectl apply -f cloud -R #apply gitops_custom_path gen kubectl apply -f custom_cloud -R +#apply gitops_with_app_grp gen (should create cloud/frontend/hwteam/kind-kind/ structure) +kubectl apply -f cloud/frontend -R + #wait for readiness kubectl -n hwteam wait --timeout=60s --for=condition=Available deployment/helloworld deployment/helloworld-canary deployment/helloworld-gitops-custom-path diff --git a/examples/helloworld/BUILD b/examples/helloworld/BUILD index 2fff4c0c..857db697 100644 --- a/examples/helloworld/BUILD +++ b/examples/helloworld/BUILD @@ -123,6 +123,26 @@ k8s_deploy( user = USER, ) +k8s_deploy( + name = "gitops_with_app_grp", + cluster = CLUSTER, + deployment_branch = "helloworld-gitops-app-grp", + image_digest_tag = True, # test optional image tagging + image_registry = REGISTRY, # override the default registry host for production + image_repository_prefix = "k8s", + images = { + "helloworld-image": ":image", + }, + manifests = [ + "deployment.yaml", + "service.yaml", + ], + name_suffix = "-gitops-app-grp", + namespace = NAMESPACE, + app_grp = "frontend", # This will create path: cloud/frontend/hwteam/kind-kind/gitops_with_app_grp.yaml + user = USER, +) + sh_test( name = "k8s_deploy_test", srcs = ["k8s_deploy_test.sh"], diff --git a/skylib/k8s.bzl b/skylib/k8s.bzl index 8391fa94..134a1c51 100644 --- a/skylib/k8s.bzl +++ b/skylib/k8s.bzl @@ -111,6 +111,7 @@ def k8s_deploy( cluster = "dev", user = "{BUILD_USER}", namespace = None, + app_grp = None, # optional application group to insert between gitops_path and namespace in the file path configmaps_srcs = None, secrets_srcs = None, configmaps_renaming = None, # configmaps renaming policy. Could be None or 'hash'. @@ -279,6 +280,7 @@ def k8s_deploy( srcs = [name], cluster = cluster, namespace = namespace, + app_grp = app_grp, gitops_path = gitops_path, strip_prefixes = [ namespace + "-", diff --git a/skylib/kustomize/kustomize.bzl b/skylib/kustomize/kustomize.bzl index a6f13b75..184e083a 100644 --- a/skylib/kustomize/kustomize.bzl +++ b/skylib/kustomize/kustomize.bzl @@ -440,19 +440,30 @@ fi """.format(push_statements) namespace = ctx.attr.namespace + app_grp = ctx.attr.app_grp + + # Construct the path with optional app_grp + if app_grp: + path_template = "{gitops_path}/{app_grp}/{namespace}/{cluster}/{file}" + mkdir_template = "{gitops_path}/{app_grp}/{namespace}/{cluster}" + else: + path_template = "{gitops_path}/{namespace}/{cluster}/{file}" + mkdir_template = "{gitops_path}/{namespace}/{cluster}" + for inattr in ctx.attr.srcs: if "{" in namespace: fail("unable to gitops namespace with placeholders %s" % inattr.label) #mynamespace should not be gitopsed for infile in inattr.files.to_list(): - statements += ("echo $TARGET_DIR/{gitops_path}/{namespace}/{cluster}/{file}\n" + - "mkdir -p $TARGET_DIR/{gitops_path}/{namespace}/{cluster}\n" + - "echo '# GENERATED BY {rulename} -> {gitopsrulename}' > $TARGET_DIR/{gitops_path}/{namespace}/{cluster}/{file}\n" + - "{template_engine} --template={infile} --variable=NAMESPACE={namespace} --stamp_info_file={info_file} >> $TARGET_DIR/{gitops_path}/{namespace}/{cluster}/{file}\n").format( + statements += ("echo $TARGET_DIR/" + path_template + "\n" + + "mkdir -p $TARGET_DIR/" + mkdir_template + "\n" + + "echo '# GENERATED BY {rulename} -> {gitopsrulename}' > $TARGET_DIR/" + path_template + "\n" + + "{template_engine} --template={infile} --variable=NAMESPACE={namespace} --stamp_info_file={info_file} >> $TARGET_DIR/" + path_template + "\n").format( infile = infile.path, rulename = inattr.label, gitopsrulename = ctx.label, namespace = namespace, gitops_path = ctx.attr.gitops_path, + app_grp = app_grp, cluster = cluster, file = _remove_prefixes(infile.path.split("/")[-1], strip_prefixes), template_engine = "${RUNFILES}/%s" % _get_runfile_path(ctx, ctx.executable._template_engine), @@ -485,6 +496,7 @@ gitops = rule( "srcs": attr.label_list(providers = (KustomizeInfo,)), "cluster": attr.string(mandatory = True), "namespace": attr.string(mandatory = True), + "app_grp": attr.string(doc = "optional application group to insert between gitops_path and namespace in the file path"), "deployment_branch": attr.string(), "gitops_path": attr.string(), "release_branch_prefix": attr.string(), diff --git a/skylib/kustomize/tests/BUILD b/skylib/kustomize/tests/BUILD index 27a96a17..fccac96f 100644 --- a/skylib/kustomize/tests/BUILD +++ b/skylib/kustomize/tests/BUILD @@ -270,6 +270,57 @@ gitops( namespace = "test", ) +# Test gitops with app_grp parameter +gitops( + name = "dev-something-with-app-grp.gitops", + testonly = True, + srcs = [":namespace_test"], + cluster = "dev", + namespace = "test", + app_grp = "frontend", + gitops_path = "cloud", +) + +# Test gitops without app_grp (should behave like original) +gitops( + name = "dev-something-no-app-grp.gitops", + testonly = True, + srcs = [":namespace_test"], + cluster = "dev", + namespace = "test", + gitops_path = "cloud", + # app_grp intentionally omitted to test backward compatibility +) + +# Test rules to verify gitops output with app_grp +rule_test( + name = "gitops_with_app_grp_generates_executable", + generates = ["dev-something-with-app-grp.gitops"], + rule = "dev-something-with-app-grp.gitops", +) + +# Test rules to verify gitops output without app_grp (backward compatibility) +rule_test( + name = "gitops_no_app_grp_generates_executable", + generates = ["dev-something-no-app-grp.gitops"], + rule = "dev-something-no-app-grp.gitops", +) + +# File tests to verify gitops path generation +file_test( + name = "gitops_with_app_grp_path_test", + file = ":dev-something-with-app-grp.gitops", + matches = 4, # Should appear in echo, mkdir, echo comment, and template_engine commands + regexp = "cloud/frontend", +) + +file_test( + name = "gitops_no_app_grp_path_test", + file = ":dev-something-no-app-grp.gitops", + matches = 4, # Should appear in echo, mkdir, echo comment, and template_engine commands + regexp = "cloud/test/dev", +) + #------------------- kustomize( name = "name_prefix", From ecc11e683209e00a89055b862672deae563c299d Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Mon, 11 Aug 2025 18:54:06 -0700 Subject: [PATCH 2/6] better naming --- examples/helloworld/BUILD | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/helloworld/BUILD b/examples/helloworld/BUILD index 857db697..7c6ae8c4 100644 --- a/examples/helloworld/BUILD +++ b/examples/helloworld/BUILD @@ -127,9 +127,9 @@ k8s_deploy( name = "gitops_with_app_grp", cluster = CLUSTER, deployment_branch = "helloworld-gitops-app-grp", - image_digest_tag = True, # test optional image tagging - image_registry = REGISTRY, # override the default registry host for production - image_repository_prefix = "k8s", + # image_digest_tag = True, # test optional image tagging + # image_registry = REGISTRY, # override the default registry host for production + # image_repository_prefix = "k8s", images = { "helloworld-image": ":image", }, @@ -139,7 +139,7 @@ k8s_deploy( ], name_suffix = "-gitops-app-grp", namespace = NAMESPACE, - app_grp = "frontend", # This will create path: cloud/frontend/hwteam/kind-kind/gitops_with_app_grp.yaml + app_grp = "backend", # This will create path: cloud/backend/hwteam/kind-kind/gitops_with_app_grp.yaml user = USER, ) From 18e4c43647556ca5d58418d1f2639455fa58ea2e Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Mon, 11 Aug 2025 18:57:40 -0700 Subject: [PATCH 3/6] backend --- examples/e2e-test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/e2e-test.sh b/examples/e2e-test.sh index eb8d5dfe..e4c6f7f1 100755 --- a/examples/e2e-test.sh +++ b/examples/e2e-test.sh @@ -49,8 +49,8 @@ kubectl apply -f cloud -R #apply gitops_custom_path gen kubectl apply -f custom_cloud -R -#apply gitops_with_app_grp gen (should create cloud/frontend/hwteam/kind-kind/ structure) -kubectl apply -f cloud/frontend -R +#apply gitops_with_app_grp gen (should create cloud/backend/hwteam/kind-kind/ structure) +kubectl apply -f cloud/backend -R #wait for readiness kubectl -n hwteam wait --timeout=60s --for=condition=Available deployment/helloworld deployment/helloworld-canary deployment/helloworld-gitops-custom-path From fe4d553504d60579207302c04c895209523b64a5 Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Tue, 12 Aug 2025 09:53:25 -0700 Subject: [PATCH 4/6] add parameter to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a2bd2b0b..20165747 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ When you run `bazel run ///helloworld:mynamespace.apply`, it applies this file i | ***release_branch_prefix*** | `master` | A git branch name/prefix. Automatically run GitOps while building this branch. See [GitOps and Deployment](#gitops_and_deployment). | ***deployment_branch*** | `None` | Automatic GitOps output will appear in a branch and PR with this name. See [GitOps and Deployment](#gitops_and_deployment). | ***gitops_path*** | `cloud` | Path within the git repo where gitops files get generated into +| ***app_grp*** | `` | Optional folder for grouping apps after gitops_path in git repo | ***tags*** | `[]` | See [Bazel docs on tags](https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes). | ***visibility*** | [Default_visibility](https://docs.bazel.build/versions/master/be/functions.html#package.default_visibility) | Changes the visibility of all rules generated by this macro. See [Bazel docs on visibility](https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes). From 80ee14aa70c4638d669bd7f789da098662a6b142 Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Tue, 12 Aug 2025 10:16:57 -0700 Subject: [PATCH 5/6] backend --- skylib/kustomize/tests/BUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skylib/kustomize/tests/BUILD b/skylib/kustomize/tests/BUILD index fccac96f..7a867457 100644 --- a/skylib/kustomize/tests/BUILD +++ b/skylib/kustomize/tests/BUILD @@ -277,7 +277,7 @@ gitops( srcs = [":namespace_test"], cluster = "dev", namespace = "test", - app_grp = "frontend", + app_grp = "backend", gitops_path = "cloud", ) @@ -311,7 +311,7 @@ file_test( name = "gitops_with_app_grp_path_test", file = ":dev-something-with-app-grp.gitops", matches = 4, # Should appear in echo, mkdir, echo comment, and template_engine commands - regexp = "cloud/frontend", + regexp = "cloud/backend", ) file_test( From 3dabeb2f73a2e143219562845db0e3656e300c1c Mon Sep 17 00:00:00 2001 From: Mike Patterson Date: Tue, 12 Aug 2025 16:14:32 -0700 Subject: [PATCH 6/6] buildifer-fix --- examples/helloworld/BUILD | 2 +- skylib/kustomize/kustomize.bzl | 4 ++-- skylib/kustomize/tests/BUILD | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/helloworld/BUILD b/examples/helloworld/BUILD index 7c6ae8c4..5061532d 100644 --- a/examples/helloworld/BUILD +++ b/examples/helloworld/BUILD @@ -125,6 +125,7 @@ k8s_deploy( k8s_deploy( name = "gitops_with_app_grp", + app_grp = "backend", # This will create path: cloud/backend/hwteam/kind-kind/gitops_with_app_grp.yaml cluster = CLUSTER, deployment_branch = "helloworld-gitops-app-grp", # image_digest_tag = True, # test optional image tagging @@ -139,7 +140,6 @@ k8s_deploy( ], name_suffix = "-gitops-app-grp", namespace = NAMESPACE, - app_grp = "backend", # This will create path: cloud/backend/hwteam/kind-kind/gitops_with_app_grp.yaml user = USER, ) diff --git a/skylib/kustomize/kustomize.bzl b/skylib/kustomize/kustomize.bzl index 184e083a..2d61bd0e 100644 --- a/skylib/kustomize/kustomize.bzl +++ b/skylib/kustomize/kustomize.bzl @@ -441,7 +441,7 @@ fi namespace = ctx.attr.namespace app_grp = ctx.attr.app_grp - + # Construct the path with optional app_grp if app_grp: path_template = "{gitops_path}/{app_grp}/{namespace}/{cluster}/{file}" @@ -449,7 +449,7 @@ fi else: path_template = "{gitops_path}/{namespace}/{cluster}/{file}" mkdir_template = "{gitops_path}/{namespace}/{cluster}" - + for inattr in ctx.attr.srcs: if "{" in namespace: fail("unable to gitops namespace with placeholders %s" % inattr.label) #mynamespace should not be gitopsed diff --git a/skylib/kustomize/tests/BUILD b/skylib/kustomize/tests/BUILD index 7a867457..2e2c6a93 100644 --- a/skylib/kustomize/tests/BUILD +++ b/skylib/kustomize/tests/BUILD @@ -275,10 +275,10 @@ gitops( name = "dev-something-with-app-grp.gitops", testonly = True, srcs = [":namespace_test"], - cluster = "dev", - namespace = "test", app_grp = "backend", + cluster = "dev", gitops_path = "cloud", + namespace = "test", ) # Test gitops without app_grp (should behave like original) @@ -287,8 +287,8 @@ gitops( testonly = True, srcs = [":namespace_test"], cluster = "dev", - namespace = "test", gitops_path = "cloud", + namespace = "test", # app_grp intentionally omitted to test backward compatibility )