Home

Awesome

envman

Manage your Environment Variable collections. Switch between Environment Variable sets quickly and easily, or run a single command with a pre-defined set of Environment Variables.

envman can also be used as a bridge between separate tools, one tool can register its outputs through envman and the next tool can access these as simple environment variables.

Public Beta: this repository is still under active development, frequent changes are expected, but we we don't plan to introduce breaking changes, unless really necessary. Feedback is greatly appreciated!

Part of the Bitrise Continuous Integration, Delivery and Automations Stack, with bitrise and stepman.

Who and for what?

Install

Check the latest release for instructions at: https://github.com/bitrise-io/envman/releases

How? - Use cases

Develop & Test in Docker

Build:

docker build -t envman .

Run:

docker run --rm -it -v `pwd`:/go/src/github.com/bitrise-io/envman --name envman-dev envman /bin/bash

How does it work?

envman will run the command you specify with the environments found in its environment store.

First, run envman init to create an empty .envstore.yml file in the current directory. Now when you add a new key-value pair with envman add it stores the key and value in an .envstore.yml file in the current directory (this can be changed), and when you call envman run the next time the environments in the .envstore.yml file will be loaded for the command, and the command will be executed with an environment which includes the specified environment variables.

This is the same as you would manually set all the environments, one by one with export KEY=value (in bash) before calling the command.

envman makes it easy to switch between environment sets and to isolate these environment sets from each other - you don't have to unset environments, the specified environment set will only be available for that single run of envman / the command and won't affect subsequent calls of the command or envman.

Usage example: Simple Bash example

Add/store an environment variable:

envman add --key MY_TEST_ENV_KEY --value 'test value for test key'

Echo it:

envman run bash -c 'echo "Environment test: $MY_TEST_ENV_KEY"'

Mark an Env Var as sensitive and redact it from the build logs

Add/store an environment variable:

envman add --key MY_SECRET_ENV_KEY --value 'this is a secret value' --sensitive

Why bash -c is required? Because echo in itself does not do any environment expansion, it simply prints its input. So if you want to see the value of an environment you have to run it through a tool/shell which actually performs the environment expansion (replaces the environment key with the value associated with it).

Usage example: Ruby

Add environment variable with --value flag

system( "envman add --key SOME_KEY --value 'some value' --expand false" )

Add environment variable from an input stream

IO.popen('envman add --key SOME_KEY', 'r+') {|f|
	f.write('some value')
	f.close_write
	f.read
}

Add environment variable with a value file

require 'tempfile'

file = Tempfile.new('SOME_FILE_NAME')
file.write('some value')
file.close

system( "envman add --key SOME_KEY --valuefile #{file.path}" )

file.unlink

Usage example: Go

Add environment variable with --value flag

import "os/exec"

c := exec.Command("envman", "add", "--key", "SOME_KEY", "--value", "some value")
err := c.Run()
if err != nil {
   // Handle error
}

Add environment variable from an input stream

import "os/exec"

func RunPipedEnvmanAdd(keyStr, valueStr string) error {
	envman := exec.Command("envman", "add", "--key", keyStr)
	envman.Stdin = strings.NewReader(valueStr)
	envman.Stdout = os.Stdout
	envman.Stderr = os.Stderr
	return envman.Run()
}

err := RunPipedEnvmanAdd("SOME_KEY", "some value")
if err != nil {
	// Handle error
}

Add environment variable with a value file

import (
	"os/exec"
	"fmt"
)

c := exec.Command("envman", "add", "--key", "SOME_KEY", "--valuefile", "/path/to/file/which/contains/the/value")
err := c.Run()
if err != nil {
	// Handle error
}

Usage example: Bash

Add environment variable with --value flag

envman add --key SOME_KEY --value 'some value'

Add environment variable from an input stream

echo "some value" | envman add --key SOME_KEY

Add environment variable with a value file

envman add --key SOME_KEY --valuefile /path/to/file/which/contains/the/value --expand false