Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down
4 changes: 4 additions & 0 deletions examples/e2e-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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/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
20 changes: 20 additions & 0 deletions examples/helloworld/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,26 @@ k8s_deploy(
user = USER,
)

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
# 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,
user = USER,
)

sh_test(
name = "k8s_deploy_test",
srcs = ["k8s_deploy_test.sh"],
Expand Down
2 changes: 2 additions & 0 deletions skylib/k8s.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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'.
Expand Down Expand Up @@ -279,6 +280,7 @@ def k8s_deploy(
srcs = [name],
cluster = cluster,
namespace = namespace,
app_grp = app_grp,
gitops_path = gitops_path,
strip_prefixes = [
namespace + "-",
Expand Down
20 changes: 16 additions & 4 deletions skylib/kustomize/kustomize.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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(),
Expand Down
51 changes: 51 additions & 0 deletions skylib/kustomize/tests/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
app_grp = "backend",
cluster = "dev",
gitops_path = "cloud",
namespace = "test",
)

# Test gitops without app_grp (should behave like original)
gitops(
name = "dev-something-no-app-grp.gitops",
testonly = True,
srcs = [":namespace_test"],
cluster = "dev",
gitops_path = "cloud",
namespace = "test",
# 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/backend",
)

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",
Expand Down