- separate remote terraform module state from
terraform.tfstatetoinfrastructure.tfstateandservices.tfstate exo deploy [remote-environment-id]becomesexo deploy infrastructure [remote-environment-id]andexo deploy services [remote-environment-id]
exocomdependency terraform: fix cluster - instance connection
- storage of secrets on s3 changed
{{account-id}}-{{app-name}}-{{remote-environment-id}}-terraform-secrets/secrets.json->{{account-id}}-{{app-name}}-{{remote-environment-id}}-terraform/secrets.json
- update infrastructure names in
exocomdependency to include remote environment id - update internal network name to include remote environment id
- add support for shared code between services
# application.yml # array of directory names, each of which is copied into every service before building the docker image shared:
- worker services can expose ports. See here for documentation
exo test: stop printingThe following tests failed:when no tests fail
- Rename
environmenttoenvironment-variables# application.yml / service.yml local: environment: remote: environment: # becomes local: environment-variables: remote: environment-variables:
- Support deploying to multiple environments.
exo configureandexo deploynow require the remote environment id to be the first argument- storage of secrets and the terraform state on s3 changed
{{account-id}}-{{app-name}}-terraform-secrets/secrets.json->{{account-id}}-{{app-name}}-{{remote-environment-id}}-terraform-secrets/secrets.json{{account-id}}-{{app-name}}-terraform/terraform.tfstate->{{account-id}}-{{app-name}}-{{remote-environment-id}}-terraform/terraform.tfstate- Also update the
LockIDin the DynamoDB TerraformLocks table to reflect the new path
- configuration updates
# application.yml remote: dependencies: url: region: account-id: ssl-certificate-arn: environment-variables: secrets: # becomes remote: dependencies: environments: <remote-environment-id>: # for example qa or production url: region: account-id: ssl-certificate-arn: environment-variables: secrets:
# service.yml remote: dependencies: environment-variables: secrets: url: cpu: memory: # becomes remote: dependencies: cpu: memory: environments: <remote-environment-id>: # for example qa or production url: environment-variables: secrets:
- aws: update log bucket from
production-{{app-name}}-logsto{{account-id}}-{{app-name}}-{{remote-environment-id}}-logs
exo deploy: use terraform-var-fileinstead of-var
Fixes versioning from previous release (should have been major release)
- Fix required fields for RDS dependency
- remote dependencies have been generalized, please refer to
remote-dependency-templates/#{dependency-type}/README.mdfor dependency-specific details. Example change:
remote:
dependencies:
exocom:
type: exocom
config:
version: 0.27.0
# becomes
remote:
dependencies:
exocom:
type: exocom
template-config:
version: 0.27.0- Remove manual port management for local dependencies:
mongo:
image: mongo:3.4.0
ports:
- `4000:4000`
# becomes
mongo:
image: mongo:3.4.0exo-deployhas been reverted to run Terraform on local machine
- application-wide environment variables and secrets now supported. Example:
remote:
environment:
key: value
secrets:
- secret-key- throw previously ignored
exo runerrors - generate Terraform dependency modules in deterministic order
- Fix invalid release 0.33.1 (released the wrong code)
- Fix passing of dependency data to remote a exocom dependency
- Type is no longer necessary for local dependencies
# Before
local:
dependencies:
<id>:
type: # exocom, nats, or generic (defaults to generic if omitted)
image:
config:
# After
local:
dependencies:
<id>:
image:
config:- Local and remote dependencies have been refactored to be more generic:
local:
- name:
version:
config:
remote:
- name:
version:
config:
# becomes
local:
<id>: # user-defined dependency key
type: # exocom, nats, or generic (defaults to generic if omitted)
image: # always required
config:
remote:
<id>: # user-defined dependency key
type: # exocom, rds, or generic (defaults to generic if omitted)
config:- Remove environemnts block:
environment:
default:
local:
remote:
secrets:
# becomes:
local:
environment:
remote:
environment:
secrets:
# default is removed in favor of using yaml defaults- Extract exocom messages into generalized
dependency-datablock:
# service.yml
messages:
receives:
- service.ping
sends:
- service.pong
# becomes:
dependency-data:
exocom:
receives:
- service.ping
sends:
- service.pongAnd
# application.yml
services:
users-service:
message-translation:
- public: users ping
internal: mongo ping
# becomes
services:
users-service:
dependency-data:
exocom:
translations:
- public: users ping
internal: mongo ping- Move
health-checkfield from remote into production block
remote:
health-check:
# becomes
production:
health-check:- For each public service, inject
<PUBLIC_SERVICE>_INTERNAL_ORIGINenvironment variable to every other service. This points to exoposed origins on an internal network - Switch local secrets to using variables in generated docker-compose files
exo generate: check for application and service config schema errors- Remote container names from docker-compose files
- Fix app config validation error messages
- Validate Terraform files before beginning to push Docker images to ECR
exo deploy- rename flag
--update-servicesto--auto-approve - updated to always errors if the terraform file is not up to date
- rename flag
exo run: remove--no-mountflag, now always mountsexo test: remove--no-mountflag, now never mountsexo create: removed in favor ofexo initwhich initializes the current directory as an exosphere project- dependency volumes have been updated to use named docker volumes
# Before - name: 'mongo' version: '3.4.0' config: volumes: - '{{EXO_DATA_PATH}}:/data/db' # After - name: 'mongo' version: '3.4.0' config: persist: - /data/db
- update service environment variables from development/production to local/remote
# Before environment: development: ENV2: value2 ENV3: dev_value3 production: ENV3: prod_value3 # After environment: local: ENV2: value2 ENV3: dev_value3 remote: ENV3: prod_value3
- break up application and service development/production blocks
######################################## # application.yml ######################################## # Before development: dependencies: production: dependencies: url: region: account-id: ssl-certificate-arn: # After local: dependencies: remote: dependencies: url: region: account-id: ssl-certificate-arn: ######################################## # service.yml ######################################## # Before development: dependencies: port: scripts: production: dependencies: port: url: cpu: memory: health-check: # After development: port: scripts: local: dependencies: production: port: remote: dependencies: url: cpu: memory: health-check:
- terraform: inject dependency docker images as variables
- update to terraform 0.11.0 and run terraform in a docker container
- update cloudwatch alarm thresholds from 10/90 to 20/70
- add
exo generatecommandexo generate docker-composegenerates the docker compose files- use the
--checkflag to verify the files are up to date - the files are also updated on each run of
exo run,exo clean,exo test, andexo deploy
- use the
exo generate terraformgenerates the terraform files
- for each public service, all other services receive:
<SERVICE>_EXTERNAL_ORIGINas an environment variable which points to the exposed origin.<SERVICE>is the service role converted to constant case. - update output of commands to include the directory its run in and the environment variables passed to it
- Change the way dependencies are handled. Dependencies and their configuration should be defined either in service.yml, if only that service uses it, or in application.yml, if more than one service uses it.
- Remove
exo template add,exo template fetch, andexo template remove.exo template testremains supported. - Move service template directory from
${APP_DIR}/.exosphereto${APP_DIR}/.exosphere/service_templates - Move exosphere data path from
${HOME_DIR}/.exosphere/...to${APP_PATH}/.exosphere/data - Service protection levels have been weaned down to
publicandworkeronly, and they should be defined inservice.ymlundertype, rather than inapplicaiton.yml
BEFORE:
# application.yml
services:
public:
service1:
...
worker:
service2:
...
AFTER:
# application.yml
services:
service1:
...
service2:
...
# service1 service.yml
type: public
# service2 service.yml
type: worker
exo-test- run tests in deterministic order
- print service names with failed tests
- generate
docker-composefiles in more deterministic manner- sort
depends_onfields - remove user paths
- sort
exo-run: stop printing "docker-compose down" exit error when shutting down application with sigintexo-deploy: pass file name to docker-compose processes
- Assign public ports in development/production blocks of
service.yml.dockerblock has been removed. Only a single port is supported at this time.
docker:
ports:
- '3000:3000'
production:
public-port: 3000Changes to:
development:
port: 3000
production:
port: 3000exo-test: fix bug where every service was being built when testing only one service
exo-run- removed ability to silence services and dependencies
- remove concept of online texts
- no longer spinning up dependencies first and waiting for them to come online before spinning up services
exo-runandexo-test: generate named docker-compose files in#{app-directory}/docker-composedirectory to be committed to git
exo-run: restart services on failureexo-deploy- name ECS instance profiles and role services the same thing. Improves deployment teardown
- print image push progress
exo-test: catch sigint and gracefully shut down test containersexo-clean,exo-deploy,exo-run, andexo-configurecommands can now be run in service directories- improve output logs across all commands
- print commands/timestamps of subprocesses
- build docker-compose network name from application name instead of application direcotory
exo-deploy: allow traffic from bastion instances to postgres RDS instances
exo-run: support secret env vars in development
exo deploy: tag images with repository URI and version before pushing
exo-deploy- pass exocom service routes as a variable to main.tf file
- don't build images that won't be pushed to ECR
exo test: fix bug that required service role and service directory be the same nameexo-deploy: fix Terraform issue of ECS services being spun up before target groups were created
- exo-deploy: Rename S3 bucket and state files:
#{app-name}-terraform->#{account-id}-#{app-name}-terraform#{app-name}-terraform-secrets->#{account-id}-#{app-name}-terraform-secretsdev/terraform.tfstate->terraform.tfstate
- add validation of application.yml fields
- exo-deploy: support loading aws credentials via environment variables
- Update rds config to auto inject variables to an services that dependent on it
exo template test: use--no-mountwhen runningexo testexo deploy- reduce number of things that cause changes in
main.tf- pass service image as variable
- put services in alphabetical order
- pass aws profile as variable
- revert changes to the
main.tffile if deployment is abandoned - generate
terraform/.gitignore - use commit sha as service version number
- skip pushing images to ECR if version already exists
- add flag
--update-serviceswhich exits with an error if it causes any changes inmain.tfand otherwise deploys updates without a confirmation (for use on CI)
- reduce number of things that cause changes in
- Make external DNS a public hosted zone
- Compile service dependency env vars in deployment
exo clean: allow killing containers to finish before exiting
exo deploy- validate required RDS fields for applicable dependencies
- cleanup log messages
exo deploy- iron out remaining bugs in RDS module
- ignore certain dependencies when pushing images to ECR
- switch ECS containers to using to soft memory limits
exo test: fix env passed to docker-compose (caused failures on CI)
exo run/exo test: add--no-mountflag to disable mountingexo deploy- RDS support in production for postgres and mysql engines
- Support for production dependencies listed only in
service.yml
- Restructure configuration of dependencies in
application.ymlandservice.ymldependencies: - name: ... version: ... # becomes development: dependencies: - name: ... version: ... production: dependencies: - name: ... version: ...
exo run: add--productionflag to use the production docker images
exo test: fix for services that use mounting
- add
exo configureandexo deploydocumentation
exo run: replace restarting services with mounting- each service is mounted in
/mnton their dev docker container
- each service is mounted in
- Service
Dockerfilelocations have changed- remove
Dockerfileandtests/Dockerfile - add
Dockerfile.devfor use in development (exo runandexo test) - add
Dockerfile.prodfor use in production
- remove
exo deploy- validate production fields in
application.ymlandservice.yml - read AWS region / account id / ssl certificate arn from
application.yml
- validate production fields in
- Service specific dependencies: support
config/service-environment exo configure: can now handle spaces in secret values- make prompts more clear
exo deploy- better error message when app name conforms to s3 naming
- use profile flag when generating terraform
- Drop support for
exocom@<0.26.1
- add worker service
exo configure/exo deploy: add profile flag to select AWS profileexo deploy- automate service environment variables
- add ability to mark dependency as external in production
exo clean: stop and remove all docker containers used for running / testing
exo deploy: remove requirement that service names be at least 32 charactersexo run/exo test: use different docker networks to prevent clashes
exo run: fix dependency environment variables
exo deployready for useexo template testcommand to test that a service template can be used and has passing tests
- strip control characters from shutdown output
- Drop support for
exocom@<0.24.0 - Update
exo cleanto use prune images and volumes docker commands - Update
exo template fetchto fetch updates for a single template that must be passed as a parameter
- Add
exo configureto manage deployment secrets - Add
exo test - Add support for
exocom@0.24.0 - Update
exo template addto take an optional commit / tag
- incomplete
exo deploywhich is still being developed
- Rewrite in Go, many commands added, changed, and removed.
- incomplete
exo deployand missingexo testeach of which are being developed
- fix nats application dependency
- Add support for application dependencies
- If using exocom your
application.ymlrequires the following update:bus: type: exocom version: 0.21.7 # becomes dependencies: - type: exocom version: 0.21.7
- Added support for using nats with the following in your
application.ymlThe environment variabledependencies: - type: nats version: 0.9.6
NATS_HOSTwill be passed to all services
- If using exocom your
exo-setupandexo-run: switch to DockerCompose from running individualdockerprocesses- Requires the following updates to your
service.ymlfilesdependencies: mongo: version: '3.4.0' docker_flags: volume: '-v {{EXO_DATA_PATH}}:/data/db' online_text: 'waiting for connections' port: '-p 27017:27017' # becomes dependencies: mongo: dev: image: 'mongo' version: '3.4.0' volumes: - '{{EXO_DATA_PATH}}:/data/db' ports: - '27017:27017' online-text: 'waiting for connections'
docker: publish: - '3000:3000' # becomes docker: ports: - '3000:3000'
- Requires the following updates to your
- New command
exo-clean: removes dangling Docker images and volumes exo-add:- add go template
- prompt user for protection level of service