Skip to content
This repository has been archived by the owner on Jan 29, 2019. It is now read-only.

Commit

Permalink
Replace publishing rules with ghrelease rules (#1)
Browse files Browse the repository at this point in the history
* Impl proper version incrementing

* Impl changelog generator

* Impl docs publisher

* Impl check_local_tracks_authoritative_branch

* Remove k8s repo

* Migrate to new publisher

* Update example docs
  • Loading branch information
ceason authored Nov 19, 2018
1 parent 76421a3 commit 783235e
Show file tree
Hide file tree
Showing 37 changed files with 1,130 additions and 1,719 deletions.
10 changes: 0 additions & 10 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@ git_repository(
remote = "git@github.com:bazelbuild/rules_docker.git",
)

git_repository(
name = "io_bazel_rules_k8s",
commit = "d6e1b65317246fe044482f9e042556c77e6893b8",
remote = "git@github.com:bazelbuild/rules_k8s.git",
)

load("@io_bazel_rules_docker//container:container.bzl", "repositories")

repositories()
Expand All @@ -28,10 +22,6 @@ load(

_py_image_repos()

load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_defaults", "k8s_repositories")

k8s_repositories()

load("//terraform:dependencies.bzl", "terraform_repositories")

terraform_repositories()
Expand Down
56 changes: 36 additions & 20 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,30 +93,46 @@ build:publish --define IMAGE_CHROOT=index.docker.io/netchris

### [`release/BUILD`](release/BUILD)
```python
load("//terraform:def.bzl", "terraform_module_publisher")
load("//terraform/experimental/ghrelease:def.bzl", "ghrelease", "ghrelease_assets", "ghrelease_test_suite")

VERSION = "0.2"

# To make our terraform module available to others we configure a
# 'terraform_module_publisher' which will
# - Run configured tests
# - Publish relevant docker images
# - Output each module into its own subdirectory in this repo (note
# that we can optionally output to a different repo)
terraform_module_publisher(
name = "publish",
bazelrc_config = "publish",
prepublish_tests = [
# bazel excludes all tests tagged as 'manual' from wildcard
# patterns, so we explicitly include our e2e test.
"//...", # <- means 'all tests' (which aren't tagged 'manual')
"//examples/test:e2e_integration_test",
# 'ghrelease' which will:
# - Run "preflight-checks" (dependant test suites, etc)
# - Push associated docker images
# - Generate release notes, including a changelog from the previous
# version
# - Increment the current tag/version's patch version (or prerelease
# version if the `--prerelease` flag is used)
# - Create a new GitHub Release with release notes and any extra docs
# - Attach any assets to the new Release
ghrelease(
name = "release",
version = VERSION,
deps = [
":prerelease-tests",
":tf-modules",
],
)

ghrelease_assets(
name = "tf-modules",
bazel_flags = ["--config=publish"],
data = [
"//examples/src:hello-world_ecs",
"//examples/src:hello-world_k8s",
],
published_modules = {
"mymodule": "//examples/src:hello-world_k8s",
"mymodule-ecs": "//examples/src:hello-world_ecs",
},
# remote = "git@github.com:my-org-terraform-modules/terraform-myproject-modules.git",
# remote_path = "modules",
)

ghrelease_test_suite(
name = "prerelease-tests",
tests = [
"//examples/...",
"//examples/test:k8s-e2e_integration_test",
],
)

```

Check out the [release directory](release/mymodule) to see the published module!
36 changes: 26 additions & 10 deletions examples/release/BUILD
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
load("//terraform:def.bzl", "terraform_module_publisher")
load("//terraform/experimental/ghrelease:def.bzl", "ghrelease", "ghrelease_assets", "ghrelease_test_suite")

terraform_module_publisher(
name = "publish",
bazelrc_config = "publish",
prepublish_tests = [
VERSION = "0.2"

ghrelease(
name = "release",
args = ["--draft"],
version = VERSION,
deps = [
":prerelease-tests",
":tf-modules",
],
)

ghrelease_assets(
name = "tf-modules",
bazel_flags = ["--config=publish"],
data = [
"//examples/src:hello-world_ecs",
"//examples/src:hello-world_k8s",
],
)

ghrelease_test_suite(
name = "prerelease-tests",
tests = [
"//...",
"//examples/test:k8s-e2e_integration_test",
#"//examples/test:ecs-e2e_integration_test",
# "//examples/test:ecs-e2e_integration_test"
],
published_modules = {
"mymodule": "//examples/src:hello-world_k8s",
"mymodule-ecs": "//examples/src:hello-world_ecs",
},
)
4 changes: 1 addition & 3 deletions examples/src/BUILD
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
load("//terraform:def.bzl", "terraform_module", "terraform_workspace")
load("//terraform:def.bzl", "terraform_module")
load("//terraform:container.bzl", "image_embedder", "terraform_k8s_manifest")
load("@io_bazel_rules_docker//python:image.bzl", "py_image")

Expand Down Expand Up @@ -32,7 +32,6 @@ terraform_module(
"k8s.tf",
"main.tf",
],
description = "A hello-world service that is designed to run on Kubernetes",
embed = [":k8s-deployment"],
visibility = ["//visibility:public"],
)
Expand All @@ -44,7 +43,6 @@ terraform_module(
"ecs-plumbing.tf",
"main.tf",
],
description = "A hello-world service that is designed to run on ECS",
embed = [":ecs-task-containers"],
visibility = ["//visibility:public"],
)
3 changes: 3 additions & 0 deletions examples/src/ecs.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* A hello-world service that is designed to run on ECS!
*/
variable replicas {
description = "Desired # of ECS replicas"
default = 1
Expand Down
4 changes: 3 additions & 1 deletion examples/src/k8s.tf
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

/**
* A hello-world service that is designed to run on Kubernetes
*/
data kubectl_namespace current {}

resource kubernetes_config_map hello_world_server {
Expand Down
7 changes: 2 additions & 5 deletions terraform/container.bzl
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
load("//terraform:providers.bzl", _ModuleInfo = "ModuleInfo")
load("//terraform/internal:k8s.bzl", _terraform_k8s_manifest = "terraform_k8s_manifest")
load("//terraform/internal:image_embedder.bzl", _image_publisher = "image_publisher")
load("//terraform/internal:k8s_manifest.bzl", "terraform_k8s_manifest")
load("//terraform/internal:image_embedder.bzl", "image_publisher")
load(
"//terraform/internal:image_embedder_lib.bzl",
_embed_images = "embed_images",
_image_embedder_attrs = "image_embedder_attrs",
)

terraform_k8s_manifest = _terraform_k8s_manifest
image_publisher = _image_publisher

def _image_embedder_impl(ctx):
providers = []

Expand Down
98 changes: 4 additions & 94 deletions terraform/def.bzl
Original file line number Diff line number Diff line change
@@ -1,94 +1,4 @@
load(
"//terraform/internal:terraform.bzl",
"terraform_plugin",
_terraform_module = "terraform_module",
_terraform_workspace = "terraform_workspace",
)
load("//terraform/internal:test.bzl", "terraform_integration_test")
load(
"//terraform/internal:distribution.bzl",
"terraform_distribution_publisher",
"terraform_module_publisher",
_terraform_distribution_dir = "terraform_distribution_dir",
)
load("//terraform:providers.bzl", "tf_workspace_files_prefix")

def terraform_distribution_dir(name, deps, **kwargs):
srcs_name = "%s.srcs-list" % name
module_name = "%s.module" % name

# change "relative" deps to absolute deps
deps_abs = [
"//" + native.package_name() + dep if dep.startswith(":") else dep
for dep in deps
]
native.genquery(
name = srcs_name,
opts = ["--noimplicit_deps"],
expression = """kind("source file", deps(set(%s)))""" % " ".join(deps_abs),
scope = deps_abs,
)

terraform_module(
name = module_name,
deps = deps_abs,
)

_terraform_distribution_dir(
name = name,
srcs_list = ":" + srcs_name,
module = ":" + module_name,
**kwargs
)

def _flip_modules_attr(modules):
"""
Translate modules attr from a 'name=>label' dict to 'label=>name'
"""
flipped = {}
for name, label in modules.items():
if not (label.startswith("@") or label.startswith("//") or label.startswith(":")):
fail("Modules are now specified as 'name=>label'", attr="modules")
# append package path & workspace name as necessary
abs_label = "//" + native.package_name() + label if label.startswith(":") else label
abs_label = native.repository_name() + abs_label if abs_label.startswith("//") else abs_label
if abs_label in flipped:
fail("Modules may only be specified once (%s)" % label, attr = "modules")
flipped[abs_label] = name
return flipped

def terraform_module(name, modules = {}, **kwargs):
_terraform_module(
name = name,
modules = _flip_modules_attr(modules),
**kwargs
)

def terraform_workspace(name, modules = {}, **kwargs):
_terraform_workspace(
name = name,
modules = _flip_modules_attr(modules),
**kwargs
)

# create a convenient destroy target which
# CDs to the package dir and runs terraform destroy
native.genrule(
name = "%s.destroy" % name,
outs = ["%s.destroy.sh" % name],
cmd = """echo '
#!/bin/sh
set -eu
tf_workspace_dir="$$BUILD_WORKSPACE_DIRECTORY/{package}/{tf_workspace_files_prefix}"
if [ -e "$$tf_workspace_dir" ]; then
cd "$$tf_workspace_dir"
exec terraform destroy "$$@" .terraform/tfroot
else
>&2 echo "Could not find terraform workspace dir, so there is nothing to destroy ($$tf_workspace_dir)"
fi
' > $@""".format(
package = native.package_name(),
tf_workspace_files_prefix = tf_workspace_files_prefix(name),
),
executable = True,
)
load("//terraform/internal:terraform.bzl", "terraform_plugin")
load("//terraform/internal:workspace.bzl", "terraform_workspace")
load("//terraform/internal:module.bzl", "terraform_module")
load("//terraform/internal:integration_test.bzl", "terraform_integration_test")
21 changes: 17 additions & 4 deletions terraform/dependencies.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ _EXTERNAL_BINARIES = {
"hub": dict(
url = "https://github.com/github/hub/releases/download/v{version}/hub-{platform}-amd64-{version}.tgz",
path = "hub-{platform}-amd64-{version}/bin/hub",
version = "2.5.1",
version = "2.6.0",
),
}

Expand All @@ -52,8 +52,21 @@ py_library(
visibility = ["//visibility:public"],
)""",
sha256 = "592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab",
url = ("https://pypi.python.org/packages/4a/85/" +
"db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a" +
"/PyYAML-3.12.tar.gz"),
url = ("https://pypi.python.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz"),
strip_prefix = "PyYAML-3.12/lib/yaml",
)
if "py_semver" not in native.existing_rules():
native.new_http_archive(
name = "py_semver",
build_file_content = """
py_library(
name = "py_semver",
srcs = glob(["*.py"]),
visibility = ["//visibility:public"],
imports = ["semver"],
)
""",
sha256 = "5b09010a66d9a3837211bb7ae5a20d10ba88f8cb49e92cb139a69ef90d5060d8",
url = "https://files.pythonhosted.org/packages/47/13/8ae74584d6dd33a1d640ea27cd656a9f718132e75d759c09377d10d64595/semver-2.8.1.tar.gz",
strip_prefix = "semver-2.8.1",
)
Empty file.
3 changes: 3 additions & 0 deletions terraform/experimental/ghrelease/def.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
load("//terraform/experimental/ghrelease/internal:publisher.bzl", "ghrelease")
load("//terraform/experimental/ghrelease/internal:assets.bzl", "ghrelease_assets")
load("//terraform/experimental/ghrelease/internal:test_suite.bzl", "ghrelease_test_suite")
24 changes: 24 additions & 0 deletions terraform/experimental/ghrelease/internal/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[py_binary(
name = f[:-len(".py")],
srcs = [f],
visibility = ["//visibility:public"],
deps = [":lib"],
) for f in glob(["*_runner.py"])]

py_library(
name = "lib",
srcs = ["lib.py"],
imports = [
"rules_terraform/terraform/experimental/ghrelease/internal",
],
deps = [
"@py_semver",
],
)

py_test(
name = "test",
size = "small",
srcs = ["test.py"],
deps = [":lib"],
)
Loading

0 comments on commit 783235e

Please sign in to comment.