Docker and Private Repos

Jets builds your app with docker build, which eventually calls bundle install. The bundle install command runs within the docker build process. If your project’s Gemfile has private repos, you need to provide access. This page shows you how to do so.

CodeBuild Env Var

Configure the CodeBuild env with an SSM parameter. We’re using an SSM param, so the token is redacted in the CodeBuild logs.

config/jets/bootstrap.rb

Jets.bootstrap.configure do
 config.codebuild.project.env.vars = {
 BUNDLE_GITHUB__COM: "SSM:/#{ssm_env}/BUNDLE_GITHUB__COM",
 }

Jets will use the BUNDLE_GITHUB__COM so that the bundle install can fetch the private repos.

SSM Parameter Cheatsheet

To create an SSM parameter with the AWS CLI

aws ssm put-parameter –name /dev/BUNDLE_GITHUB__COM –type SecureString –value “abc123”

Commands to get the parameter for confirmation.

aws ssm describe-parameters jq ‘.Parameters[].Name’ grep BUNDLE_GITHUB__COM
aws ssm get-parameters –names /dev/BUNDLE_GITHUB__COM jq ‘.Parameters[].Value’  

More Examples

SideKiq Pro and Gem Fury also require private gem repo access. Here’s an example with them also.

config/jets/bootstrap.rb

Jets.bootstrap.configure do
 config.codebuild.project.env.vars = {
 BUNDLE_GITHUB__COM: "SSM:/#{ssm_env}/BUNDLE_GITHUB__COM",
 BUNDLE_GEM__FURY__IO: "SSM:/#{ssm_env}/GEM_FURY_IO_TOKEN",
 BUNDLE_GEMS__CONTRIBSYS__COM: "SSM:/#{ssm_env}/GEMS_CONTRIBSYS_COM_TOKEN",
 }

Security Note

Your Gemfile should not use ENV to substitute the token in the Gemfile.

Example of a bad Gemfile.

source "https://#{ENV['TOKEN']}:@gems.contribsys.com/"" do
 gem 'sidekiq-pro'
end

Example of a good Gemfile.

source 'https://gems.contribsys.com/' do
 gem 'sidekiq-pro'
end

The bad Gemfile will save the secret token to Gemfile.lock. It’s recommended to use the BUNDLE_GITHUB__COM env var to avoid this and accidentally commit secrets to your git repo. See: GitHub Issue: Bundler should NOT include private credentials in Gemfile.lock from source urls in Gemfile