Skip to content

Bazel rules for assembling and deploying software distributions (see @vaticle for usage example)

License

Notifications You must be signed in to change notification settings

envoy/bazel-distribution

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

assemble_crate

assemble_crate(name, authors, categories, crate_features, description, documentation, homepage,
               keywords, license, license_file, readme_file, repository, target, universe_manifests,
               version_file, workspace_refs)

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
authors Project authors List of strings optional []
categories Project categories List of strings optional []
crate_features Available features in the crate, in format similar to the cargo features format. Dictionary: String -> List of strings optional {}
description The description is a short blurb about the package. crates.io will display this with your package. This should be plain text (not Markdown). https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field String required
documentation Link to documentation of the project String optional ""
homepage Link to homepage of the project String required
keywords The keywords field is an array of strings that describe this package. This can help when searching for the package on a registry, and you may choose any words that would help someone find this crate.

Note: crates.io has a maximum of 5 keywords. Each keyword must be ASCII text, start with a letter, and only contain letters, numbers, _ or -, and have at most 20 characters.

https://doc.rust-lang.org/cargo/reference/manifest.html#the-keywords-field
List of strings optional []
license The license field contains the name of the software license that the package is released under. https://doc.rust-lang.org/cargo/reference/manifest.html#the-license-and-license-file-fields String required
license_file License file for the crate. Label optional None
readme_file README of the project Label optional None
repository Repository of the project String required
target rust_library label to be included in the package Label required
universe_manifests The Cargo manifests used by crates_universe to generate Bazel targets for crates.io dependencies.

These manifests serve as the source of truth for emitting dependency configuration in the assembled crate, such as explicitly requested features and the exact version requirement.
List of labels optional []
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None
workspace_refs JSON file describing dependencies to other Bazel workspaces Label optional None

assemble_maven

assemble_maven(name, developers, license, platform_overrides, project_description, project_name,
               project_url, scm_url, target, version_file, version_overrides, workspace_refs)

Assemble Java package for subsequent deployment to Maven repo

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
developers Project developers to fill into pom.xml Dictionary: String -> List of strings optional {}
license Project license to fill into pom.xml String optional "apache"
platform_overrides Per-platform overrides for a dependency. Expects a dict of bazel labels to a JSON-encoded list of maven coordinates. Ex.: assemble_maven( ... platform_overrides = { ":bazel-dependency": json.encode([ "org.company:dependency-windows-x86_64:{pom_version}", "org.company:dependency-linux-aarch64:{pom_version}", "org.company:dependency-linux-x86_64:{pom_version}", "org.company:dependency-macosx-aarch64:{pom_version}", "org.company:dependency-macosx-x86_64:{pom_version}", ]) } ) Dictionary: Label -> String optional {}
project_description Project description to fill into pom.xml String optional "PROJECT_DESCRIPTION"
project_name Project name to fill into pom.xml String optional "PROJECT_NAME"
project_url Project URL to fill into pom.xml String optional "PROJECT_URL"
scm_url Project source control URL to fill into pom.xml String optional "PROJECT_URL"
target Java target for subsequent deployment Label required
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None
version_overrides Dictionary of maven artifact : version to pin artifact versions to Dictionary: String -> String optional {}
workspace_refs JSON file describing dependencies to other Bazel workspaces Label optional None

assemble_npm

assemble_npm(name, target, version_file)

Assemble npm_package target for further deployment. Currently does not support remote execution (RBE).

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
target npm_library label to be included in the package. Label required
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0'. Label optional None

assemble_pip

assemble_pip(name, author, author_email, classifiers, description, keywords, license,
             long_description_file, package_name, python_requires, requirements_file, suffix, target,
             url, version_file)

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
author Details about the author String required
author_email The email for the author String required
classifiers A list of strings, containing Python package classifiers List of strings required
description A string with the short description of the package String required
keywords A list of strings, containing keywords List of strings required
license The type of license to use String required
long_description_file A label with the long description of the package. Usually a README or README.rst file Label required
package_name A string with Python pip package name String required
python_requires If your project only runs on certain Python versions, setting the python_requires argument to the appropriate PEP 440 version specifier string will prevent pip from installing the project on other Python versions. String optional ">0"
requirements_file A file with the list of required packages for this one Label required
suffix A suffix that has to be removed from the filenames String optional ""
target py_library label to be included in the package Label required
url A homepage for the project String required
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None

assemble_versioned

assemble_versioned(name, targets, version_file)

Version multiple archives for subsequent simultaneous deployment

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
targets Archives to version and put into output archive List of labels optional []
version_file File containing version string Label optional None

checksum

checksum(name, archive)

Computes SHA256 checksum of file

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
archive Archive to compute checksum of Label required

deploy_apt

deploy_apt(name, release, snapshot, target)

Deploy package built with assemble_apt to APT repository.

Select deployment to `snapshot` or `release` repository with `bazel run //:some-deploy-apt -- [snapshot|release]

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
release Release repository to deploy apt artifact to String required
snapshot Snapshot repository to deploy apt artifact to String required
target assemble_apt label to deploy Label optional None

deploy_brew

deploy_brew(name, file_substitutions, formula, release, snapshot, type, version_file)

Deploy Homebrew (Caskroom) formula to Homebrew tap.

Select deployment to `snapshot` or `release` repository with `bazel run //:some-deploy-brew -- [snapshot|release]

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
file_substitutions Substitute file contents into the formula. Key: file to read the substitution from. Value: placeholder in the formula template to substitute. Dictionary: Label -> String optional {}
formula The brew formula definition Label required
release Release repository to deploy brew artifact to String required
snapshot Snapshot repository to deploy brew artifact to String required
type Type of deployment (Homebrew/Caskroom). Cask is generally used for graphic applications String optional "brew"
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None

deploy_crate

deploy_crate(name, release, snapshot, target)

Deploy assemble_crate target into Crate repo

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
release Release repository to release Crate artifact to String required
snapshot Snapshot repository to release Crate artifact to String required
target assemble_crate target to deploy Label required

deploy_github

deploy_github(name, archive, draft, organisation, release_description, repository, title,
              title_append_version, version_file)

Deploy assemble_versioned target to GitHub Releases

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
archive assemble_versioned label to be deployed. Label optional None
draft Creates an unpublished / draft release when set to True. Defaults to True. Boolean optional True
organisation Github organisation to deploy to String required
release_description Description of GitHub release Label optional None
repository Github repository to deploy to within organisation String required
title Title of GitHub release String optional ""
title_append_version Append version to GitHub release title Boolean optional False
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None

deploy_npm

deploy_npm(name, release, snapshot, target)
Deploy `assemble_npm` target into npm registry using token authentication.

Select deployment to `snapshot` or `release` repository with `bazel run //:some-deploy-npm -- [snapshot|release]

## How to generate an auth token

### Using the command line (`npm adduser`)
1. Run `npm adduser <repo_url>` (example: `npm adduser --registry=https://repo.vaticle.com/repository/npm-private`)
2. When prompted, provide login credentials to sign in to the user account that is used in your CI and has permissions to publish the package
3. If successful, a line will be added to your `.npmrc` file (`$HOME/.npmrc` on Unix) which looks like: `//repo.vaticle.com/repository/npm-snapshot/:_authToken=NpmToken.00000000-0000-0000-0000-000000000000`. The token is the value of `_authToken`, in this case `NpmToken.00000000-0000-0000-0000-000000000000`.
4. Save the auth token somewhere safe and then delete it from your `.npmrc` file

### Using a UI

Some remote repository managers (e.g. the `npm` registry, https://npmjs.com) provide a UI to create auth tokens.

#### `npm` registry (`npmjs.com`)

1. Sign in to the user account at https://npmjs.com that is used in your CI and has permissions to publish the package
2. Navigate to the account's "Access Tokens", generate a new one and store it somewhere safe

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
release Release repository to deploy npm artifact to. String required
snapshot Snapshot repository to deploy npm artifact to. String required
target assemble_npm target to be included in the package. Label required

deploy_packer

deploy_packer(name, overwrite, target)

Execute Packer to perform deployment

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
overwrite Overwrite already-existing image Boolean optional False
target assemble_packer label to be deployed. Label optional None

deploy_rpm

deploy_rpm(name, release, snapshot, target)

Deploy package built with assemble_rpm to RPM repository.

Select deployment to `snapshot` or `release` repository with `bazel run //:some-deploy-rpm -- [snapshot|release]

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
release Remote repository to deploy rpm release to String required
snapshot Remote repository to deploy rpm snapshot to String required
target assemble_rpm target to deploy Label optional None

generate_json_config

generate_json_config(name, substitutions, template)

Fills in JSON template with provided values

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
substitutions Values to fill in Dictionary: String -> String optional {}
template JSON template to fill in values Label optional None

java_deps

java_deps(name, java_deps_root, java_deps_root_overrides, maven_name, target, version_file)

Packs Java library alongside with its dependencies into archive

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
java_deps_root Folder inside archive to put JARs into String optional ""
java_deps_root_overrides JARs with filenames matching the given patterns will be placed into the specified folders inside the archive, instead of the default folder. Patterns can be either the full name of a JAR, or a prefix followed by a '*'. Dictionary: String -> String optional {}
maven_name Name JAR files inside archive based on Maven coordinates Boolean optional False
target Java target to pack into archive Label required
version_file File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' Label optional None

tgz2zip

tgz2zip(name, output_filename, tgz)

Converts .tar.gz into .zip

ATTRIBUTES

Name Description Type Mandatory Default
name A unique name for this target. Name required
output_filename Resulting filename String required
tgz Input .tar.gz archive Label required

JarToMavenCoordinatesMapping

JarToMavenCoordinatesMapping(filename, maven_coordinates)

FIELDS

Name Description
filename jar filename
maven_coordinates Maven coordinates of the jar

MavenDeploymentInfo

MavenDeploymentInfo(jar, srcjar, pom)

FIELDS

Name Description
jar JAR file to deploy
srcjar JAR file with sources
pom Accompanying pom.xml file

TransitiveJarToMavenCoordinatesMapping

TransitiveJarToMavenCoordinatesMapping(mapping)

FIELDS

Name Description
mapping maps jar filename to coordinates

assemble_apt

assemble_apt(name, package_name, maintainer, description, version_file, installation_dir,
             workspace_refs, archives, empty_dirs, empty_dirs_permission, files, depends, symlinks,
             permissions, architecture, target_compatible_with)

Assemble package for installation with APT

PARAMETERS

Name Description Default Value
name A unique name for this target. none
package_name Package name for built .deb package https://www.debian.org/doc/debian-policy/ch-controlfields#package none
maintainer The package maintainer's name and email address. The name must come first, then the email address inside angle brackets <> (in RFC822 format) none
description description of the built package https://www.debian.org/doc/debian-policy/ch-controlfields#description none
version_file File containing version number of a package. Alternatively, pass --define version=VERSION to Bazel invocation. Specifying commit SHA will result in prepending '0.0.0' to it to comply with Debian rules. Not specifying version at all defaults to '0.0.0' https://www.debian.org/doc/debian-policy/ch-controlfields#version None
installation_dir directory into which .deb package is unpacked at installation None
workspace_refs JSON file with other Bazel workspace references None
archives Bazel labels of archives that go into .deb package []
empty_dirs list of empty directories created at package installation []
empty_dirs_permission UNIXy permission for the empty directories to be created "0777"
files mapping between Bazel labels of archives that go into .deb package and their resulting location on .deb package installation {}
depends list of Debian packages this package depends on https://www.debian.org/doc/debian-policy/ch-relationships.htm []
symlinks mapping between source and target of symbolic links created at installation {}
permissions mapping between paths and UNIXy permissions {}
architecture package architecture (default option: 'all', common other options: 'amd64', 'arm64') "all"
target_compatible_with

-

[]

assemble_aws

assemble_aws(name, ami_name, install, region, files)

Assemble files for AWS deployment

PARAMETERS

Name Description Default Value
name A unique name for this target. none
ami_name AMI name of deployed image none
install Bazel label for install file none
region AWS region to deploy image to none
files Files to include into AWS deployment none

assemble_azure

assemble_azure(name, image_name, resource_group_name, install, image_publisher, image_offer,
               image_sku, disk_size_gb, files)

Assemble files for Azure deployment

PARAMETERS

Name Description Default Value
name A unique name for this target. none
image_name name of deployed image none
resource_group_name name of the resource group to place image in none
install Bazel label for install file none
image_publisher Publisher of the image used as base "Canonical"
image_offer Offer of the image used as base "0001-com-ubuntu-server-focal"
image_sku SKU of the image used as base "20_04-lts"
disk_size_gb Size of the resulting OS disk 60
files Files to include into Azure deployment None

assemble_gcp

assemble_gcp(name, project_id, install, zone, image_name, image_family, files, image_licenses,
             disable_default_service_account, source_image_family)

Assemble files for GCP deployment

PARAMETERS

Name Description Default Value
name A unique name for this target. none
project_id Google project id none
install Bazel label for install file none
zone GCP zone to deploy image to none
image_name name of deployed image none
image_family family of deployed image ""
files Files to include into GCP deployment None
image_licenses licenses to attach to deployed image None
disable_default_service_account disable default service account False
source_image_family Family of GCP base image "ubuntu-1604-lts"

assemble_packer

assemble_packer(name, config, files)

Assemble files for HashiCorp Packer deployment

PARAMETERS

Name Description Default Value
name A unique name for this target. none
config Packer JSON config none
files Files to include into deployment {}

assemble_rpm

assemble_rpm(name, package_name, spec_file, version_file, workspace_refs, installation_dir,
             archives, empty_dirs, files, permissions, symlinks, tags)

Assemble package for installation with RPM

PARAMETERS

Name Description Default Value
name A unique name for this target. none
package_name Package name for built .rpm package none
spec_file The RPM spec file to use none
version_file File containing version number of a package. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version defaults to '0.0.0' None
workspace_refs JSON file with other Bazel workspace references None
installation_dir directory into which .rpm package is unpacked at installation None
archives Bazel labels of archives that go into .rpm package []
empty_dirs list of empty directories created at package installation []
files mapping between Bazel labels of archives that go into .rpm package and their resulting location on .rpm package installation {}
permissions mapping between paths and UNIX permissions {}
symlinks mapping between source and target of symbolic links created at installation {}
tags additional tags passed to all wrapped rules []

assemble_targz

assemble_targz(name, output_filename, targets, additional_files, empty_directories, permissions,
               append_version, visibility, tags, target_compatible_with)

Assemble distribution archive (.tar.gz)

PARAMETERS

Name Description Default Value
name A unique name for this target. none
output_filename filename of resulting archive None
targets Bazel labels of archives that go into .tar.gz package []
additional_files mapping between Bazel labels of files that go into archive and their resulting location in archive {}
empty_directories list of empty directories created at archive installation []
permissions mapping between paths and UNIX permissions {}
append_version append version to root folder inside the archive True
visibility controls whether the target can be used by other packages ["//visibility:private"]
tags

-

[]
target_compatible_with

-

[]

assemble_zip

assemble_zip(name, output_filename, targets, additional_files, empty_directories, permissions,
             append_version, visibility, tags, target_compatible_with)

Assemble distribution archive (.zip)

PARAMETERS

Name Description Default Value
name A unique name for this target. none
output_filename filename of resulting archive none
targets Bazel labels of archives that go into .tar.gz package []
additional_files mapping between Bazel labels of files that go into archive and their resulting location in archive {}
empty_directories list of empty directories created at archive installation []
permissions mapping between paths and UNIX permissions {}
append_version append version to root folder inside the archive True
visibility controls whether the target can be used by other packages ["//visibility:private"]
tags

-

[]
target_compatible_with

-

[]

deploy_maven

deploy_maven(name, target, snapshot, release, kwargs)

PARAMETERS

Name Description Default Value
name

-

none
target

-

none
snapshot

-

none
release

-

none
kwargs

-

none

deploy_pip

deploy_pip(name, target, snapshot, release, suffix, distribution_tag)

PARAMETERS

Name Description Default Value
name

-

none
target

-

none
snapshot

-

none
release

-

none
suffix

-

""
distribution_tag

-

"py3-none-any"

About

Bazel rules for assembling and deploying software distributions (see @vaticle for usage example)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Starlark 56.2%
  • Kotlin 27.8%
  • Python 15.4%
  • Shell 0.6%