require 'renuo/cli/version' require 'rubygems' require 'gems' require 'colorize' require 'renuo/cli/app/services/renuo_cli_config' require 'renuo/cli/app/name_display' require 'renuo/cli/app/local_storage' require 'renuo/cli/app/list_large_git_files' require 'renuo/cli/app/generate_password' require 'renuo/cli/app/upgrade_laptop.rb' require 'renuo/cli/app/create_aws_project' require 'renuo/cli/app/create_heroku_app' require 'renuo/cli/app/configure_sentry' require 'renuo/cli/app/create_new_logins' require 'renuo/cli/app/work' require 'renuo/cli/app/release_project' require 'renuo/cli/app/fetch_emails' require 'renuo/cli/app/heroku_users' require 'renuo/cli/app/setup_uptimerobot' require 'renuo/cli/app/release_xing' require 'renuo/cli/app/configure_semaphore' require 'renuo/cli/app/toggl_redmine_comparator' module Renuo class CLI def start require 'commander/import' program :version, Renuo::Cli::VERSION program :description, 'Renuo CLI' info = Gems.info Renuo::Cli::NAME if Gem::Version.new(Renuo::Cli::VERSION) < Gem::Version.new(info['version']) say "You are running the version #{Renuo::Cli::VERSION} but the brand new #{info['version']} is available. 🎉" if agree("Why don't you update with `gem update renuo-cli`? I can run it for you. 💪") system("gem update #{Renuo::Cli::NAME}") abort 'Nice! I updated myself. 🤩 Now you can run the command again.' end abort('Good. Just do it yourself then...😒') exit end command 'display-name'.to_sym do |c| c.syntax = 'renuo display-name [options]' c.summary = 'Sets the name of a customer on the Renuo dashboard' c.description = 'Sets the name of a customer on the Renuo dashboard' c.example 'Display "Peter Muster" on the dashboard', 'renuo display-name "Peter Muster"' c.example 'Remove the current name from the dashboard', 'renuo display-name --delete' c.option '--delete', 'Deletes the current name' c.action do |args, options| NameDisplay.new.run(args, options) end end command :config do |c| c.syntax = 'renuo config [options]' c.summary = 'Setup the config (API keys)' c.description = 'Setup the config (API keys)' c.action do key = ask('API Key?') { |q| q.echo = '*' } LocalStorage.new.store(:api_key, key) say('stored the api key') end end command 'list-large-git-files' do |c| c.syntax = 'renuo list-large-git-files' c.summary = 'Lists the 5 largest files in a git repository. Warning: must be a bare checkout of the repo!' c.description = "Lists the 5 largest files in a git repository.\nWarning: must be a bare checkout of the repo!" c.example 'list the 5 largest git files of github.com/renuo/renuo-cli', 'git clone --bare git@github.com:renuo/renuo-cli.git && '\ 'cd renuo-cli.git && renuo list-large-git-files' c.action do ListLargeGitFiles.new.run end end command 'generate-password' do |c| c.syntax = 'renuo generate-password' c.summary = 'Generates a phrase of random 0-9a-zA-Z characters. Choose a substring of it as a new password.' c.description = 'Generates a phrase of random 0-9a-zA-Z characters. Choose a substring of it as a new password.' c.example 'renuo generate-password', 'generates a random password' c.action do GeneratePassword.new.run end end command 'upgrade-laptop' do |c| c.syntax = 'renuo upgrade-laptop' c.summary = 'Upgrades the installed apps from the app store, macOS and homebrew' c.description = 'Upgrades the installed apps from the app store, macOS and homebrew' c.example 'renuo upgrade-laptop', 'upgrades your laptop' c.action do UpgradeLaptop.new.run end end command 'create-new-logins' do |c| c.syntax = 'renuo create-new-logins' c.summary = 'Guides you through the sign up pages for Sentry, NewRelic and Gemnasium' c.description = 'Guides you through the sign up pages for Sentry, NewRelic and Gemnasium' c.example 'renuo create-new-logins', 'creates new logins' c.action do CreateNewLogins.new.run end end command 'create-aws-project' do |c| c.syntax = 'renuo create-aws-project' c.summary = 'Generates necessary commands for our project setup on AWS incl. necessary installations.' c.description = <<-DESCRIPTION This creates commands for creating AWS users, buckets an versioning policies and CloudFront. It also guides you to set up the necessary environment. You will be asked for: (- installation of aws-cli, if not yet done) (- setting up aws user `renuo-app-setup`, if not yet done) - project name and suffix so that the script can respect our naming conventions - the Redmine project name to tag buckets for AWS billing references - whether you want to setup CloudFront to deliver assets via S3 The generated commands do the following: - create an IAM user for each environment (master, develop, testing) and add it to the renuo apps group. - create S3 buckets for each user who owns it - tag the buckets - enable versioning for master buckets (- set up a CloudFront distribution for each environment with the default config or plus alias if configured) DESCRIPTION c.example 'Setup a project (you will be asked for details)', 'renuo create-aws-project' c.action do |_args, _options| CreateAwsProject.new.run end end command 'work' do |c| c.syntax = 'renuo work' c.summary = 'A utility command to start working on a ticket.' c.description = 'When you start working on a feature, it will jump to the project folder, '\ 'start a new feature with the ticket number,'\ 'move the ticket in "In progress" state on Redmine and start Toggl with the '\ 'ticket number or add the ticket number to the running one if there was none.' c.example 'renuo work start kinova 1234', 'start working on ticket 1234 on kinova project' c.action do|args| Work.new.run(args) end end command 'release' do |c| c.syntax = 'renuo release' c.summary = 'Release a projects state of develop (on github) to master in one command.' c.description = 'Creates a new release version of a project on master as either a Major, Minor, '\ 'Patch or Custom release based on the current state of develop on Github' c.example 'renuo release my-project minor', 'release a minor release of my-project' c.example 'renuo release my-project custom 2.5.0', 'release my-project as release 2.5.0' c.action do |args| ReleaseProject.new.run(args) end end command 'create-heroku-app' do |c| c.syntax = 'renuo create-heroku-app' c.summary = 'Generates the script necessary to setup an application on Heroku.' c.description = 'Generates the script necessary to setup an application on Heroku.' c.example 'renuo create-heroku-app hello', 'generates the command to create hello on Heroku' c.action do |args| CreateHerokuApp.new.run(args) end end command 'configure-sentry' do |c| c.syntax = 'renuo configure-sentry [project-name] [SENTRY_DSN]' c.summary = 'Generates the script necessary to setup sentry on Heroku.' c.description = c.summary c.example 'renuo configure-sentry myproject https://randomkey@sentry.io/11223344', 'generates the command to configure sentry for myproject on Heroku' c.action do|args| ConfigureSentry.new.run(args) end end command 'fetch-emails' do |c| c.syntax = 'renuo fetch-emails' c.summary = 'Retrieves all renuo employees email addresses' c.description = 'Retrieves all renuo employees email addresses. One per line.' c.action do |args| FetchEmails.new.run(args) end end command 'heroku-users' do |c| c.syntax = 'renuo heroku-users add/remove emailaddress' c.summary = 'Prints a list of commands to add or remove an email address from all Heroku projects' c.description = 'Useful when a new person is hired or a person quits.' c.example 'renuo heroku-users add alessandro.rodi@renuo.ch', 'Adds the user alessandro.rodi@renuo.ch to all the Heroku projects' c.example 'renuo heroku-users remove alessandro.rodi@renuo.ch', 'Removes the user alessandro.rodi@renuo.ch from all the Heroku projects' c.action do |args| HerokuUsers.new.run(args) end end command 'setup-uptimerobot' do |c| c.syntax = 'renuo setup-uptimerobot' c.summary = 'Sets up uptimerobot for the given project' c.description = "The uptimerobot configuration is mandatory for most projects. "\ "This command sets everything up and pauses the monitoring directly. Once the app is ready,"\ " the monitoring should get started." c.example 'renuo setup-uptimerobot https://redmine.ch', 'Configures redmine monitoring on uptimerobot' c.action do |args| SetupUptimerobot.new(args).run end end command 'release-xing' do |c| c.syntax = 'renuo release-xing' c.summary = 'Release Xing to preview.' c.description = "Xing needs to be released manually. "\ "You need a VPN connection open before runnign this command." c.action do |args| ReleaseXing.new.run end end command 'configure-semaphore' do |c| c.syntax = 'renuo configure-semaphore' c.summary = 'Adds standard semaphore configuration files to a project and creates the notifications' c.description = 'Run this command with a project, to add the semaphore configuration files '\ 'and create notifications.' c.action do |args| ConfigureSemaphore.new.call end end command 'toggl-redmine' do |c| c.syntax = 'renuo toggl-redmine' c.summary = 'Compares your time entries between Toggl and Redmine' c.description = 'This command extracts your time entries in Toggl and in Redmine and checks if they are'\ ' consistant. It can help you in your time booking to find if you booked something wrong' c.action do |args| TogglRedmineComparator.call end end end end end