acidjazz / aeonian

Continuous deployment assistance for S3 + CloudFront environments
Apache License 2.0
44 stars 12 forks source link
aeonian aws-sdk bucket circleci cloudfront git-flow ora

Aeonian Logo

æonian

Continuous Deployment for your AWS S3 + CloudFront environments

still in early development

npm version GitHub issues GitHub license CircleCI Join the chat at https://gitter.im/aws-aeonian/Lobby

NPM

I've built this to help supply a continuous delivery git-flow workflow hosted on an AWS serverless setup

What does this do?

Running .deploy('{environment}') will do the following:

  1. Create a new S3 bucket {prefix}-{commit-hash}-{environment} based on the current repo and config
  2. Upload the contents of a local directory you specified as localDir
  3. Configure the newly created bucket as a static website
  4. Change the origin of the CloudFront ID associated to point to our new bucket's website URL
  5. Initiate an invalidation on * making the Distribution pull the new bucket's content
  6. Delete the previous bucket that was assigned as the origin as to not leave a trail of buckets

Example

Let's say you have a script operations/aeonian.js with the following

require('aeonian').config({
  bucket: {
    localDir: './dist/',
    prefix: 'mysite-'
  },
  website: {
    index: 'index.html',
    error: 'error/index.html',
  },
  environments: {
    staging: 'CLOUDFRONT_ID',
    production: 'CLOUDFRONT_ID',
  }
}).deploy(process.argv[2])

Running node operations/aeonian.js staging this would result in

Aeonian Demo

Which would deploy ./dist/ to your S3+CF staging environment

Installation

CircleCI Integration

This is mostly why aeonian exists, to deploy based on commits. Based on the example above, lets say you have the above script operations/aeonian.js in your repo. you could then add the following to your package.json

"scripts": {
  ...
  "staging": "node operations/aeonian.js staging",
  "production": "node operations/aeonian.js production",
  ...
},

After setting your AWS credentials on CircleCi, you could add something like this to your circle.yml

deployment:
  staging:
    branch: staging
    commands:
      - npm run staging
  production:
    branch: master
    commands:
      - npm run production

Nuxt.js Integration

The main reason I built aeonian is for my all of my Nuxt.js projects. I have the following commands in my package.json that I have CircleCI run based on environment

  "scripts": {
    ...
    "production": "yarn generate; node operations/aeonian.js production",
    "staging": "yarn generate; node operations/aeonian.js staging",
    ...
  },