Effortless Helm Chart Deployments

adminCI/CD, DevOps, Meetup0 Comments

Learn how to deploy complex service-oriented architectures easily using Helmfiles. Forget umbrella charts and manual helm deployments. Helmfile is the missing piece of the puzzle. Helmfiles are the declarative way to deploy Helm charts in a 12-factor compatible way. They’re great for deploying all your kubernetes services and even for Codefresh continuous delivery to Kubernetes. We’ll show you exactly how we do it with a live demo, including public repos for all our helmfiles.

SweetOps Town Hall Meeting

adminMeetup0 Comments

Today we had our first “Town Hall” meeting where members of our SweetOps community (slack.cloudposse.com) got together on a Zoom conference call to talk shop.

Remember to vote when we should have our next call.

Discussion Points

  • GitOps – CI/CD Automation of Terraform
  • Git ChatOps
  • OAuth2 Proxy
  • Govcloud

Pain Points

There were a few shared pain points by members.

  • Keeping modules up to date is tedious, especially in busy environments where modules are released frequently. We wish there was a way to identify out of date modules and easily update those module references. Erik mentioned that he submitted a “Feature Request” for Dependabot to support HCL. Please 👍 if you think this would be awesome!
  • Loren mentioned that using Open Source in Govcloud is difficult because Govcloud lags way behind the commercial AWS cloud in features. For example, EC2 instance tags cannot be set on launch. Other times, API endpoint URLs just don’t work because they’ve been hardcoded to the ones used by the commercial cloud offering.
  • Erik mentioned that OAuth2 Proxy appears to be an abandoned project. With over 90+ open pull requests, broken OpenID Connect support and no new releases in over a year, maybe it’s time for a new maintainer. Apparently, others have suggested this too.


A number of technologies came up in our discussions


Other Links



  • Hold these “Town Hall” meetings more often (perhaps weekly)  and at different times so that we can include members in all geographies and time zones.
  • Ensure we record and publish the next call

Geodesic Logo!

adminUncategorized0 Comments

We’ve finally settled on a logo for Geodesic, our solution for implementing rock-solid cloud architectures.

In mathematics, a geodesic line is the shortest distance between two points on a sphere. It’s also a solid structure composed of geometric shapes such as hexagons.


We like to think of geodesic as the shortest path to a rock-solid cloud infrastructure. The geodesic logo is a hexagon with a cube suspended at its center. The cube represents this geodesic container, which is central to everything and at the same time is what ties everything together.


But look a little closer and you’ll notice there’s much more to it. It’s also an isometric shape of a cube with a missing piece. This represents its pluggable design, which lets anyone extend it to suit their vision.

Top 5 DevOps Bad Habbits

adminDevOps, OpEd0 Comments

Recently, we were asked to name our top (5) DevOps “Worst Practices” (or anti-patterns). Here’s what we came up with…

#1. Not looking outside the organization to see how others are solving the problem. Always building new things rather than looking for readymade solutions (open source, SaaS, or enterprise offerings) which leads to piles of technical debt & inevitable snowflake infrastructures.

#2. Not building easy tools that the rest of the company can use. We must never forget who we are serving. Developers are our customers too.

#3. Not treating DevOps as a shared responsibility. It needs to be embedded into the engineering organization, not relegated to a select few individuals. “DevOps” is more of a philosophy than a job title.

#4. Not treating Infrastructure as Code. We call this new paradigm GitOps, where Git system of record for all infrastructure and CI/CD is our delivery mechanism.

#5. Never ever commit to `master`. We don’t do it in regular software projects, we shouldn’t do it for ops. Everyone should be following the standard Git Workflow on their Infrastructure Code (Feature Branching, Pull Requests, Code Reviews, CI/CD). This increases transparency and helps the rest of the team stay up to date with everything going on.

Unlimited Staging Environments

adminCI/CD, DevOps, Slides0 Comments

How to run complete, disposable apps on Kubernetes for Staging and Development

What if you could rapidly spin up new environments in a matter of minutes entirely from scratch, triggered simply by the push of a button or automatically for every Pull Request or Branch. Would that be cool?

That’s what we thought too! Companies running complex microservices architectures need a better way to do QA, prototype new features & discuss changes. We want to show that there’s a simpler way to collaborate and it’s available today if you’re running Kubernetes.

Tune in to learn how you can assemble 100% Open Source components with a CodeFresh CI/CD Pipeline to deploy your full stack for any branch and expose it on a unique URL that you can share. Not only that, we ensure that it’s fully integrated with CI/CD so console expertise is not required to push updates. Empower designers and front-end developers to push code freely. Hand it over to your sales team so they can demo upcoming features for customers! The possibilities are unlimited. =)


Quip Plugin for WordPress

adminProjects0 Comments

We just published our New WordPress Plugin for @quip. Easily embed quip documents in any #wordpress post or page. Check it out here!

WordPress Plugin Directory: https://wordpress.org/plugins/wp-quip/


Screenshot 1: Example Usage

Screenshot 2: Admin UI


To embed the content of a Quip document into a WordPress page or blog post, install the plugin and then use the quip shortcode.

quip shortcode accepts two attributes and has the following format:

[quip id="mWnnAszre3MW" ttl=7200] 


  • id (Required) – The ID of the Quip document (e.g. https://cloudposse.quip.com/mWnnAszre3MW)
  • ttl (Optional) – Time-To-Live in seconds. After the first request to the Quip API, the plugin caches the content of the document (HTML and images) for the specified amount of time (seconds). All consecutive requests to the same page or blog post will not call the Quip API again but instead will retrieve the document from the internal cache, making the pages faster. After the ttl expires, the plugin will call the Quip API and cache the result again. If the ttl attribute is not provided, the default value of 7200 seconds (2 hours) is used. You can change the default value in Quip Settings (menu Settings/WP Quip). If ttl is set to 0, the plugin will not cache the Quip API responses, and every request to the WordPress page or blog post will call the Quip API.



Feature Branching & Pull Requests (Git Workflow)

adminDevOps0 Comments

Feature Branches & Pull Requests


When you're working on a project, there will be a bunch of different features or ideas in progress at any given time, not all of which are ready for prime time. Further more, as business priorities change, you might need to prioritize certain features and put others on the back burner. 

At the same time, business requirements mandate that you have a stable version that can be deployed at any given time. We know code can never be entirely bug free. Further more, once deployed there can be unintended consequences. Other times, managers simply change their mind and decide that a certain feature was premature or unnecessary. To mitigate the impact of these events, we need the ability to rollback a feature or cut-bait.

TL;DR: If everyone is working on the same branch such as master, it pollutes the commit history making it all but impossible to figure out which commits relate to specific features making rollbacks impossible. 


To solve this problem, the standard workflow called branching should be used religiously. Any time a new feature is developed it must be worked on in a separate branch. When you create a branch, you're creating an environment where you can freely test out new ideas without impacting others because changes made on a branch don't affect the master branch (or any other one). 

Further more, no two developers should ever commit to, or work on the same branch at the same time (unless they have permission with the branch stakeholder). Instead, they should create a new branch. 

The next thing that needs to happen is that the master branch is treated as the Holy Grail. Every effort is made to ensure it's stable and can be deployed to production at any time.

Once a feature is considered ready, the developer submits a Pull Request (or PR) and assigns it to a Subject Matter Expert (SME) or peer for review.

On the surface, this is what a well-formatted Pull Request looks like:

A Pull Request allows many things to happen:

  • Title: A “human readable” title that represents the feature

  • Description: A long description that details What was changed, Why it was deemed necessary, Who should review it, and any other References that might be useful (E.g. Jira ticket)
  • Comments: let anyone provide arbitrary feedback viewable by everyone.  
  • Diffs: show what changed between this feature and the current master branch
  • Formal Code Review Process:  let multiple people contribute to the code review process by submitting comments on a line-by-line basis. Having these code reviews formally documented serves as an excellent teaching tool. Over time, the reviews become faster and faster as developers learn what is expected.

  • Merging: Once the PR is approved, the developer can squash and merge their code into the master branch. Squashing allows the master branch to have a very clean commit history where every commit corresponds to a PR. 

  • Clean Commit History: means that every change to the master branch is documented and justified. No one is sneaking in changes.

  • History of Features and when they were added

  • Reverting: If a feature needs to be removed, with the click of a single button it can be removed from the master branch

Technical Details

Create a Branch

Whenever you begin work on a new feature or bugfix, it's important that you create a new branch. Not only is it proper git workflow, but it also keeps your changes organized and separated from the master branch so that you can easily submit and manage multiple pull requests for every task you complete.

To create a new branch and start working on it:

# Checkout the master branch - you want your new branch to come from master
git checkout master

# Pull down the latest changes
git pull origin master

# Create a new branch, with a descriptive name  (e.g. implement-xyz-widget)
git checkout -b newfeature

Now, go to town hacking away. When you're ready, push the changes up to the origin.

git push origin newfeature

Submitting a Pull Request

Prior to submitting your pull request, you might want to do a few things to clean up your branch and make it as simple as possible for the original repo's maintainer to test, accept, and merge your work.

If any commits have been made to the upstream master branch, you should rebase your development branch so that merging it will be a simple fast-forward that won't require any conflict resolution work.

# Fetch upstream master and merge with your repo's master branch
git pull origin master --rebase

Follow the prompts to correct any code conflicts. Any file that is conflicted needs to be manually reviewed. After you fix the problems run:

 git add filename
git rebase --continue

Once that is happy, push the rebased changes back to the origin.

git push origin newfeature -f

Then follow these instructions once you're ready:


Pull Request Template

Use the following markdown template to describe the Pull Request.

## what
* ...high-level explanation of what this PR accomplishes...

## why
* ...business justifications for making the changes...

## references
* ...related pull requests, issues, documents, or research...

Prepared By

Erik Osterman
Cloud Posse, LLC

310 496 6556

312 Arizona Ave
Santa Monica, CA

How to Easily Pair Program on the Console

adminDevOps0 Comments

Peer Console Development (tmate)

Tmate is a way to share a console window or set of console windows. It’s basically a fork of tmux that makes sessions network enabled. It doesn’t matter where the participants are located - inbound firewall rules don’t interfere since it’s all outbound connections. 

Install tmate

brew tap nviennot/tmate
brew install tmate

Start the SSH Server

tmate -S /tmp/tmate.sock new-session -d

Wait for a connection

tmate -S /tmp/tmate.sock wait tmate-ready 

Get the SSH Command

tmate -S /tmp/tmate.sock display -p '#{tmate_ssh}'

Share the output of the above command with someone you want to share the terminal window with. You should both run the command. The person who runs the SSH Server is the host of the session.

# Example session: (now expired)
ssh q9YsisZyUNtI3rvJcDbG1pAHu@sf1.tmate.io

Interacting with Tmate

^b + c create a new window
^b + n move to next window
^b + p move to previous window

Markdown Formatting “Best Practices”

adminBest Practices0 Comments

Markdown Formatting Best Practices

Using Markdown is essential for clear communication on mediums such as GitHub, Slack or just plan text. Here are some of our recommendations on when to use certain conventions.

Code Blocks

Use code blocks for anything more than 1 line. Use `code` for inline code, filenames, commands, etc.

# This is a code block


Use tables to communicate lists of options. 

:--------: should be used for “Default” and “Required” values

:--------- should be used for all other columns

Use  ``  for empty defaults

Use `value`for all values

Here's an example:

|  Name       |  Default |  Description                                  | Required |
| namespace   | ``       | Namespace (e.g. `cp` or `cloudposse`)         | Yes      |
| stage       | ``       | Stage (e.g. `prod`, `dev`, `staging`)         | Yes      |
| name        | ``       | Name  (e.g. `bastion` or `db`)                | Yes      |
| attributes  | []       | Additional attributes (e.g. `policy`)         | No       |
| tags        | {}       | Additional tags  (e.g. `map("Foo","XYZ")`)    | No       |

Which will render to something like this:


Use this format describe the features & benefits.

1. **Feature 1** - Explanation of benefits
2. **Feature 2** - Explanation of benefits


Reference copyrighted text, quotes, and other unoriginal copy using `> `

> Amazon Simple Storage Service (Amazon S3) makes it simple and practical to collect, store, and analyze data - regardless of format – all at massive scale.

GitHub Repository “Best Practices”

adminBest Practices0 Comments

GitHub Repository Best Practices

Create a New Repository

1. Always initialize repository with a README.md and .gitignore

2. If it's an Open Source project, initialize it with the APACHE2 license

3. Update LICENSE file (if applicable)

Copyright {yyyy} {name of copyright owner}
should be
Copyright 2018 Cloud Posse, LLC

4. Set a meaningful Description that describes the purpose repository

4. Add some useful tags to help discovery of the project

5. Submit all new work as PR.

6. Create new label wip for “Work in Progress”

Repository Settings

  • Disable “Merge Commit” and disable “Rebase Merging”
  • Enable Branch Protections