api_deploy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4356024b83ed5522e9d629fadd46d4f9748c8272
4
+ data.tar.gz: 903189ec8f159c851a7f2a62f8db0a158240e242
5
+ SHA512:
6
+ metadata.gz: 28a04b7beadb8c10581ff3d065c81a5b5004239380c6c56751dcaf8a83332f652985a2058391eb21aa1f63ea67d6c8b864ebc605d98a96522c21b471fe09c90e
7
+ data.tar.gz: 4ffc454e8dcb6b52e7339be99d694248dacc2ec15679d56d6d6b67cb22e3ecf444f5ae1c7dc4e2398cc669e2010d28610b1f01cce933f3a1dc2418a338359dbb
data/.dockerignore ADDED
@@ -0,0 +1 @@
1
+ Dockerfile
data/.gitattributes ADDED
@@ -0,0 +1 @@
1
+ *vault binary
data/.gitignore ADDED
@@ -0,0 +1,37 @@
1
+ *.gem
2
+ *.swp
3
+ *.rbc
4
+ /.config
5
+ config/overrides*
6
+ /coverage/
7
+ /InstalledFiles
8
+ /pkg/
9
+ /spec/reports/
10
+ /test/tmp/
11
+ /test/version_tmp/
12
+ /tmp/
13
+
14
+ ## Specific to RubyMotion:
15
+ .dat*
16
+ .repl_history
17
+ build/
18
+
19
+ ## Documentation cache and generated files:
20
+ /.yardoc/
21
+ /_yardoc/
22
+ /doc/
23
+ /rdoc/
24
+
25
+ ## Environment normalisation:
26
+ /.bundle/
27
+ /vendor/bundle
28
+ /lib/bundler/man/
29
+
30
+ # for a library or gem, you might want to ignore these files since the code is
31
+ # intended to run in multiple environments; otherwise, check them in:
32
+ # Gemfile.lock
33
+ # .ruby-version
34
+ # .ruby-gemset
35
+
36
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
37
+ .rvmrc
data/.vault_pass.py ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env python
2
+ import os
3
+
4
+ print(os.environ['VP'])
data/Dockerfile ADDED
@@ -0,0 +1,29 @@
1
+ # ruby dependencies and ansible
2
+ #FROM docker.artifactory.yoox.net/ruby:2.4.0-alpine
3
+ FROM ruby:2.4-alpine
4
+ RUN apk add --update --no-cache make ansible less
5
+
6
+ # takes VP as --build-arg for vault pass
7
+ ARG VP=''
8
+
9
+ # creates workdir
10
+ ENV APP_PATH /app/
11
+ RUN mkdir $APP_PATH
12
+ WORKDIR $APP_PATH
13
+
14
+ # decrypts vault in machine
15
+ COPY config/vault vault
16
+ COPY .vault_pass.py .
17
+ RUN mkdir ~/.config/
18
+ RUN ansible-vault view --vault-password-file=.vault_pass.py vault > ~/.config/api_deploy_overrides.json
19
+
20
+ # setup gem deps
21
+ COPY Gemfile* $APP_PATH
22
+ RUN bundle config build.nokogiri --use-system-libraries
23
+ RUN bundle install
24
+
25
+ # copy in app
26
+ COPY . $APP_PATH
27
+
28
+ # set LOG_LEVEL to verbose
29
+ #ENV LOG_LEVEL info
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ #source 'https://rubygems.org'
2
+ source 'http://artifactory.yoox.net/artifactory/api/gems/gems'
3
+
4
+ gem 'faraday'
5
+ gem 'artifactory'
6
+ gem 'github_api'
7
+ gem 'require_all'
8
+ gem 'logging'
9
+ gem 'hashie'
10
+ gem 'net-ldap'
11
+ gem 'rspec'
12
+ gem 'pry'
data/Gemfile.lock ADDED
@@ -0,0 +1,73 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.4.0)
5
+ artifactory (2.7.0)
6
+ coderay (1.1.1)
7
+ descendants_tracker (0.0.4)
8
+ thread_safe (~> 0.3, >= 0.3.1)
9
+ diff-lcs (1.3)
10
+ faraday (0.9.2)
11
+ multipart-post (>= 1.2, < 3)
12
+ github_api (0.14.5)
13
+ addressable (~> 2.4.0)
14
+ descendants_tracker (~> 0.0.4)
15
+ faraday (~> 0.8, < 0.10)
16
+ hashie (>= 3.4)
17
+ oauth2 (~> 1.0)
18
+ hashie (3.5.5)
19
+ jwt (1.5.6)
20
+ little-plugger (1.1.4)
21
+ logging (2.1.0)
22
+ little-plugger (~> 1.1)
23
+ multi_json (~> 1.10)
24
+ method_source (0.8.2)
25
+ multi_json (1.12.1)
26
+ multi_xml (0.6.0)
27
+ multipart-post (2.0.0)
28
+ net-ldap (0.16.0)
29
+ oauth2 (1.3.1)
30
+ faraday (>= 0.8, < 0.12)
31
+ jwt (~> 1.0)
32
+ multi_json (~> 1.3)
33
+ multi_xml (~> 0.5)
34
+ rack (>= 1.2, < 3)
35
+ pry (0.10.4)
36
+ coderay (~> 1.1.0)
37
+ method_source (~> 0.8.1)
38
+ slop (~> 3.4)
39
+ rack (2.0.1)
40
+ require_all (1.4.0)
41
+ rspec (3.5.0)
42
+ rspec-core (~> 3.5.0)
43
+ rspec-expectations (~> 3.5.0)
44
+ rspec-mocks (~> 3.5.0)
45
+ rspec-core (3.5.4)
46
+ rspec-support (~> 3.5.0)
47
+ rspec-expectations (3.5.0)
48
+ diff-lcs (>= 1.2.0, < 2.0)
49
+ rspec-support (~> 3.5.0)
50
+ rspec-mocks (3.5.0)
51
+ diff-lcs (>= 1.2.0, < 2.0)
52
+ rspec-support (~> 3.5.0)
53
+ rspec-support (3.5.0)
54
+ slop (3.6.0)
55
+ thread_safe (0.3.6)
56
+
57
+ PLATFORMS
58
+ ruby
59
+ x64-mingw32
60
+
61
+ DEPENDENCIES
62
+ artifactory
63
+ faraday
64
+ github_api
65
+ hashie
66
+ logging
67
+ net-ldap
68
+ pry
69
+ require_all
70
+ rspec
71
+
72
+ BUNDLED WITH
73
+ 1.14.2
data/Jenkinsfile ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env groovy
2
+ env.dockerTag = env.BUILD_TAG.toLowerCase()
3
+
4
+ properties([pipelineTriggers([cron('H 23 * * *')])])
5
+
6
+ stage("apply_restrictions"){
7
+ node(){
8
+ withCredentials([usernamePassword( credentialsId: 'vault_jenkins_cred_ansible_api_deploy_vault_password',
9
+ usernameVariable: 'UNUSED', passwordVariable: 'VP')]) {
10
+ checkout scm
11
+ sh "make apply_restrictions"
12
+ }
13
+ }
14
+ }
data/Makefile ADDED
@@ -0,0 +1,38 @@
1
+ .PHONY: all
2
+ all: shell
3
+
4
+ setup:
5
+ dockerTag := "localtest-$(shell date +%s)"
6
+
7
+ shell: build
8
+ @docker run --rm -it ${dockerTag} /bin/sh
9
+
10
+ build:
11
+ @docker build -f Dockerfile --build-arg VP=${VP} -t ${dockerTag} .
12
+
13
+ run: build
14
+ @docker run -e VP=${VP} --rm --name ${dockerTag} -t ${dockerTag} ./bin/${command}
15
+
16
+ run_interactive: build
17
+ @docker run -e VP=${VP} --rm --name ${dockerTag} -it ${dockerTag} ./bin/${command}
18
+
19
+ test: build
20
+ docker run --rm --name ${dockerTag} -t ${dockerTag} rake
21
+
22
+ apply_restrictions:
23
+ make run command=apply_restrictions
24
+
25
+ ruby:
26
+ make run_interactive command=api_deploy
27
+
28
+ ldap:
29
+ make run_interactive command=ldap
30
+
31
+ bb:
32
+ make run_interactive command=bitbucket
33
+
34
+ get_all_repo_sizes:
35
+ make run_interactive command=get_all_repo_sizes
36
+
37
+ edit_config_vault:
38
+ ansible-vault edit --vault-password-file=.vault_pass.py config/vault
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # ApiDeploy
2
+
3
+ ## Console tools
4
+
5
+ ### LDAP
6
+ Opens a ruby shell with a ldap query object
7
+ ```
8
+ $> VP='vault_pass' NAP_BIND_USER='' NAP_BIND_PASS='' YOOX_BIND_USER='' YOOX_BIND_PASS='' make ldap
9
+
10
+ [1] pry(main)> ldap.user 'hawkinsf'
11
+ ....
12
+
13
+ [1] pry(main)> ldap.group 'cicd'
14
+ ...
15
+ ```
16
+
17
+ ### Shell
18
+ Opens a bash shell in the api_deployer
19
+ ```
20
+ $> VP='vault_pass' make shell
21
+
22
+ $>
23
+ ```
24
+
25
+ ### Interactive
26
+ Opens a ruby shell in the api_deployer
27
+ ```
28
+ $> VP='vault_pass' make interactive
29
+
30
+ [1] pry(main)>
31
+ ```
32
+
33
+ ### Apply restrictions
34
+ Applies bitbucket repo restrictions
35
+ ```
36
+ $> VP='vault_pass' make apply_restrictions
37
+ ...
38
+ ```
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+ rescue LoadError
8
+ # no rspec available
9
+ end
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'api_deploy'
3
+ s.version = '0.1.0'
4
+ s.licenses = ['MIT']
5
+ s.summary = "gem for yoox-nap api deployment"
6
+ s.description = "can also be run as a server"
7
+ s.authors = ["Felix Hawkins"]
8
+ s.email = 'felix@whimsicaldoodles.com'
9
+ s.homepage = 'https://rubygems.org/gems/example'
10
+ s.require_paths = ['lib']
11
+ s.files = `git ls-files`.split("\n")
12
+
13
+ %w{ require_all rspec github_api faraday artifactory logging thin hashie net-ldap pry}.each do |gem|
14
+ s.add_runtime_dependency gem
15
+ end
16
+ end
data/bin/api_deploy ADDED
@@ -0,0 +1,6 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ $: << 'lib'
4
+ require 'libraries'
5
+
6
+ require 'pry';binding.pry
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << 'lib'
4
+ require 'libraries'
5
+
6
+ bb = Bitbucket.new
7
+ bb.apply_restrictions
data/bin/bitbucket ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << 'lib'
4
+ require 'libraries'
5
+
6
+ bb = Bitbucket.new
7
+ require 'pry';binding.pry
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << 'lib'
4
+ require 'libraries'
5
+
6
+ g = GithubApi.new
7
+
8
+ list = g.api.repos.list(per_page: 10000)
9
+ sizes = {}
10
+ list.each_page do |page|
11
+ page.each do |page|
12
+ sizes[page[:name]] = page[:size]
13
+ end
14
+ end
15
+
16
+ sorted = sizes.sort_by {|k,v| v }
17
+
18
+ require 'pry';binding.pry
data/bin/ldap ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << 'lib'
4
+ require 'libraries'
5
+
6
+ ldap = LdapApi.new
7
+ require 'pry';binding.pry
@@ -0,0 +1,21 @@
1
+ {
2
+ "teamcity":{
3
+ "url":"http://teamcity.yoox.net/httpAuth/app/rest",
4
+ "user":"continuous_integration",
5
+ "pass":"PASSWORD"
6
+ },
7
+ "artifactory":{
8
+ "url":"http://artifactory.yoox.net/artifactory",
9
+ "user":"continuous_integration",
10
+ "pass":"PASSWORD"
11
+ },
12
+ "octopus":{
13
+ "url":"http://octopus3.yoox.net/api",
14
+ "api_key":"APIKEY"
15
+ },
16
+ "bitbucket":{
17
+ "url":"https://git.yoox.net/",
18
+ "user":"administrator",
19
+ "pass":"PASSWORD"
20
+ }
21
+ }
data/config/vault ADDED
Binary file
data/lib/api.rb ADDED
@@ -0,0 +1,45 @@
1
+ module API
2
+ attr_reader :api
3
+
4
+ def create_api(config)
5
+ @api = Faraday.new(url: config.url) do |connection|
6
+ connection.ssl[:verify] = false
7
+ connection.adapter :net_http
8
+ if config.api_key
9
+ connection.headers['X-Octopus-ApiKey'] = config.api_key
10
+ else
11
+ connection.basic_auth(config.user, config.pass)
12
+ end
13
+ end
14
+ end
15
+
16
+ def request(method, url, query=nil, type="json", parse=true)
17
+ if query
18
+ Log.warn "request url: #{method.upcase} #{api.url_prefix}#{url}"
19
+ Log.info "request body: #{query}"
20
+ response = api.send(method) do |request|
21
+ request.url url
22
+ request.body = query
23
+ request.headers['Content-Type'] = "application/#{type}"
24
+ end
25
+ else
26
+ Log.warn "request url: #{method.upcase} #{api.url_prefix}#{url}"
27
+ response = api.send(method) do |request|
28
+ request.url url
29
+ request.headers['Content-Type'] = "application/#{type}"
30
+ end
31
+ end
32
+
33
+ Log.warn "response code: #{response.status}"
34
+ Log.info "response body: #{response.body}"
35
+ parse ? parsed_response(response) : response
36
+ end
37
+
38
+ def parsed_response(resp)
39
+ if resp.headers['content-type'] =~ /application\/json/
40
+ JSON.parse(resp.body)
41
+ else
42
+ resp
43
+ end
44
+ end
45
+ end
data/lib/api_deploy.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'require_all'
2
+ require_relative 'libraries'
3
+
4
+ class ApiDeploy
5
+ end
@@ -0,0 +1,13 @@
1
+ class ArtifactoryApi
2
+ include Artifactory::Resource
3
+ attr_reader :api
4
+
5
+ def initialize
6
+ @api = Artifactory::Client.new(
7
+ endpoint: ConfigStore.artifactory.url,
8
+ username: ConfigStore.artifactory.user,
9
+ password: ConfigStore.artifactory.pass
10
+ )
11
+ end
12
+
13
+ end