aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2019-01-09 14:24:44 +0000
committerNat Lasseter <Nat Lasseter nathan@bytemark.co.uk>2019-01-09 14:24:44 +0000
commitcf3d1823bfa1aa91b36385b07617486b634e46cc (patch)
tree6ee5cf1efa01521a41f4adc101f337966deb5286
Initial commit
-rw-r--r--.gitignore1
-rw-r--r--Readme41
-rwxr-xr-xdrum183
-rw-r--r--test/.drumkit6
-rwxr-xr-xtest/test.rb9
5 files changed, 240 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1377554
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.swp
diff --git a/Readme b/Readme
new file mode 100644
index 0000000..b2aa905
--- /dev/null
+++ b/Readme
@@ -0,0 +1,41 @@
+h1. DRuM: The Docker Ruby Manager
+
+p. This is a TERRIBLE alternative to RVM, that uses docker, because why not.
+
+h2. Use
+
+bc.. cd test
+drum bass
+drum stick sinatra
+drum kick
+drum snare
+drum roll -- -p4567:4567
+
+h2. Bass Drums
+
+p. Just a ruby image of some form. By default, ruby:alpine.
+
+bc.. drum bass
+drum bass slim
+drum bass jruby:
+drum bass ruby:2.6
+
+h2. Kick Drums, and Drum Sticks
+
+p. Drum Sticks are DRuM's built in gem manager. (I should really just use bundler.) A Kick Drum is a Bass Drum with the Drum Sticks installed.
+
+bc.. drum stick sinatra
+drum kick
+
+h2. Snare Drums
+
+p. A Snare Drum is a Kick Drum with your application installed.
+
+bc. drum snare
+
+h2. Drum Rolls
+
+p. This runs the container.
+
+bc.. drum roll
+drum roll -- -p 4567:4567
diff --git a/drum b/drum
new file mode 100755
index 0000000..662387b
--- /dev/null
+++ b/drum
@@ -0,0 +1,183 @@
+#!/usr/bin/env ruby
+
+require 'optparse'
+require 'ostruct'
+require 'tempfile'
+
+OPTIONS = OpenStruct.new({
+ noop: false,
+ verbose: false,
+ drumkit: ".drumkit"
+})
+
+class Drumkit
+ def self.parse_file(filename)
+ Drumkit.parse(File.read(filename))
+ end
+
+ def self.parse(input)
+ input = input.lines if input.is_a?(String)
+ input = input.map(&:strip).reject(&:empty?)
+ drumkit = Drumkit.new(input)
+ end
+
+ def initialize(lines = [])
+ @bassdrum = nil
+ @kickdrum = nil
+ @snaredrum = nil
+ @drumsticks = []
+
+ lines.each do |line|
+ case line
+ when /^BASSDRUM/
+ @bassdrum = line[9..-1]
+ when /^KICKDRUM/
+ @kickdrum = line[9..-1]
+ when /^SNAREDRUM/
+ @snaredrum = line[10..-1]
+ when /^DRUMSTICK/
+ @drumsticks << line[10..-1]
+ end
+ end
+ end
+
+ attr_accessor :bassdrum, :kickdrum, :snaredrum, :drumsticks
+
+ def add_stick(stick)
+ @drumsticks.push(stick)
+ end
+
+ def to_s
+ "This file will be modified automatically. Only make changes if you know what you are doing. Otherwise, use drum.\n\n" +
+ (@bassdrum ? "BASSDRUM #{@bassdrum}\n" : "") +
+ (@kickdrum ? "KICKDRUM #{@kickdrum}\n" : "") +
+ (@snaredrum ? "SNAREDRUM #{@snaredrum}\n" : "") +
+ @drumsticks.map{|s| "DRUMSTICK #{s}"}.join("\n")
+ end
+end
+
+def help(parser)
+ puts parser.banner
+ puts parser.summarize
+end
+
+def info(str)
+ puts "INFO: #{str}"
+end
+
+def error(str, rc = nil)
+ $stderr.puts "ERROR: #{str}"
+ exit rc unless rc.nil?
+end
+
+def entrypoint
+ "./#{File.basename(Dir.pwd)}.rb"
+end
+
+parser = OptionParser.new do |opt|
+ opt.banner = "DRuM: The Docker Ruby Manager\n\nUsage: drum [flags] COMMAND"
+
+ opt.on("-n", "--noop", "--dry-run", "Dry run, don't actually *do* anything") do
+ OPTIONS.noop = true
+ OPTIONS.verbose = true
+ end
+ opt.on("-v", "--verbose", "Explain what's happening") do
+ OPTIONS.verbose = true
+ end
+ opt.on("-d", "--drumkit", :REQUIRED, "Specify drumkit file (default: .drumkit)") do |dk|
+ OPTIONS.drumkit = dk
+ end
+ opt.on("-h", "--help", "Print usage") do
+ help opt
+ exit 0
+ end
+end
+
+parser.parse!
+
+COMMAND = ARGV.shift&.downcase
+
+if File.exists?(OPTIONS.drumkit)
+ DRUMKIT = Drumkit.parse_file(OPTIONS.drumkit)
+else
+ DRUMKIT = Drumkit.new
+end
+
+case COMMAND
+ when nil
+ error "Error: No command given\n\n"
+ help parser
+ exit 1
+ when "bass"
+ if !ARGV[0].nil?
+ bd = ARGV[0].strip
+ case bd
+ when /\A[^:]+\Z/
+ bassdrum = "ruby:#{bd}"
+ when /:\Z/
+ bassdrum = bd[0..-2]
+ when /\w:\w/
+ bassdrum = bd
+ else
+ error("Invalid Bass Drum specification: #{bd}", 1)
+ end
+ else
+ if DRUMKIT.bassdrum.nil?
+ bassdrum = "ruby:alpine"
+ else
+ bassdrum = DRUMKIT.bassdrum
+ end
+ end
+ info "Fetching Bass Drum: #{bassdrum}" if OPTIONS.verbose
+ system "docker pull #{bassdrum}" unless OPTIONS.noop
+ DRUMKIT.bassdrum = bassdrum unless OPTIONS.noop
+ when "kick"
+ error("No Bass Drum specified.", 1) if DRUMKIT.bassdrum.nil?
+ if !ARGV[0].nil?
+ kickdrum = ARGV[0].strip
+ else
+ if DRUMKIT.kickdrum.nil?
+ kickdrum = "drum-bass-#{DRUMKIT.bassdrum.gsub(/:/,"_")}-kick-#{File.basename(Dir.pwd)}"
+ else
+ kickdrum = DRUMKIT.kickdrum
+ end
+ end
+ puts "Building Kick Drum: #{kickdrum}" if OPTIONS.verbose
+ Tempfile.open("drum-tmp-dockerfile", Dir.pwd) do |f|
+ f.puts "FROM #{DRUMKIT.bassdrum}"
+ f.puts "RUN gem install --no-document #{DRUMKIT.drumsticks.join(" ")}"
+ f.flush
+ system "docker build -t #{kickdrum} -f #{File.basename(f)} ."
+ end unless OPTIONS.noop
+ DRUMKIT.kickdrum = kickdrum unless OPTIONS.noop
+ when "snare"
+ error("No Kick Drum specified.", 1) if DRUMKIT.kickdrum.nil?
+ if !ARGV[0].nil?
+ snaredrum = ARGV[0].strip
+ else
+ if DRUMKIT.snaredrum.nil?
+ snaredrum = "#{DRUMKIT.kickdrum}-snare-#{entrypoint.gsub(/[\/.]/, "_")}"
+ else
+ snaredrum = DRUMKIT.snaredrum
+ end
+ end
+ puts "Creating Snare Drum: #{snaredrum}" if OPTIONS.verbose
+ Tempfile.open("drum-tmp-dockerfile", Dir.pwd) do |f|
+ f.puts "FROM #{DRUMKIT.kickdrum}"
+ f.puts "COPY . ."
+ f.puts "ENTRYPOINT [\"#{entrypoint}\"]"
+ f.flush
+ system "docker build -t #{snaredrum} -f #{File.basename(f)} ."
+ end unless OPTIONS.noop
+ DRUMKIT.snaredrum = snaredrum unless OPTIONS.noop
+ when "stick"
+ error("Specify drumstick", 1) if ARGV[0].nil?
+ drumstick = ARGV[0].strip
+ info "Adding Drumstick: #{drumstick}" if OPTIONS.verbose
+ DRUMKIT.add_stick(drumstick) unless OPTIONS.noop
+ when "roll"
+ error("No Snare Drum specified.", 1) if DRUMKIT.snaredrum.nil?
+ system "docker run #{ARGV.join(" ")} #{DRUMKIT.snaredrum}"
+end
+
+File.open(OPTIONS.drumkit, "w").puts(DRUMKIT.to_s)
diff --git a/test/.drumkit b/test/.drumkit
new file mode 100644
index 0000000..6b6b833
--- /dev/null
+++ b/test/.drumkit
@@ -0,0 +1,6 @@
+This file will be modified automatically. Only make changes if you know what you are doing. Otherwise, use drum.
+
+BASSDRUM ruby:alpine
+KICKDRUM drum-bass-ruby_alpine-kick-test
+SNAREDRUM drum-bass-ruby_alpine-kick-test-snare-test_rb
+DRUMSTICK sinatra
diff --git a/test/test.rb b/test/test.rb
new file mode 100755
index 0000000..3df8653
--- /dev/null
+++ b/test/test.rb
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+
+require 'sinatra'
+
+set :bind, '0.0.0.0'
+
+get '/' do
+ 'Put this in your pipe & smoke it!'
+end