release_manager 0.4.0 → 0.5.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/.gitignore +1 -1
- data/.gitlab-ci-dev.yml +51 -0
- data/CHANGELOG.md +13 -0
- data/Dockerfile +2 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +30 -29
- data/README.md +1 -3
- data/docker-compose.yml +20 -2
- data/exe/bump-changelog +3 -2
- data/exe/deploy-r10k +4 -0
- data/lib/release_manager/changelog.rb +49 -47
- data/lib/release_manager/cli/bump_changelog_cli.rb +36 -0
- data/lib/release_manager/cli/deploy_mod_cli.rb +7 -7
- data/lib/release_manager/cli/deploy_r10k_cli.rb +64 -0
- data/lib/release_manager/cli/release_mod_cli.rb +20 -1
- data/lib/release_manager/cli/sandbox_create_cli.rb +1 -0
- data/lib/release_manager/control_repo.rb +14 -0
- data/lib/release_manager/errors.rb +4 -0
- data/lib/release_manager/git/utilites.rb +187 -49
- data/lib/release_manager/module_deployer.rb +8 -6
- data/lib/release_manager/puppet_module.rb +70 -41
- data/lib/release_manager/puppetfile.rb +23 -13
- data/lib/release_manager/r10k_deployer.rb +135 -0
- data/lib/release_manager/release.rb +41 -34
- data/lib/release_manager/remote_release.rb +68 -0
- data/lib/release_manager/sandbox.rb +15 -68
- data/lib/release_manager/vcs_manager/gitlab_adapter.rb +189 -35
- data/lib/release_manager/vcs_manager/vcs_adapter.rb +103 -0
- data/lib/release_manager/vcs_manager.rb +12 -1
- data/lib/release_manager/version.rb +1 -1
- data/release_manager.gemspec +2 -2
- data/scratchcode.rb +13 -0
- data/setup_repos.rb +7 -4
- data/test_release.sh +3 -0
- data/test_sandbox.rb +0 -0
- metadata +18 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b5f2fca5358264908a1a51ed4cb1af63cc69104
|
4
|
+
data.tar.gz: 409fdbe6392f38daf968ca3379524d70b379ae2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0b5862f7aceb14806d670ab9cc6a743533ec9ae17a25eb8b1f7ee5f803bc4ee7f68252e8c0af246d29a9da8aafe9db779baf377ee2494ceb10728359357dfe2
|
7
|
+
data.tar.gz: e61f58c5af387848e48903a7df2998f28b6474f0b465d529fb42958f632e56ba4713c9147d28ebf868c4a564fd2b7577b974a30fb4f9da38eb596b03ed9d504c
|
data/.gitignore
CHANGED
data/.gitlab-ci-dev.yml
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# setup
|
2
|
+
# Please set the following variables in the UI
|
3
|
+
# GITLAB_API_PRIVATE_TOKEN (token of user who should execute the scripts and create Merge requests)
|
4
|
+
#
|
5
|
+
before_script:
|
6
|
+
- gem install bundler
|
7
|
+
- bundle install
|
8
|
+
stages:
|
9
|
+
- release
|
10
|
+
- deploy_release
|
11
|
+
#before_script:
|
12
|
+
# Run ssh-agent (inside the build environment)
|
13
|
+
|
14
|
+
#- eval $(ssh-agent -s)
|
15
|
+
# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
|
16
|
+
#- ssh-add <(echo "$SSH_PRIVATE_KEY")
|
17
|
+
variables:
|
18
|
+
GITLAB_API_ENDPOINT: "http://web/api/v4"
|
19
|
+
MAX_THREAD_COUNT: '30'
|
20
|
+
BUNDLE_DISABLE_VERSION_CHECK: '1'
|
21
|
+
GITLAB_API_HTTPARTY_OPTIONS: "{verify: false}"
|
22
|
+
|
23
|
+
# we don't always want validation to run so we skip it if SKIP_VALIDATION is set
|
24
|
+
validate:
|
25
|
+
stage: validate
|
26
|
+
tags: ['ruby']
|
27
|
+
script: if [ ! -n "${SKIP_VALIDATION}" ]; then ./scripts/validate_r10k.rb Puppetfile; fi
|
28
|
+
|
29
|
+
# tags the current head and bumps the version to the next number, creating a release
|
30
|
+
create_release:
|
31
|
+
stage: release
|
32
|
+
tags:
|
33
|
+
- ruby
|
34
|
+
script:
|
35
|
+
- bundle exec release-mod -r -a
|
36
|
+
only:
|
37
|
+
- dev@devops/r10k-control
|
38
|
+
when: manual
|
39
|
+
|
40
|
+
deploy_to_qa:
|
41
|
+
tags:
|
42
|
+
- ruby
|
43
|
+
variables:
|
44
|
+
DEPLOY_BRANCH: qa
|
45
|
+
stage: deploy_release
|
46
|
+
#when: manual
|
47
|
+
script:
|
48
|
+
- bundle exec deploy-r10k -s $CI_COMMIT_REF_NAME -d $DEPLOY_BRANCH
|
49
|
+
# only:
|
50
|
+
# - tags@devops/r10k-control
|
51
|
+
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
# Release Manager
|
2
|
+
## Unreleased
|
3
|
+
|
4
|
+
## 0.5.0
|
5
|
+
* Adds more error handling instead of stack dumps
|
6
|
+
* Updates gitlab gem to 4.2
|
7
|
+
* Updates rugged gem to 0.26
|
8
|
+
* Adds deploy-r10k cli command
|
9
|
+
* Refactors more git commands to use rugged
|
10
|
+
* Adds ability to run deploy-mod without interaction
|
11
|
+
* Moves gitlab methods to gitlab adapter
|
12
|
+
* Adds support to create merge request
|
13
|
+
* Adds ability to remote create a commit with the changelog
|
14
|
+
* Adds ability to calculate changes files between two refs
|
2
15
|
## v0.4.0
|
3
16
|
* Adds ability to sort the puppetfile when writing to file
|
4
17
|
## v0.3.1
|
data/Dockerfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
FROM ruby:2.3.4
|
2
2
|
RUN apt-get update && apt-get install -y libssh2-1-dev tree git zsh libssh2-1 vim cmake && apt-get clean
|
3
|
-
RUN useradd -m appuser && su - appuser -c 'ssh-keygen -t rsa -N "
|
3
|
+
RUN useradd -m appuser && su - appuser -c 'ssh-keygen -t rsa -N "" -f /home/appuser/.ssh/id_rsa' && mkdir /app \
|
4
4
|
&& chown appuser:appuser /app
|
5
5
|
COPY ./Gemfile* /app/
|
6
6
|
COPY .bash_profile /home/appuser/.bash_profile
|
@@ -11,4 +11,5 @@ RUN su - appuser -c 'git config --global user.email "user@example.com"' && \
|
|
11
11
|
RUN su - appuser -c "BUNDLE_PATH='/home/appuser/.bundle' GEM_HOME='/home/appuser/.gems' bundle install --gemfile=/app/Gemfile" \
|
12
12
|
&& rm -f /app/*
|
13
13
|
# update PATH to find local gems
|
14
|
+
|
14
15
|
USER appuser
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
release_manager (0.
|
5
|
-
gitlab (~>
|
4
|
+
release_manager (0.5.0)
|
5
|
+
gitlab (~> 4.2.0)
|
6
6
|
highline (~> 1.7)
|
7
|
-
rugged
|
7
|
+
rugged (~> 0.26)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -12,16 +12,15 @@ GEM
|
|
12
12
|
ast (2.3.0)
|
13
13
|
coderay (1.1.1)
|
14
14
|
diff-lcs (1.3)
|
15
|
-
gitlab (
|
16
|
-
httparty
|
15
|
+
gitlab (4.2.0)
|
16
|
+
httparty
|
17
17
|
terminal-table
|
18
18
|
highline (1.7.8)
|
19
|
-
httparty (0.
|
20
|
-
json (~> 1.8)
|
19
|
+
httparty (0.15.5)
|
21
20
|
multi_xml (>= 0.5.2)
|
22
|
-
json (1.8.6)
|
23
21
|
method_source (0.8.2)
|
24
22
|
multi_xml (0.6.0)
|
23
|
+
parallel (1.11.2)
|
25
24
|
parser (2.4.0.0)
|
26
25
|
ast (~> 2.2)
|
27
26
|
powerpack (0.1.1)
|
@@ -29,47 +28,49 @@ GEM
|
|
29
28
|
coderay (~> 1.1.0)
|
30
29
|
method_source (~> 0.8.1)
|
31
30
|
slop (~> 3.4)
|
32
|
-
rainbow (2.2.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
rspec-
|
37
|
-
rspec-
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
rainbow (2.2.2)
|
32
|
+
rake
|
33
|
+
rake (12.0.0)
|
34
|
+
rspec (3.6.0)
|
35
|
+
rspec-core (~> 3.6.0)
|
36
|
+
rspec-expectations (~> 3.6.0)
|
37
|
+
rspec-mocks (~> 3.6.0)
|
38
|
+
rspec-core (3.6.0)
|
39
|
+
rspec-support (~> 3.6.0)
|
40
|
+
rspec-expectations (3.6.0)
|
41
41
|
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
-
rspec-support (~> 3.
|
43
|
-
rspec-mocks (3.
|
42
|
+
rspec-support (~> 3.6.0)
|
43
|
+
rspec-mocks (3.6.0)
|
44
44
|
diff-lcs (>= 1.2.0, < 2.0)
|
45
|
-
rspec-support (~> 3.
|
46
|
-
rspec-support (3.
|
47
|
-
rubocop (0.
|
45
|
+
rspec-support (~> 3.6.0)
|
46
|
+
rspec-support (3.6.0)
|
47
|
+
rubocop (0.49.1)
|
48
|
+
parallel (~> 1.10)
|
48
49
|
parser (>= 2.3.3.1, < 3.0)
|
49
50
|
powerpack (~> 0.1)
|
50
51
|
rainbow (>= 1.99.1, < 3.0)
|
51
52
|
ruby-progressbar (~> 1.7)
|
52
53
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
53
54
|
ruby-progressbar (1.8.1)
|
54
|
-
rugged (0.
|
55
|
+
rugged (0.26.0)
|
55
56
|
slop (3.6.0)
|
56
|
-
terminal-table (1.
|
57
|
-
unicode-display_width (~> 1.1.1)
|
58
|
-
unicode-display_width (1.
|
57
|
+
terminal-table (1.8.0)
|
58
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
59
|
+
unicode-display_width (1.3.0)
|
59
60
|
|
60
61
|
PLATFORMS
|
61
62
|
ruby
|
62
63
|
|
63
64
|
DEPENDENCIES
|
64
65
|
bundler
|
65
|
-
gitlab (~>
|
66
|
+
gitlab (~> 4.2.0)
|
66
67
|
highline (~> 1.7)
|
67
68
|
pry
|
68
69
|
rake
|
69
70
|
release_manager!
|
70
71
|
rspec
|
71
72
|
rubocop
|
72
|
-
rugged
|
73
|
+
rugged (~> 0.26)
|
73
74
|
|
74
75
|
BUNDLED WITH
|
75
|
-
1.
|
76
|
+
1.15.2
|
data/README.md
CHANGED
@@ -39,7 +39,7 @@ This gem provides workflow automations around releasing and deploying puppet mod
|
|
39
39
|
|
40
40
|
## Prerequisites
|
41
41
|
|
42
|
-
1. Must be running Gitlab
|
42
|
+
1. Must be running Gitlab 9.0+
|
43
43
|
2. Must be using ssh keys with gitlab
|
44
44
|
3. Must be using ssh-agent to handle git authentication
|
45
45
|
4. Must be using Git
|
@@ -48,8 +48,6 @@ This gem provides workflow automations around releasing and deploying puppet mod
|
|
48
48
|
7. Must have a Gitlab API Access token (per user)
|
49
49
|
8. Must have the libssh-dev library package installed
|
50
50
|
|
51
|
-
|
52
|
-
|
53
51
|
## Installation
|
54
52
|
|
55
53
|
Add this line to your application's Gemfile:
|
data/docker-compose.yml
CHANGED
@@ -9,7 +9,7 @@ services:
|
|
9
9
|
environment:
|
10
10
|
GEM_HOME: '/home/appuser/.gems'
|
11
11
|
BUNDLE_PATH: '/home/appuser/.bundle'
|
12
|
-
GITLAB_API_ENDPOINT: 'http://web/api/
|
12
|
+
GITLAB_API_ENDPOINT: 'http://web/api/v4'
|
13
13
|
# the token may change so this really needs to be more dynamic
|
14
14
|
GITLAB_API_PRIVATE_TOKEN: 'A_zJJfgE8P-8mFGK2_r9'
|
15
15
|
R10K_REPO_URL: "git@web:devops/control-repo.git"
|
@@ -18,7 +18,25 @@ services:
|
|
18
18
|
# - app_startup_script.sh
|
19
19
|
volumes:
|
20
20
|
- .:/app
|
21
|
-
|
21
|
+
runner:
|
22
|
+
image: 'registry.gitlab.com/gitlab-org/gitlab-ci-multi-runner:ubuntu-v9.3.0'
|
23
|
+
volumes:
|
24
|
+
- './srv/gitlab-runner/config:/etc/gitlab-runner'
|
25
|
+
- '/var/run/docker.sock:/var/run/docker.sock'
|
26
|
+
environment:
|
27
|
+
DOCKER_NETWORK_MODE: 'releasemanager_default'
|
28
|
+
RUNNER_TAG_LIST: 'ruby'
|
29
|
+
REGISTRATION_TOKEN: 'W_nSSWTvuYmGUmUbh65y'
|
30
|
+
RUNNER_NAME: 'test-runner'
|
31
|
+
CI_SERVER_URL: 'http://web/ci'
|
32
|
+
RUNNER_EXECUTOR: 'docker'
|
33
|
+
GITLAB_API_ENDPOINT: 'http://web/api/v4'
|
34
|
+
REGISTER_RUN_UNTAGGED: 'true'
|
35
|
+
DOCKER_IMAGE: 'ruby:2.1'
|
36
|
+
REGISTER_LOCKED: 'false'
|
37
|
+
# the token may change so this really needs to be more dynamic
|
38
|
+
GITLAB_API_PRIVATE_TOKEN: 'A_zJJfgE8P-8mFGK2_r9'
|
39
|
+
#entrypoint:
|
22
40
|
web:
|
23
41
|
image: 'gitlab/gitlab-ce:latest'
|
24
42
|
restart: always
|
data/exe/bump-changelog
CHANGED
data/exe/deploy-r10k
ADDED
@@ -15,6 +15,7 @@ class Changelog < WorkflowAction
|
|
15
15
|
|
16
16
|
include ReleaseManager::Git::Utilities
|
17
17
|
include ReleaseManager::Logger
|
18
|
+
include ReleaseManager::VCSManager
|
18
19
|
|
19
20
|
def initialize(module_path, version, options = {})
|
20
21
|
@options = options
|
@@ -22,58 +23,29 @@ class Changelog < WorkflowAction
|
|
22
23
|
@version = version
|
23
24
|
end
|
24
25
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
def empty_changelog_contents
|
27
|
+
"# #{module_name}\n\n## Unreleased\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
def module_name
|
31
|
+
metadata['name']
|
31
32
|
end
|
32
33
|
|
33
34
|
def path
|
34
35
|
@root_dir
|
35
36
|
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
if already_released?
|
38
|
+
# @param remote [Boolean] - if the commit is a remote git on the vcs server
|
39
|
+
# @return [String] - sha of the commit
|
40
|
+
def run(remote = false, branch = 'master')
|
41
|
+
if already_released?
|
41
42
|
logger.fatal "Version #{version} had already been released, did you bump the version manually?"
|
42
43
|
exit 1
|
43
|
-
else
|
44
|
-
File.write(changelog_file, new_content)
|
45
|
-
commit_changelog if options[:commit]
|
46
|
-
logger.info "The changelog has been updated to version #{version}"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.run
|
51
|
-
options = {}
|
52
|
-
OptionParser.new do |opts|
|
53
|
-
opts.program_name = 'bump_changelog'
|
54
|
-
opts.version = ReleaseManager::VERSION
|
55
|
-
opts.on_head(<<-EOF
|
56
|
-
|
57
|
-
Summary: updates the changelog.md file with the new
|
58
|
-
version by reading the metadata.json file
|
59
|
-
|
60
|
-
EOF
|
61
|
-
)
|
62
|
-
opts.on("-c", "--[no-]commit", "Commit the updated changelog") do |c|
|
63
|
-
options[:commit] = c
|
64
|
-
end
|
65
|
-
opts.on("-f", "--changelog FILE", "Path to the changelog file") do |c|
|
66
|
-
options[:file] = c
|
67
|
-
end
|
68
|
-
end.parse!
|
69
|
-
unless options[:file]
|
70
|
-
puts "Must supply --changelog FILE"
|
71
|
-
exit 1
|
72
44
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
45
|
+
File.write(changelog_file, new_content) unless remote
|
46
|
+
id = commit_changelog(nil, remote, branch) if options[:commit]
|
47
|
+
logger.info "The changelog has been updated to version #{version}"
|
48
|
+
id
|
77
49
|
end
|
78
50
|
|
79
51
|
# @returns [String] the full path to the change log file
|
@@ -83,7 +55,11 @@ EOF
|
|
83
55
|
|
84
56
|
# @returns [Array[String]]
|
85
57
|
def changelog_lines
|
86
|
-
@changelog_lines
|
58
|
+
unless @changelog_lines
|
59
|
+
@changelog_lines = File.exists?(changelog_file) ?
|
60
|
+
File.readlines(changelog_file) : empty_changelog_contents.lines
|
61
|
+
end
|
62
|
+
@changelog_lines
|
87
63
|
end
|
88
64
|
|
89
65
|
# @returns [Integer] line number of where the word unreleased is located
|
@@ -115,10 +91,20 @@ EOF
|
|
115
91
|
end
|
116
92
|
|
117
93
|
# @return [String] the oid of the commit that was created
|
118
|
-
def commit_changelog(msg = nil)
|
119
|
-
add_file(changelog_file)
|
94
|
+
def commit_changelog(msg = nil, remote = false, branch = 'master')
|
120
95
|
message = msg || "[ReleaseManager] - bump changelog to version #{version}"
|
121
|
-
|
96
|
+
if remote
|
97
|
+
actions = [{
|
98
|
+
action: 'update',
|
99
|
+
file_path: changelog_file.split(repo.workdir).last,
|
100
|
+
content: new_content
|
101
|
+
}]
|
102
|
+
obj = vcs_create_commit(source, branch, message, actions)
|
103
|
+
obj.id if obj
|
104
|
+
else
|
105
|
+
add_file(changelog_file)
|
106
|
+
create_commit(message)
|
107
|
+
end
|
122
108
|
end
|
123
109
|
|
124
110
|
# checks to make sure the unreleased line is valid, and the file exists
|
@@ -126,5 +112,21 @@ EOF
|
|
126
112
|
log = new(path, nil)
|
127
113
|
log.unreleased_index if File.exists?(log.changelog_file)
|
128
114
|
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
# @returns [Hash] the metadata object as a ruby hash
|
119
|
+
def metadata
|
120
|
+
unless @metadata
|
121
|
+
metadata_file =File.join(path, 'metadata.json')
|
122
|
+
raise ModNotFoundException unless File.exists?(metadata_file)
|
123
|
+
@metadata ||= JSON.parse(File.read(metadata_file))
|
124
|
+
end
|
125
|
+
@metadata
|
126
|
+
end
|
127
|
+
|
128
|
+
def source
|
129
|
+
metadata['source']
|
130
|
+
end
|
129
131
|
end
|
130
132
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'release_manager/version'
|
3
|
+
require 'release_manager/changelog'
|
4
|
+
module ReleaseManager
|
5
|
+
class BumpChangelogCli
|
6
|
+
|
7
|
+
def self.run
|
8
|
+
options = {}
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.program_name = 'bump_changelog'
|
11
|
+
opts.version = ReleaseManager::VERSION
|
12
|
+
opts.on_head(<<-EOF
|
13
|
+
|
14
|
+
Summary: updates the changelog.md file with the new
|
15
|
+
version by reading the metadata.json file
|
16
|
+
|
17
|
+
EOF
|
18
|
+
)
|
19
|
+
opts.on("-c", "--[no-]commit", "Commit the updated changelog") do |c|
|
20
|
+
options[:commit] = c
|
21
|
+
end
|
22
|
+
opts.on("-f", "--changelog FILE", "Path to the changelog file") do |c|
|
23
|
+
options[:file] = c
|
24
|
+
end
|
25
|
+
end.parse!
|
26
|
+
unless options[:file]
|
27
|
+
puts "Must supply --changelog FILE"
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
module_path = File.dirname(options[:file])
|
31
|
+
puppet_module = PuppetModule.new(module_path)
|
32
|
+
log = Changelog.new(module_path, puppet_module.version, options)
|
33
|
+
log.run
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -26,16 +26,16 @@ module ReleaseManager
|
|
26
26
|
opts.on('-c', '--commit', 'Optionally, Commit the Puppetfile change') do |p|
|
27
27
|
options[:commit] = p
|
28
28
|
end
|
29
|
-
# removing this option as it seems a little dangerous for now
|
30
|
-
# opts.on('-u', '--push', 'Optionally, Push the changes to the remote') do |p|
|
31
|
-
# options[:push] = p
|
32
|
-
# end
|
33
|
-
# opts.on('-r', '--remote REMOTE', 'Optionally, specify a remote name or url to push changes to') do |p|
|
34
|
-
# options[:remote] = p
|
35
|
-
# end
|
36
29
|
opts.on('-d', 'Perform a dry run without making changes') do |p|
|
37
30
|
options[:dry_run] = p
|
38
31
|
end
|
32
|
+
opts.on('-a', '--auto', 'Run this script without interaction') do |c|
|
33
|
+
options[:auto] = c
|
34
|
+
end
|
35
|
+
opts.on('-r', '--remote-deploy', "Perform a remote deploy (For CI systems)") do |c|
|
36
|
+
options[:remote] = c
|
37
|
+
options[:auto] = true
|
38
|
+
end
|
39
39
|
end.parse!
|
40
40
|
m = ModuleDeployer.new(options)
|
41
41
|
m.run
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'release_manager/r10k_deployer'
|
2
|
+
require 'optparse'
|
3
|
+
require 'release_manager/version'
|
4
|
+
module ReleaseManager
|
5
|
+
class DeployR10kCli
|
6
|
+
|
7
|
+
def self.puppetfile_path
|
8
|
+
ENV['PUPPET_FILE_PATH'] || File.join(File.expand_path(Dir.pwd), 'Puppetfile')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.validate(options)
|
12
|
+
if options[:src_ref].nil? or options[:dest_ref].nil?
|
13
|
+
puts "You must supply --source and --dest arguments".red
|
14
|
+
puts @o
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.run
|
21
|
+
options = {}
|
22
|
+
@o = OptionParser.new do |opts|
|
23
|
+
opts.program_name = 'deploy-r10k'
|
24
|
+
opts.version = ReleaseManager::VERSION
|
25
|
+
opts.on_head(<<-EOF
|
26
|
+
|
27
|
+
Summary: Deploys the source ref into the dest branch by diffing the two and applying the diff. Generates a merge
|
28
|
+
request after committing the changes to the dest branch.
|
29
|
+
|
30
|
+
1. fetches the latest code
|
31
|
+
2. creates the necessary remotes
|
32
|
+
3. Forks project
|
33
|
+
4. creates new branch
|
34
|
+
5. creates diff and applies diff to new branch
|
35
|
+
6. push branch and create merge request
|
36
|
+
|
37
|
+
Examples:
|
38
|
+
deploy-r10k dev qa
|
39
|
+
deploy-r10k -s dev -d qa
|
40
|
+
deploy-r10k -p ~/repos/r10k-control -s dev -d qa
|
41
|
+
|
42
|
+
|
43
|
+
EOF
|
44
|
+
)
|
45
|
+
opts.on('-p', "--puppetfile [PUPPETFILE]", "Path to R10k Puppetfile, defaults to #{puppetfile_path}") do |p|
|
46
|
+
options[:puppetfile] = File.expand_path(p)
|
47
|
+
end
|
48
|
+
opts.on('-s', "--source [SRC_REF]", "The source ref or branch you want to deploy") do |p|
|
49
|
+
options[:src_ref] = p
|
50
|
+
end
|
51
|
+
opts.on('-d', "--dest [DEST_BRANCH]", "The destination branch you want to deploy to") do |p|
|
52
|
+
options[:dest_ref] = p
|
53
|
+
end
|
54
|
+
end
|
55
|
+
@o.parse!
|
56
|
+
options[:puppetfile] = options[:puppetfile] || puppetfile_path
|
57
|
+
options[:src_ref] ||= ARGV[0]
|
58
|
+
options[:dest_ref] ||= ARGV[1]
|
59
|
+
validate(options)
|
60
|
+
path = File.dirname(options[:puppetfile])
|
61
|
+
R10kDeployer.run(path, options)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,4 +1,19 @@
|
|
1
|
+
# Purpose: release a new version of a module or r10k-control from the src branch by performing
|
2
|
+
# the following tasks:
|
3
|
+
# - bump version in metadata file
|
4
|
+
# - bump changelog version using version in metadata file
|
5
|
+
# - tag the code matching the version in the metadata file
|
6
|
+
# - push to upstream
|
7
|
+
# This script can be used on modules or r10k-control. If using on a module
|
8
|
+
# be sure to pass in the repo path using --repo. The repo is where this script
|
9
|
+
# pushes too.
|
10
|
+
#
|
11
|
+
# You should also use the -d feature which simulates a run of the script without doing
|
12
|
+
# anything harmful.
|
13
|
+
#
|
14
|
+
# Run with -h to see the help
|
1
15
|
require 'release_manager/release'
|
16
|
+
require 'release_manager/remote_release'
|
2
17
|
require 'optparse'
|
3
18
|
require 'release_manager/version'
|
4
19
|
module ReleaseManager
|
@@ -35,8 +50,12 @@ Summary: Bumps the module version to the next revision and
|
|
35
50
|
opts.on('--verbose', "Extra logging") do |c|
|
36
51
|
options[:verbose] = c
|
37
52
|
end
|
53
|
+
opts.on('-r', '--remote-release', "Perform a remote release (For CI systems)") do |c|
|
54
|
+
options[:remote] = true
|
55
|
+
end
|
38
56
|
end.parse!
|
39
|
-
r =
|
57
|
+
r = options[:remote] ?
|
58
|
+
RemoteRelease.new(options[:path], options) : Release.new(options[:path], options)
|
40
59
|
r.run
|
41
60
|
end
|
42
61
|
end
|
@@ -4,9 +4,12 @@ require 'release_manager/git/utilites'
|
|
4
4
|
|
5
5
|
class ControlRepo
|
6
6
|
attr_accessor :path, :repo, :url
|
7
|
+
DEFAULT_BRANCH = ENV['CONTROL_REPO_DEFAULT_BRANCH'] || 'dev'
|
8
|
+
DEFAULT_BRANCHES = ENV['CONTROL_REPO_DEFAULT_BRANCHES'] || %w(dev qa integration acceptance production)
|
7
9
|
|
8
10
|
include ReleaseManager::Git::Utilities
|
9
11
|
include ReleaseManager::Logger
|
12
|
+
include ReleaseManager::VCSManager
|
10
13
|
|
11
14
|
def initialize(path, url = nil)
|
12
15
|
@path = path
|
@@ -32,4 +35,15 @@ class ControlRepo
|
|
32
35
|
@puppetfile
|
33
36
|
end
|
34
37
|
|
38
|
+
def commit(message, diff_obj, branch_name, remote = false)
|
39
|
+
message = "[ReleaseManager] - #{message}"
|
40
|
+
if remote
|
41
|
+
actions = diff_2_commit(diff_obj)
|
42
|
+
obj = vcs_create_commit(url, branch_name, message, actions)
|
43
|
+
obj.id if obj
|
44
|
+
else
|
45
|
+
create_commit(message)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
35
49
|
end
|
@@ -11,3 +11,7 @@ class RepoNotFound < Exception; end
|
|
11
11
|
class InvalidModule < Exception; end
|
12
12
|
class InvalidToken < Exception; end
|
13
13
|
class InvalidSshkey < Exception; end
|
14
|
+
class InvalidBranchName < Exception; end
|
15
|
+
class PatchError < Exception; end
|
16
|
+
class AlreadyReleased < Exception; end
|
17
|
+
class TagExists < Exception; end
|