samus 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|