Skip to content
This repository has been archived by the owner on Oct 15, 2024. It is now read-only.

Commit

Permalink
Merge pull request #35 from heroku/heroku-ci
Browse files Browse the repository at this point in the history
Heroku CI Support
  • Loading branch information
hone authored May 25, 2017
2 parents b80f93c + fc65cac commit 38845a5
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 19 deletions.
5 changes: 5 additions & 0 deletions bin/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash

BP_DIR=$(cd $(dirname ${0:-}); cd ..; pwd)

$BP_DIR/vendor/buildpack test $1 $2
5 changes: 5 additions & 0 deletions bin/test-compile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash

BP_DIR=$(cd $(dirname ${0:-}); cd ..; pwd)

$BP_DIR/vendor/buildpack test-compile $1 $2 $3
65 changes: 48 additions & 17 deletions buildpack/mrblib/buildpack/buildpack_runner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,28 +17,40 @@ def run(build_dir, cache_dir, env_dir, exports = [])
release = {}
export = nil

mktmpdir("buildpack") do |dir|
Dir.chdir(dir) do
filename = "#{@name.split("/").last}.tgz"
@output_io.topic "Fetching buildpack #{@name}"
@fetcher.fetch("#{@name}.tgz", filename)
@fetcher.unpack(filename)

output, status = system("bin/detect #{build_dir}")
@output_io.topic "#{output.chomp} detected"
on_error(status, "Could not detect a #{@name} compatible app")
status = pipe("#{source_exports(exports)} bin/compile #{build_dir} #{cache_dir} #{env_dir}")
on_error(status, "Failed trying to compile #{@name}")
output, status = system("#{source_exports(exports)} bin/release #{build_dir}")
on_error(status, "bin/release failed")
release = YAML.load(output)
export = File.read("export") if File.exist?("export")
end
fetch_buildpack do
output, status = system("bin/detect #{build_dir}")
@output_io.topic "#{output.chomp} detected"
on_error(status, "Could not detect a #{@name} compatible app")
status = pipe("#{source_exports(exports)} bin/compile #{build_dir} #{cache_dir} #{env_dir}")
on_error(status, "Failed trying to compile #{@name}")
output, status = system("#{source_exports(exports)} bin/release #{build_dir}")
on_error(status, "bin/release failed")
release = YAML.load(output)
export = File.read("export") if File.exist?("export")
end

[release, export]
end

def test_compile(build_dir, cache_dir, env_dir, exports = [])
export = nil

fetch_buildpack do
status = pipe("#{source_exports(exports)} bin/test-compile #{build_dir} #{cache_dir} #{env_dir}")
on_error(status, "Failed trying test-compile #{@name}")

export = File.read("export") if File.exist?("export")
end

export
end

def test(build_dir, env_dir)
fetch_buildpack do
pipe_exit_on_error("bin/test #{build_dir} #{env_dir}", @output_io, nil)
end
end

private
def on_error(status, message)
if !status.success?
Expand All @@ -54,5 +66,24 @@ def source_exports(exports)
""
end
end

def fetch_buildpack
@output_io.topic "Fetching buildpack #{@name}"
filename = "#{@name.split("/").last}.tgz"

if block_given?
mktmpdir("buildpack") do |dir|
Dir.chdir(dir) do
@fetcher.fetch("#{@name}.tgz", filename)
@fetcher.unpack(filename)

yield
end
end
else
@fetcher.fetch("#{@name}.tgz", filename)
@fetcher.unpack(filename)
end
end
end
end
6 changes: 6 additions & 0 deletions buildpack/mrblib/buildpack/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ class CLI
buildpack detect <build-dir>
buildpack compile <build-dir> <cache-dir> <env-dir>
buildpack release <build-dir>
buildpack test-compile <build-dir> <cache-dir> <env-dir>
buildpack test <build-dir> <env-dir>
buildpack (-v | --version)
buildpack (-h | --help)
USAGE
Expand All @@ -33,6 +35,10 @@ def run
Compile.new(@output_io, @error_io, @options["<build-dir>"], @options["<cache-dir>"], @options["<env-dir>"]).run
elsif Release.detect(@options)
Release.new(@output_io, @error_io, @options["<build-dir>"]).run
elsif TestCompile.detect(@options)
TestCompile.new(@output_io, @error_io, @options["<build-dir>"], @options["<cache-dir>"], @options["<env-dir>"]).run
elsif Test.detect(@options)
Test.new(@output_io, @error_io, @options["<build-dir>"], @options["<env-dir>"]).run
else
Help.new(@output_io, @error_io).run
end
Expand Down
22 changes: 22 additions & 0 deletions buildpack/mrblib/buildpack/commands/test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Buildpack::Shell; end

module Buildpack::Commands
class Test
include Shell

def self.detect(options)
options["test"]
end

def initialize(output_io, error_io, build_dir, env_dir)
@output_io = output_io
@error_io = error_io
@build_dir = build_dir
@env_dir = env_dir
end

def run
BuildpackRunner.new(@output_io, @error_io, "heroku/nodejs-v98").test(@build_dir, @env_dir)
end
end
end
35 changes: 35 additions & 0 deletions buildpack/mrblib/buildpack/commands/test_compile.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module Buildpack::Shell; end

module Buildpack::Commands
class TestCompile
include Shell

def self.detect(options)
options["test-compile"]
end

def initialize(output_io, error_io, build_dir, cache_dir, env_dir)
@output_io = output_io
@error_io = error_io
@build_dir = build_dir
@cache_dir = cache_dir
@env_dir = env_dir
end

def run
buildpacks = %w(heroku/nodejs-v98 heroku/ember-cli-deploy)
mktmpdir("exports") do |dir|
buildpacks.inject([]) do |exports, name|
export = BuildpackRunner.new(@output_io, @error_io, name).test_compile(@build_dir, @cache_dir, @env_dir, exports)
export_file = "#{dir}/#{name.split("/").last}"

File.open(export_file, "w") do |file|
file.puts export
end

exports + [export_file]
end
end
end
end
end
14 changes: 12 additions & 2 deletions buildpack/mrblib/buildpack/shell.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,26 @@ def system(command)
[output, $?]
end

def pipe(command)
def pipe(command, output_io = @output_io)
IO.popen(command) do |io|
while data = io.read(1)
@output_io.print data
output_io.print data
end
end

$?
end

def pipe_exit_on_error(command, output_io = @output_io, error_io = @error_io)
status = pipe(command, output_io)
if status.success?
status
else
error_io.puts "Error running: #{command}" if error_io
exit 1
end
end

def command_success?(command)
_, status = system(command)
status.success?
Expand Down

0 comments on commit 38845a5

Please sign in to comment.