frm 0.0.4 → 0.0.5
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.
- data/README.md +73 -0
- data/bin/frm +6 -1
- data/lib/frm.rb +3 -3
- data/lib/frm/deb.rb +15 -12
- data/lib/frm/version.rb +1 -1
- data/test/s3.rb +1 -1
- metadata +5 -4
data/README.md
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Effing Repo Management.
|
2
|
+
|
3
|
+
## Background
|
4
|
+
|
5
|
+
I love using FPM: <http://goo.gl/u3pJB> to create debian packages. It's an
|
6
|
+
awesome tool that takes all of the BS work to package debs and has made my life
|
7
|
+
easier and more productive.
|
8
|
+
|
9
|
+
However, after creating packages, the next pain-point is how to actually
|
10
|
+
publish those packages for internal testing/verification and finally for public
|
11
|
+
consumption. That is, until FRM!
|
12
|
+
|
13
|
+
Previous solutions require you either to host your own repo and use several tools like
|
14
|
+
reprepro along with a webserver, or to be confined to the requirements of a PPA.
|
15
|
+
|
16
|
+
## What is frm?
|
17
|
+
|
18
|
+
FRM is a simple solution for creating cloud-based repos. It is a small ruby
|
19
|
+
library that pushes a specified set of deb packages into an Amazon s3 bucket
|
20
|
+
allong with the required files and format needed to use it directly as a
|
21
|
+
personal or public ubuntu mirror.
|
22
|
+
|
23
|
+
It is designed to be the easiest way possible to host your own debian packages
|
24
|
+
on your own mirror without having to maintain any servers!
|
25
|
+
|
26
|
+
## Why is this good?
|
27
|
+
|
28
|
+
FRM provides some really cool benifits, such as:
|
29
|
+
|
30
|
+
* cloud based (no servers to maintain!)
|
31
|
+
* really easy to use
|
32
|
+
* can easily be backed backed by cloudfront to provide a worldwide geo-dns caching solution
|
33
|
+
* allows you to create unlimited seperate repos allowing for new possible dev/test workflows
|
34
|
+
|
35
|
+
## Install (currently only works on debian based systems)
|
36
|
+
|
37
|
+
Make sure you have a gpg key setup in ~/.gnupg
|
38
|
+
|
39
|
+
You can install frm with gem:
|
40
|
+
|
41
|
+
gem install frm
|
42
|
+
|
43
|
+
Running it:
|
44
|
+
|
45
|
+
frm -a AWS_ACCESS_KEY -s AWS_SECRET_KEY -b my_bucket -p some_path_inside_my_bucket package1 [package2] ...
|
46
|
+
|
47
|
+
## Currently Working:
|
48
|
+
|
49
|
+
* S3 support
|
50
|
+
* signed gpg release file (need to have a key setup in ~/.gnupg)
|
51
|
+
* all necessary configuration for Ubuntu natty
|
52
|
+
|
53
|
+
## Known Issues
|
54
|
+
|
55
|
+
Although FRM is great, it's not perfect. Here are some things that we already know about:
|
56
|
+
|
57
|
+
* can only create new repositories (merging into existing repos comming soon;)
|
58
|
+
* currently only works for natty (soon to be fixed)
|
59
|
+
* currently only works for debian packages (would be pretty easy to add support for rpm /me thinks. holler if u want)
|
60
|
+
* shells out to gpg (could not find a decent ruby solution to create detached signatures. plz holler if u know one!)
|
61
|
+
* shells out to 'dpkg' (may be fine)
|
62
|
+
* only works with Amazon S3 (could support another cloud if people want it)
|
63
|
+
|
64
|
+
## Need Help or Want to Contribute?
|
65
|
+
|
66
|
+
All contributions are welcome, please contact me if you need anything;)
|
67
|
+
|
68
|
+
# Thanks!
|
69
|
+
|
70
|
+
Big thanks goes out to Jordan Sissel for creating FPM!
|
71
|
+
|
72
|
+
<https://github.com/jordansissel/fpm>
|
73
|
+
<https://github.com/jordansissel>
|
data/bin/frm
CHANGED
@@ -45,6 +45,11 @@ Usage: frm [options] package1 [package2] ..."
|
|
45
45
|
options[:prefix] = prefix
|
46
46
|
end
|
47
47
|
|
48
|
+
options[:release] = `lsb_release -cs`.strip
|
49
|
+
opts.on('-r','--release RELEASE','release of deb packages') do |release|
|
50
|
+
options[:release] = release
|
51
|
+
end
|
52
|
+
|
48
53
|
|
49
54
|
# This displays the help screen, all programs are
|
50
55
|
# assumed to have this option.
|
@@ -86,7 +91,7 @@ Dir.chdir(File.dirname(File.dirname(__FILE__)))
|
|
86
91
|
require File.join Dir.pwd, 'lib', 'frm'
|
87
92
|
|
88
93
|
puts "creating release..."
|
89
|
-
package_release = FRM::PackageRelease.new(packages)
|
94
|
+
package_release = FRM::PackageRelease.new(packages,options[:release])
|
90
95
|
|
91
96
|
puts "pushing release..."
|
92
97
|
release_pusher = FRM::ReleasePusher.new(package_release,options[:access_key],options[:secret_key],options[:bucket],options[:prefix])
|
data/lib/frm.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'frm/base'
|
2
|
+
require 'frm/s3'
|
3
|
+
require 'frm/deb'
|
data/lib/frm/deb.rb
CHANGED
@@ -5,11 +5,12 @@ module FRM
|
|
5
5
|
|
6
6
|
class Package < Base
|
7
7
|
attr_accessor :repo_filename
|
8
|
-
attr_reader :path, :content, :md5, :sha1, :sha2 , :size
|
9
|
-
def initialize(path)
|
8
|
+
attr_reader :path, :content, :md5, :sha1, :sha2 , :size, :release
|
9
|
+
def initialize(path,release='natty')
|
10
10
|
raise "you need to specify a path!!!" if path.nil?
|
11
11
|
@path = path
|
12
12
|
raise "Can not find file '#{path}'" unless File.exists?(path)
|
13
|
+
@release = release
|
13
14
|
begin
|
14
15
|
@content = File.read(path)
|
15
16
|
rescue Object => o
|
@@ -26,13 +27,14 @@ module FRM
|
|
26
27
|
end
|
27
28
|
|
28
29
|
class PackageRelease < Base
|
29
|
-
attr_reader :packages, :standards_version, :priority, :package_file, :gzipped_package_file, :release_file, :short_release_file, :component
|
30
|
-
def initialize(packages={},component='main/binary-amd64')
|
30
|
+
attr_reader :packages, :standards_version, :priority, :package_file, :gzipped_package_file, :release_file, :short_release_file, :component, :release
|
31
|
+
def initialize(packages={},release='natty',component='main/binary-amd64')
|
32
|
+
@release = release
|
31
33
|
@component = component
|
32
34
|
@standards_version = standards_version
|
33
35
|
@priority = priority
|
34
36
|
@packages = []
|
35
|
-
packages.each { |package| @packages << Package.new(package) }
|
37
|
+
packages.each { |package| @packages << Package.new(package,@release) }
|
36
38
|
@package_file = generate_package_file
|
37
39
|
@gzipped_package_file = generate_gzip_pipe(@package_file).read
|
38
40
|
@short_release_file = generate_short_release_file
|
@@ -43,8 +45,8 @@ module FRM
|
|
43
45
|
|
44
46
|
def generate_release_file()
|
45
47
|
partial_release_file = "Origin: apt.cloudscaling.com
|
46
|
-
Label: apt repository
|
47
|
-
Codename:
|
48
|
+
Label: apt repository #{@release}
|
49
|
+
Codename: #{@release}
|
48
50
|
Date: Thu, 22 Dec 2011 00:29:55 UTC
|
49
51
|
Architectures: amd64
|
50
52
|
Components: main universe multiverse
|
@@ -68,7 +70,7 @@ SHA256:
|
|
68
70
|
def generate_short_release_file
|
69
71
|
"Component: main
|
70
72
|
Origin: apt.cloudscaling.com
|
71
|
-
Label: apt repository
|
73
|
+
Label: apt repository #{@release}
|
72
74
|
Architecture: amd64
|
73
75
|
Description: Cloudscaling APT repository
|
74
76
|
"
|
@@ -103,6 +105,7 @@ Description: Cloudscaling APT repository
|
|
103
105
|
|
104
106
|
class ReleasePusher < Base
|
105
107
|
def initialize(package_release,access_key,secret_key,bucket,prefix,server='s3-us-west-1.amazonaws.com')
|
108
|
+
@release = package_release.release
|
106
109
|
@bucket = bucket
|
107
110
|
@prefix = prefix
|
108
111
|
@s3 = FRM::S3.new(access_key,secret_key,server)
|
@@ -115,16 +118,16 @@ Description: Cloudscaling APT repository
|
|
115
118
|
|
116
119
|
def push_release_files(package_release)
|
117
120
|
# TODO: un-hardcode this
|
118
|
-
release_path = @prefix + "/dists/
|
121
|
+
release_path = @prefix + "/dists/#{@release}/Release"
|
119
122
|
@s3.put(release_path,package_release.release_file,@bucket)
|
120
123
|
|
121
|
-
in_release_path = @prefix + "/dists/
|
124
|
+
in_release_path = @prefix + "/dists/#{@release}/InRelease"
|
122
125
|
@s3.put(in_release_path,gpg_clearsign(package_release.release_file),@bucket)
|
123
126
|
|
124
|
-
gpg_release_path = @prefix + "/dists/
|
127
|
+
gpg_release_path = @prefix + "/dists/#{@release}/Release.gpg"
|
125
128
|
@s3.put(gpg_release_path,gpg_detached(package_release.release_file),@bucket)
|
126
129
|
|
127
|
-
release_file_path = @prefix + "/dists/
|
130
|
+
release_file_path = @prefix + "/dists/#{@release}/" + package_release.component
|
128
131
|
@s3.put(release_file_path + '/Release',package_release.short_release_file,@bucket)
|
129
132
|
@s3.put(release_file_path + '/Packages',package_release.package_file,@bucket)
|
130
133
|
@s3.put(release_file_path + '/Packages.gz',package_release.gzipped_package_file,@bucket)
|
data/lib/frm/version.rb
CHANGED
data/test/s3.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Martin Rhoads
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-
|
17
|
+
date: 2012-05-23 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- .gitignore
|
57
57
|
- Gemfile
|
58
58
|
- LICENSE
|
59
|
+
- README.md
|
59
60
|
- Rakefile
|
60
61
|
- bin/frm
|
61
62
|
- frm.gemspec
|
@@ -100,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
101
|
requirements: []
|
101
102
|
|
102
103
|
rubyforge_project: frm
|
103
|
-
rubygems_version: 1.3.7
|
104
|
+
rubygems_version: 1.3.7.1
|
104
105
|
signing_key:
|
105
106
|
specification_version: 3
|
106
107
|
summary: Effin Repo Manager
|