slugbuilder 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +15 -5
- data/lib/slugbuilder/builder.rb +45 -10
- data/lib/slugbuilder/configuration.rb +2 -1
- data/lib/slugbuilder/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc40a6d4591cdf1c3d38112e9d1bc4bde1012687
|
4
|
+
data.tar.gz: '0102491f9b95b694905db3e7876d588a2e067f62'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f64bcd5db7366dadd1f09d63a2a61a441ace5de3020a3827d5b60a0e39ce09e577eb6c600db871434038c21de73901794dde097b34b2185eac601719bf723659
|
7
|
+
data.tar.gz: f41a21fd11a8196aa2b2fd46f6f2197a7641ba11e6afb18092c5902a691d78b8054d2b721a86814604cc14015e85d6884a3b79a762b5410c5b6932f8ee316d34
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2.0.0 (2017-5-3)
|
4
|
+
|
5
|
+
Changed:
|
6
|
+
|
7
|
+
- Prebuild and postbuild hooks now take `git_url` as a keyword argument
|
8
|
+
|
9
|
+
Added:
|
10
|
+
|
11
|
+
- The `protocol` configuration option allows specifying the protocol to use when downloading git repositories
|
12
|
+
- Buildpack and repository urls now accept more formats (`<organization>/<repository_name>`, `git@<git_service>:<organization>/<repository_name>.git`, and `https://<git_service>/<organization>/<repository_name>.git`
|
13
|
+
|
3
14
|
## 1.3.0 (2017-3-7)
|
4
15
|
|
5
16
|
Added:
|
data/README.md
CHANGED
@@ -61,11 +61,11 @@ sb.build(clear_cache: true)
|
|
61
61
|
# using a Proc or Proc-like object (responds to `call` method)
|
62
62
|
sb = Slugbuilder::Builder.new(repo: 'heroku/node-js-sample', git_ref: 'master')
|
63
63
|
class PostBuildInterface
|
64
|
-
def self.call(repo:, git_ref:, stats:, slug:)
|
64
|
+
def self.call(repo:, git_ref:, git_url:, stats:, slug:)
|
65
65
|
# postbuild logic
|
66
66
|
end
|
67
67
|
end
|
68
|
-
sb.build(prebuild: ->(repo: repo, git_ref: git_ref) { p "prebuild logic" }, postbuild: PostBuildInterface)
|
68
|
+
sb.build(prebuild: ->(repo: repo, git_ref: git_ref, git_url: git_url) { p "prebuild logic" }, postbuild: PostBuildInterface)
|
69
69
|
|
70
70
|
# prebuild/postbuild with optional blocks
|
71
71
|
sb = Slugbuilder::Builder.new(repo: 'heroku/node-js-sample', git_ref: 'master') do |args|
|
@@ -84,12 +84,13 @@ You can optionally define a `pre-compile` or `post-compile` script in your appli
|
|
84
84
|
|
85
85
|
### Builder#initialize(repo:, git_ref:, &block)
|
86
86
|
|
87
|
-
- `repo` String (required): the github repo in the form `<organization>/<
|
87
|
+
- `repo` String (required): the github repo in the form `<organization>/<repository_name>`, `https://<git_service>/<organization>/<repository_name>.git`, or `git@<git_service>:<organization>/<repository_name>.git`
|
88
88
|
- `git_ref` String (required): the SHA or branch to build
|
89
89
|
- `stdout` IO (optional): the IO stream to write build output to. This defaults to `$stdout`
|
90
90
|
- `block` Block (optional): an optional block that runs pre-build. It receives a Hash with the structure:
|
91
|
-
- `repo` String: The git repo identifier
|
91
|
+
- `repo` String: The git repo identifier in the form `<organization>/<repository_name>`
|
92
92
|
- `git_ref` String: The git branchname or SHA
|
93
|
+
- `git_url` String: The git URL (this will be in the form specified by the `Slugbuilder.config.protocol`)
|
93
94
|
|
94
95
|
Alternatively, a Proc can be passed to `build` method's keyword argument `prebuild` to achieve the same effect.
|
95
96
|
|
@@ -104,11 +105,13 @@ Alternatively, a Proc can be passed to `build` method's keyword argument `prebui
|
|
104
105
|
- `prebuild` Proc (optional): an optional Proc (or anything that conforms to the `call` API of a Proc) that will be run before the build. The Proc will receive a Hash with the structure:
|
105
106
|
- `repo` String: The git repo identifier
|
106
107
|
- `git_ref` String: The git branchname or SHA
|
108
|
+
- `git_url` String: The git URL (this will be in the form specified by the `Slugbuilder.config.protocol`)
|
107
109
|
Alternatively, a block can be passed to the `initialize` method to the same effect.
|
108
110
|
- `postbuild` Proc (optional): an optional Proc (or anything that conforms to the `call` API of a Proc) that will run post-build. The Proc will receive a Hash with the structure:
|
109
111
|
- `slug` String: Location of the built slug file
|
110
112
|
- `repo` String: The git repo identifier
|
111
113
|
- `git_ref` String: The git branchname or SHA
|
114
|
+
- `git_url` String: The git URL (this will be in the form specified by the `Slugbuilder.config.protocol`)
|
112
115
|
- `git_sha` String: The git SHA (even if the git ref was a branch name)
|
113
116
|
- `request_id` String: The unique id of the build request
|
114
117
|
- `stats` Hash:
|
@@ -143,8 +146,9 @@ Slugbuilder.config.output_dir = './slugs'
|
|
143
146
|
@cache_dir = '/tmp/slugbuilder-cache'
|
144
147
|
@output_dir = './slugs'
|
145
148
|
@git_service = 'github.com'
|
149
|
+
@protocol = 'https'
|
146
150
|
@buildpacks = [
|
147
|
-
'
|
151
|
+
'git@github.com:heroku/heroku-buildpack-nodejs.git',
|
148
152
|
'https://github.com/heroku/heroku-buildpack-ruby.git#37ed188'
|
149
153
|
]
|
150
154
|
```
|
@@ -173,6 +177,12 @@ This is where the git repositories live (github.com, gitlab.com, bitbucket.org,
|
|
173
177
|
|
174
178
|
> Defaults to `github.com`
|
175
179
|
|
180
|
+
**protocol**
|
181
|
+
|
182
|
+
The protocol that should be used to pull down git repositories (including buildbpacks). This can be either `https` or `ssh`
|
183
|
+
|
184
|
+
> Defaults to `https` (also uses `https` if `protocol` is not valid)
|
185
|
+
|
176
186
|
**buildpacks**
|
177
187
|
|
178
188
|
Buildpacks is an array of valid git clone-able [buildpack](https://devcenter.heroku.com/articles/buildpacks) URLs.
|
data/lib/slugbuilder/builder.rb
CHANGED
@@ -12,15 +12,17 @@ module Slugbuilder
|
|
12
12
|
@output_dir = Slugbuilder.config.output_dir
|
13
13
|
@buildpacks_dir = File.join(@cache_dir, 'buildpacks')
|
14
14
|
@env_dir = File.join(@base_dir, 'environment')
|
15
|
-
|
15
|
+
repo_matches = parse_git_url(repo)
|
16
|
+
@repo = "#{repo_matches[:org]}/#{repo_matches[:name]}"
|
17
|
+
@git_url = normalize_git_url(repo)
|
16
18
|
@git_ref = git_ref
|
17
|
-
@git_dir = Shellwords.escape(File.join(@base_dir, 'git', repo))
|
18
|
-
@build_dir = Shellwords.escape(File.join(@base_dir, repo, git_ref))
|
19
|
+
@git_dir = Shellwords.escape(File.join(@base_dir, 'git', @repo))
|
20
|
+
@build_dir = Shellwords.escape(File.join(@base_dir, @repo, git_ref))
|
19
21
|
|
20
22
|
setup
|
21
23
|
|
22
24
|
if block_given?
|
23
|
-
yield(repo: repo, git_ref: git_ref)
|
25
|
+
yield(repo: @repo, git_ref: git_ref, git_url: @git_url)
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -35,7 +37,7 @@ module Slugbuilder
|
|
35
37
|
@slug_file = slug_name ? "#{slug_name}.tgz" : Shellwords.escape("#{@repo.gsub('/', '.')}.#{@git_ref}.#{@git_sha}.tgz")
|
36
38
|
wipe_cache if clear_cache
|
37
39
|
|
38
|
-
prebuild.call(repo: @repo, git_ref: @git_ref) if prebuild
|
40
|
+
prebuild.call(repo: @repo, git_ref: @git_ref, git_url: @git_url) if prebuild
|
39
41
|
|
40
42
|
with_clean_env do
|
41
43
|
build_and_release
|
@@ -53,9 +55,9 @@ module Slugbuilder
|
|
53
55
|
output: build_output.join('')
|
54
56
|
}
|
55
57
|
|
56
|
-
postbuild.call(repo: @repo, git_ref: @git_ref, git_sha: @git_sha, request_id: @request_id, stats: stats, slug: File.join(@output_dir, @slug_file)) if postbuild
|
58
|
+
postbuild.call(repo: @repo, git_ref: @git_ref, git_sha: @git_sha, git_url: @git_url, request_id: @request_id, stats: stats, slug: File.join(@output_dir, @slug_file)) if postbuild
|
57
59
|
if block_given?
|
58
|
-
yield(repo: @repo, git_ref: @git_ref, git_sha: @git_sha, request_id: @request_id, stats: stats, slug: File.join(@output_dir, @slug_file))
|
60
|
+
yield(repo: @repo, git_ref: @git_ref, git_sha: @git_sha, git_url: @git_url, request_id: @request_id, stats: stats, slug: File.join(@output_dir, @slug_file))
|
59
61
|
end
|
60
62
|
return true
|
61
63
|
rescue => e
|
@@ -154,7 +156,7 @@ module Slugbuilder
|
|
154
156
|
|
155
157
|
def download_repo
|
156
158
|
stitle("Fetching #{@repo}")
|
157
|
-
rc = run("git clone --quiet
|
159
|
+
rc = run("git clone --quiet #{@git_url} #{@git_dir}")
|
158
160
|
fail "Failed to download repo: #{@repo}" if rc != 0
|
159
161
|
end
|
160
162
|
|
@@ -165,7 +167,8 @@ module Slugbuilder
|
|
165
167
|
end
|
166
168
|
|
167
169
|
def get_buildpack_name(url)
|
168
|
-
url
|
170
|
+
matches = parse_git_url(url)
|
171
|
+
"#{matches[:org]}__#{matches[:name]}#{matches[:hash]}"
|
169
172
|
end
|
170
173
|
|
171
174
|
def fetch_buildpacks
|
@@ -174,11 +177,12 @@ module Slugbuilder
|
|
174
177
|
|
175
178
|
existing_buildpacks = Dir.entries(@buildpacks_dir)
|
176
179
|
@buildpacks.each do |buildpack_url|
|
180
|
+
buildpack_matches = parse_git_url(buildpack_url)
|
177
181
|
buildpack_name = get_buildpack_name(buildpack_url)
|
178
182
|
if !existing_buildpacks.include?(buildpack_name)
|
179
183
|
# download buildpack
|
180
184
|
stitle("Fetching buildpack: #{buildpack_name}")
|
181
|
-
rc = run("git clone --quiet
|
185
|
+
rc = run("git clone --quiet #{normalize_git_url(buildpack_url)} #{@buildpacks_dir}/#{buildpack_name}")
|
182
186
|
fail "Failed to download buildpack: #{buildpack_name}" if rc != 0
|
183
187
|
else
|
184
188
|
# fetch latest
|
@@ -188,6 +192,14 @@ module Slugbuilder
|
|
188
192
|
fail "Failed to update: #{buildpack_name}" if rc != 0
|
189
193
|
end
|
190
194
|
end
|
195
|
+
|
196
|
+
# checkout hash
|
197
|
+
if buildpack_matches[:hash]
|
198
|
+
Dir.chdir("#{@buildpacks_dir}/#{buildpack_name}") do
|
199
|
+
rc = run("git fetch --quiet --all && git checkout --quiet #{buildpack_matches[:hash]}")
|
200
|
+
fail "Failed to fetch and checkout: #{buildpack_matches[:hash]}" if rc != 0
|
201
|
+
end
|
202
|
+
end
|
191
203
|
end
|
192
204
|
|
193
205
|
@buildpacks
|
@@ -251,6 +263,29 @@ module Slugbuilder
|
|
251
263
|
stitle("Slug size is #{@slug_size} Megabytes.")
|
252
264
|
end
|
253
265
|
|
266
|
+
def parse_git_url(url)
|
267
|
+
regex = %r{
|
268
|
+
^
|
269
|
+
.*?
|
270
|
+
(?:(?<host>[^\/@]+)(\/|:))?
|
271
|
+
(?<org>[^\/:]+)
|
272
|
+
\/
|
273
|
+
(?<name>[^\/#\.]+)
|
274
|
+
(?:\.git(?:\#(?<hash>.+))?)?
|
275
|
+
$
|
276
|
+
}x
|
277
|
+
url.match(regex)
|
278
|
+
end
|
279
|
+
|
280
|
+
def normalize_git_url(url)
|
281
|
+
matches = parse_git_url(url)
|
282
|
+
if Slugbuilder.config.protocol == 'ssh'
|
283
|
+
"git@#{matches[:host] || Slugbuilder.config.git_service}:#{matches[:org]}/#{matches[:name]}.git"
|
284
|
+
else
|
285
|
+
"https://#{matches[:host] || Slugbuilder.config.git_service}/#{matches[:org]}/#{matches[:name]}.git"
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
254
289
|
def print_workers
|
255
290
|
workers = {}
|
256
291
|
if File.exists?("#{@build_dir}/Procfile")
|
@@ -17,13 +17,14 @@ module Slugbuilder
|
|
17
17
|
|
18
18
|
class Configuration
|
19
19
|
attr_accessor :base_dir, :cache_dir, :output_dir,
|
20
|
-
:git_service, :buildpacks
|
20
|
+
:git_service, :buildpacks, :protocol
|
21
21
|
|
22
22
|
def initialize
|
23
23
|
@base_dir = '/tmp/slugbuilder'
|
24
24
|
@cache_dir = '/tmp/slugbuilder-cache'
|
25
25
|
@output_dir = '.'
|
26
26
|
@git_service = 'github.com'
|
27
|
+
@protocol = 'https'
|
27
28
|
@buildpacks = []
|
28
29
|
end
|
29
30
|
end
|
data/lib/slugbuilder/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slugbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Panoply Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03
|
11
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|