samus 1.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 +7 -0
- data/LICENSE +22 -0
- data/README.md +255 -0
- data/bin/samus +87 -0
- data/commands/build/archive-git-full +3 -0
- data/commands/build/archive-git-full.help.md +7 -0
- data/commands/build/archive-tgz +3 -0
- data/commands/build/archive-tgz.help.md +7 -0
- data/commands/build/archive-zip +3 -0
- data/commands/build/archive-zip.help.md +7 -0
- data/commands/build/fs-copy +3 -0
- data/commands/build/fs-copy.help.md +8 -0
- data/commands/build/fs-mkdir +3 -0
- data/commands/build/fs-mkdir.help.md +7 -0
- data/commands/build/fs-rmrf +3 -0
- data/commands/build/fs-rmrf.help.md +7 -0
- data/commands/build/fs-sedfiles +7 -0
- data/commands/build/fs-sedfiles.help.md +8 -0
- data/commands/build/gem-build +5 -0
- data/commands/build/gem-build.help.md +7 -0
- data/commands/build/git-archive +3 -0
- data/commands/build/git-archive.help.md +8 -0
- data/commands/build/git-commit +7 -0
- data/commands/build/git-commit.help.md +8 -0
- data/commands/build/git-merge +9 -0
- data/commands/build/git-merge.help.md +8 -0
- data/commands/build/npm-test +3 -0
- data/commands/build/npm-test.help.md +7 -0
- data/commands/build/rake-task +3 -0
- data/commands/build/rake-task.help.md +7 -0
- data/commands/publish/cf-invalidate +16 -0
- data/commands/publish/cf-invalidate.help.md +8 -0
- data/commands/publish/gem-push +6 -0
- data/commands/publish/gem-push.help.md +7 -0
- data/commands/publish/git-push +15 -0
- data/commands/publish/git-push.help.md +8 -0
- data/commands/publish/npm-publish +3 -0
- data/commands/publish/npm-publish.help.md +7 -0
- data/commands/publish/s3-put +13 -0
- data/commands/publish/s3-put.help.md +10 -0
- data/lib/samus.rb +37 -0
- data/lib/samus/action.rb +60 -0
- data/lib/samus/build_action.rb +46 -0
- data/lib/samus/builder.rb +101 -0
- data/lib/samus/command.rb +99 -0
- data/lib/samus/credentials.rb +48 -0
- data/lib/samus/publish_action.rb +7 -0
- data/lib/samus/publisher.rb +38 -0
- data/lib/samus/version.rb +3 -0
- data/samus.gemspec +13 -0
- data/samus.json +44 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 500fa4456778f282bf501ea9d1731a5199f0a2bd
|
4
|
+
data.tar.gz: 1bfac1ac68d3be949d286dacdec5ef710609c2a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bb354e91c9058f483c8a339ffc9b0f331b152e92a548dd6516c86bd2a56e3caa308dcbad3d287f5cd4ffa2ebb423c438ee48929e8660ab60afb2174810532be2
|
7
|
+
data.tar.gz: 21d5e9b38e12c614416c75eff044a8c94b49900f913a3e1e2635d6f86c6dcf6f50dd34ca6a3602700e2897a0c8373d967857e78f09048720dccc2118570d4617
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Loren Segal
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,255 @@
|
|
1
|
+
# Samus
|
2
|
+
|
3
|
+
Samus helps you automate the release of Open Source Software. Samus works
|
4
|
+
through a manifest file to describe discrete steps that you typically perform
|
5
|
+
when packaging and publishing code.
|
6
|
+
|
7
|
+
Samus comes with a set of built-in commands that let you prepare your
|
8
|
+
repository, push your changes, package your library, and upload it to various
|
9
|
+
locations / package managers. Samus is also open-source, so you can contribute
|
10
|
+
new commands if you think they are useful to others. Finally, Samus allows you
|
11
|
+
to install and share custom commands and credentials for building and publishing
|
12
|
+
your code. That's right, Samus has a mechanism to share publishing credentials
|
13
|
+
in a fairly secure way, so you can reliably publish releases from almost any
|
14
|
+
machine.
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
Samus is driven by a manifest file that describes the steps to perform when
|
19
|
+
building or publishing a release. You can just use Samus to publish, or you
|
20
|
+
can use it for both, it's your choice.
|
21
|
+
|
22
|
+
### Publishing
|
23
|
+
|
24
|
+
If you can handle building all of your assets on your own, you can use Samus
|
25
|
+
just to publish your code. Create a manifest file called manifest.json and
|
26
|
+
put it in a directory with all of your assets. The manifest file is just a
|
27
|
+
list of discrete actions like so (minus comments):
|
28
|
+
|
29
|
+
```js
|
30
|
+
{
|
31
|
+
"actions": [
|
32
|
+
{
|
33
|
+
"files": "git.tgz", // this is an archive of your git repository
|
34
|
+
"action": "git-push",
|
35
|
+
"arguments": {
|
36
|
+
"remotes": "origin",
|
37
|
+
"refs": "master v1.5.0" // the v1.5.0 is a tag for your release
|
38
|
+
}
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"action": "gem-push",
|
42
|
+
"files": ["my-built-gemfile.gem"],
|
43
|
+
"credentials": "my-credentials-key"
|
44
|
+
}
|
45
|
+
]
|
46
|
+
}
|
47
|
+
```
|
48
|
+
|
49
|
+
Note: The credentials section defines a flat file or executable Samus looks
|
50
|
+
at to get your key for authentication. See the "Custom Commands & Credentials"
|
51
|
+
section below for how to point to this file.
|
52
|
+
|
53
|
+
Now just run `samus publish .`, and Samus will run these commands in order,
|
54
|
+
pushing your Git repository and your RubyGem to the world.
|
55
|
+
|
56
|
+
### Building
|
57
|
+
|
58
|
+
In most cases you will want some help staging a release; Samus can help with
|
59
|
+
that too. Just in the same way you created a manifest for publishing, you
|
60
|
+
create a manifest file for building your release. The only difference is now
|
61
|
+
you include build-time actions, in addition to your publish actions.
|
62
|
+
|
63
|
+
Here is an example that updates your version.rb file, commits and tags the
|
64
|
+
release, and zips up your repository and RubyGem for publishing. Call
|
65
|
+
it "samus.json" for easier integration:
|
66
|
+
|
67
|
+
```js
|
68
|
+
// samus.json:
|
69
|
+
{
|
70
|
+
"actions": [
|
71
|
+
{
|
72
|
+
"action": "fs-sedfiles",
|
73
|
+
"files": ["lib/my-gem/version.rb"],
|
74
|
+
"arguments": {
|
75
|
+
"search": "VERSION = ['\"](.+?)['\"]",
|
76
|
+
"replace": "VERSION = '$version'"
|
77
|
+
}
|
78
|
+
},
|
79
|
+
{
|
80
|
+
"action": "git-commit",
|
81
|
+
"files": ["lib/my-gem/version.rb"]
|
82
|
+
},
|
83
|
+
{
|
84
|
+
"action": "git-merge", // merge new commit into master branch
|
85
|
+
"arguments": {
|
86
|
+
"branch": "master"
|
87
|
+
}
|
88
|
+
},
|
89
|
+
{
|
90
|
+
"action": "archive-git-full",
|
91
|
+
"files": ["git.tgz"],
|
92
|
+
"publish": [{
|
93
|
+
"action": "git-push",
|
94
|
+
"arguments": {
|
95
|
+
"remotes": "origin",
|
96
|
+
"refs": "master v$version"
|
97
|
+
}
|
98
|
+
}]
|
99
|
+
},
|
100
|
+
{
|
101
|
+
"action": "gem-build",
|
102
|
+
"files": ["my-gem.gemspec"],
|
103
|
+
"publish": [
|
104
|
+
{
|
105
|
+
"action": "gem-push",
|
106
|
+
"files": ["my-gem-$version.gem"],
|
107
|
+
"credentials": "my-credentials-key"
|
108
|
+
}
|
109
|
+
]
|
110
|
+
}
|
111
|
+
]
|
112
|
+
}
|
113
|
+
```
|
114
|
+
|
115
|
+
It looks a little longer, but it contains all of the steps to automate when
|
116
|
+
bumping the VERSION constant, tagging a version, merging into the master
|
117
|
+
branch, and building the gem. To build a release with this manifest, simply
|
118
|
+
type:
|
119
|
+
|
120
|
+
```sh
|
121
|
+
$ samus build 1.5.0
|
122
|
+
```
|
123
|
+
|
124
|
+
Samus will look for `samus.json` and build a release for version 1.5.0 of your
|
125
|
+
code. It will produce an archive called `release-v1.5.0.tar.gz` that you
|
126
|
+
can then publish with:
|
127
|
+
|
128
|
+
```sh
|
129
|
+
$ samus publish release-v1.5.0.tar.gz
|
130
|
+
```
|
131
|
+
|
132
|
+
You may have noticed some funny looking "$version" strings in the above
|
133
|
+
manifest. Those strings will be replaced with the version provided in the
|
134
|
+
build command, so all the correct tagging and building will be handled for you.
|
135
|
+
|
136
|
+
You will also notice that the publish commands are part of this manifest.
|
137
|
+
In build mode, Samus handles building of the manifest.json document, grabbing
|
138
|
+
any of the "publish" sections of an action and throwing them in the final
|
139
|
+
manifest.json. As illustrated above, not all actions require a publish section.
|
140
|
+
If you want to inspect the manifest file that Samus created, you can build
|
141
|
+
your release as a directory instead of a zip with `--no-zip`.
|
142
|
+
|
143
|
+
Note: If you didn't name your manifest samus.json you can simply enter the
|
144
|
+
filename in the build command as `samus build VERSION manifest.json`.
|
145
|
+
|
146
|
+
## Built-in Commands
|
147
|
+
|
148
|
+
Samus comes with a number of built-in commands optimized for dealing with
|
149
|
+
the Git workflow. You can use `samus show-cmd` to list all available commands,
|
150
|
+
both for building and publishing a release. Each command has documentation
|
151
|
+
for which files and arguments it accepts.
|
152
|
+
|
153
|
+
```sh
|
154
|
+
$ samus show-cmd
|
155
|
+
... a list of commands ...
|
156
|
+
```
|
157
|
+
|
158
|
+
To view a specific command, make sure to include the stage (`build` or
|
159
|
+
`publish`):
|
160
|
+
|
161
|
+
```sh
|
162
|
+
$ samus show-cmd publish git-push
|
163
|
+
Publish Command: git-push
|
164
|
+
|
165
|
+
Pushes Git repository refs to a set of remotes.
|
166
|
+
|
167
|
+
Files:
|
168
|
+
* The repository archive filename.
|
169
|
+
|
170
|
+
Arguments:
|
171
|
+
* refs: a space delimited set of commits, branches, or tags to push.
|
172
|
+
* remotes: a space delimited set of remotes to push refs to.
|
173
|
+
```
|
174
|
+
|
175
|
+
## Custom Commands & Credentials
|
176
|
+
|
177
|
+
Sometimes you will need to create custom commands that do specific things
|
178
|
+
for your project. If they are generic, you should submit them to this project,
|
179
|
+
but if not, you can install custom commands that only you have access to.
|
180
|
+
This goes for credentials too, which you can install privately on your
|
181
|
+
machine.
|
182
|
+
|
183
|
+
Samus works best when custom packages are Git-backed (preferably private)
|
184
|
+
repositories. In this case, you can simply type `samus install REPO` to
|
185
|
+
download the repository to your machine:
|
186
|
+
|
187
|
+
```sh
|
188
|
+
$ samus install git@github.com:my_org/samus_config
|
189
|
+
```
|
190
|
+
|
191
|
+
Of course, Samus doesn't need these custom packages to be Git-backed. All
|
192
|
+
the above command does is clone a repository into the ~/.samus directory.
|
193
|
+
The above command creates:
|
194
|
+
|
195
|
+
```
|
196
|
+
.samus/
|
197
|
+
`- samus_config/
|
198
|
+
`- commands/
|
199
|
+
`- build/
|
200
|
+
`- my-command
|
201
|
+
`- credentials/
|
202
|
+
`- my-credentials-key
|
203
|
+
```
|
204
|
+
|
205
|
+
### Commands
|
206
|
+
|
207
|
+
Commands in Samus are just shell scripts. Samus passes all argument values
|
208
|
+
(the keys from the "arguments" section of the manifest) in as environment
|
209
|
+
variables with a prefixed underscore. For example, the `rake-task` command
|
210
|
+
is just:
|
211
|
+
|
212
|
+
```sh
|
213
|
+
#!/bin/sh
|
214
|
+
|
215
|
+
rake $_task
|
216
|
+
```
|
217
|
+
|
218
|
+
The `$_task` variable is the "task" argument from the manifest.
|
219
|
+
|
220
|
+
### Credentials
|
221
|
+
|
222
|
+
Custom credentials are just flat files or executables in the `credentials/`
|
223
|
+
directory of your custom package. When you use the "credentials" section in
|
224
|
+
a publish action of the manifest, the value should match the filename of
|
225
|
+
a file in one of your credentials directories. For instance, for the
|
226
|
+
`my-credentials-key` value in our manifest examples, you should have:
|
227
|
+
|
228
|
+
```
|
229
|
+
.samus/samus_config/credentials/my-credentials-key
|
230
|
+
```
|
231
|
+
|
232
|
+
This file is either a flat file with the format:
|
233
|
+
|
234
|
+
```
|
235
|
+
Key: THE_API_KEY
|
236
|
+
Secret: THE_SECRET
|
237
|
+
```
|
238
|
+
|
239
|
+
Or, alternatively, an *executable* which prints the above format to standard
|
240
|
+
out.
|
241
|
+
|
242
|
+
These values are read in by Samus and get exposed as `$__creds_key` and
|
243
|
+
`$__creds_secret` respectively in Samus commands. You can provide other
|
244
|
+
metadata as well, which would be included as `$__creds_name` (for the
|
245
|
+
line "NAME: value").
|
246
|
+
|
247
|
+
## Contributing & TODO
|
248
|
+
|
249
|
+
Please help by contributing commands that Samus can use to build or publish
|
250
|
+
code. Integration with different package managers would be helpful, as well
|
251
|
+
as improving the kinds of build-time tasks that are exposed.
|
252
|
+
|
253
|
+
## Copyright
|
254
|
+
|
255
|
+
Samus was created by Loren Segal in 2014 and is available under MIT license.
|
data/bin/samus
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/samus'
|
4
|
+
require 'optparse'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
command = case ARGV.shift
|
8
|
+
when 'install'
|
9
|
+
Dir.mkdir(Samus::CONFIG_PATH) unless File.directory?(Samus::CONFIG_PATH)
|
10
|
+
Dir.chdir(Samus::CONFIG_PATH) { system "git clone #{ARGV.shift}" }
|
11
|
+
exit
|
12
|
+
when 'update'
|
13
|
+
Samus.config_paths.each do |path|
|
14
|
+
Dir.chdir(path) do
|
15
|
+
if File.directory?('.git')
|
16
|
+
puts "[I] Updating #{path}"
|
17
|
+
system "git pull"
|
18
|
+
else
|
19
|
+
puts "[S] Skipping non-Git directory #{path}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
exit
|
24
|
+
when 'show-cmd'
|
25
|
+
stage = ARGV.shift
|
26
|
+
if stage
|
27
|
+
name = ARGV.shift
|
28
|
+
if name
|
29
|
+
Samus::Command.new(stage, name).show_help
|
30
|
+
else
|
31
|
+
Samus::Command.list_commands(stage)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
Samus::Command.list_commands
|
35
|
+
end
|
36
|
+
exit
|
37
|
+
when 'publish', 'push'; Samus::Publisher
|
38
|
+
when 'build'; Samus::Builder
|
39
|
+
end
|
40
|
+
|
41
|
+
dry_run = false
|
42
|
+
zip_release = true
|
43
|
+
opts = OptionParser.new do |opts|
|
44
|
+
opts.banner = "Usage: samus publish [options] <directory> [directory ...]\n"
|
45
|
+
opts.banner += " samus build [options] <version> [build.json]\n"
|
46
|
+
opts.banner += " samus show-cmd [stage] [name]\n"
|
47
|
+
|
48
|
+
opts.separator ""
|
49
|
+
opts.separator "Options:"
|
50
|
+
opts.on("--dry-run", "Print commands, don't run them") do |v|
|
51
|
+
dry_run = true
|
52
|
+
end
|
53
|
+
if command == Samus::Builder
|
54
|
+
opts.on("--[no-]zip", "Zip release directory") do |zip|
|
55
|
+
zip_release = zip
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
opts.parse!
|
60
|
+
|
61
|
+
if command == Samus::Publisher
|
62
|
+
ARGV.each do |dir|
|
63
|
+
fail "Aborting due to missing path #{dir}" unless File.exist?(dir)
|
64
|
+
end
|
65
|
+
|
66
|
+
ARGV.each do |dir|
|
67
|
+
if File.directory?(dir)
|
68
|
+
command.new(dir).publish(dry_run)
|
69
|
+
elsif File.file?(dir) # it has to be an archive
|
70
|
+
Dir.mktmpdir do |tmpdir|
|
71
|
+
system "tar -xzf #{dir} -C #{tmpdir}"
|
72
|
+
command.new(tmpdir).publish(dry_run)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
elsif command == Samus::Builder
|
77
|
+
$VERSION = ARGV.shift
|
78
|
+
fail "Missing version" if $VERSION.nil?
|
79
|
+
$VERSION = $VERSION.sub(/^v/, '')
|
80
|
+
|
81
|
+
(ARGV.empty? ? ['samus.json'] : ARGV).each do |file|
|
82
|
+
command.new(file).build(dry_run, zip_release)
|
83
|
+
end
|
84
|
+
else
|
85
|
+
puts opts
|
86
|
+
exit 1
|
87
|
+
end
|