api_deploy 0.1.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 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