sidekiq-redeploy 0.1.8 → 0.1.10
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/.rubocop.yml +4 -1
- data/CHANGELOG.md +12 -0
- data/README.md +25 -2
- data/bin/sidekiq-loader +12 -2
- data/lib/sidekiq/redeploy/loader.rb +55 -33
- data/lib/sidekiq/redeploy/version.rb +1 -1
- data/sidekiq-redeploy.gemspec +1 -1
- metadata +4 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: de3104469105eed517e7e6994858454b80e102d10a7dc793b1517552ff7d6a53
         | 
| 4 | 
            +
              data.tar.gz: c5264950908153ce688ba6700270163a1ac21a7e91fc88d1e8443a5098704b88
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a6f6ade2223e07932aef74b35ea262cd19635dabb34cf8ab4ad27dc3cf8e49b59184d7196bd087636d4ecb758496a2aaccbcdf85f11700185c1be09e5f6a8fe1
         | 
| 7 | 
            +
              data.tar.gz: 05b1f9e28ae95f7e532367a7bf79a314487bc40fd1b70576ae552ce7e5240235cb7fa541a7bc940d8b412e849eeeab7085d261b365b74144dc10617f08a995a6
         | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,15 @@ | |
| 1 | 
            +
            ## v0.1.10
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            **Fixes and enhancements:**
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Add support to run commands prior to redeploy using a yaml watch file. This is useful for running a migration or bundle gems.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## v0.1.9
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            **Fixes and enhancements:**
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            - Allow users to specify number of sidekiq worker processes with -n flag
         | 
| 12 | 
            +
             | 
| 1 13 | 
             
            ## v0.1.8
         | 
| 2 14 |  | 
| 3 15 | 
             
            **Fixes and enhancements:**
         | 
    
        data/README.md
    CHANGED
    
    | @@ -40,11 +40,34 @@ Usage: sidekiq-loader [options] | |
| 40 40 | 
             
                -y, --watch-delay INTEGER        [Optional] Specify the number of seconds between checking watch file. Defaults to 30.
         | 
| 41 41 | 
             
                -d, --[no-]deploy  [FLAG]        [Optional] Deploy archive on app startup. Defaults to true.
         | 
| 42 42 | 
             
                -s, --sidekiq-app [PATH|DIR]     [Optional] Location of application to pass to sidekiq.
         | 
| 43 | 
            +
                -n, --num-procs INTEGER          [Optional] Specify the number of sidekiq processes to create. Defaults to 1.
         | 
| 43 44 | 
             
            ```
         | 
| 44 45 |  | 
| 45 | 
            -
             | 
| 46 | 
            +
            The watch file can contain an optional list of commands to run and the required archive_location. The archive_location can be a file path or S3 URL
         | 
| 47 | 
            +
            For example when using a file:
         | 
| 48 | 
            +
            ```yaml
         | 
| 49 | 
            +
            ---
         | 
| 50 | 
            +
            commands:
         | 
| 51 | 
            +
              - bundle 
         | 
| 52 | 
            +
            archive_location: /app/pkg/test_app_0.0.3.zip
         | 
| 53 | 
            +
            ```
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            For example when using S3:
         | 
| 56 | 
            +
            ```yaml
         | 
| 57 | 
            +
            ---
         | 
| 58 | 
            +
            commands:
         | 
| 59 | 
            +
              - bundle 
         | 
| 60 | 
            +
            archive_location: s3://puma-test-app-archives/test_app_0.0.3.zip
         | 
| 61 | 
            +
            ```
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            For example this will start the launcher using a S3 yaml watch file.
         | 
| 64 | 
            +
            ```shell
         | 
| 65 | 
            +
            bundle exec sidekiq-loader -a /app -w s3://puma-test-app-archives/watch.yml
         | 
| 66 | 
            +
            ```
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            For example this will start the launcher using a local yaml watch file.
         | 
| 46 69 | 
             
            ```shell
         | 
| 47 | 
            -
            bundle exec sidekiq-loader -a / | 
| 70 | 
            +
            bundle exec sidekiq-loader -a ./ -s ./lib/sidekiq_server.rb -w build/pkg/watch.yml
         | 
| 48 71 | 
             
            ```
         | 
| 49 72 |  | 
| 50 73 | 
             
            In the example above the `watch.me` contents would look like the following. In this case the `test_app_0.0.3.zip` must exist in the `puma-test-app-archives` S3 bucket.
         | 
    
        data/bin/sidekiq-loader
    CHANGED
    
    | @@ -9,11 +9,16 @@ require 'optparse' | |
| 9 9 | 
             
            def run_sidekiq(ops, logger)
         | 
| 10 10 | 
             
              deployer = Puma::Redeploy::DeployerFactory.create(target: ops[:app_dir], watch_file: ops[:watch], logger:)
         | 
| 11 11 |  | 
| 12 | 
            +
              watch_file_data = deployer.watch_file_data
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              archive_file = deployer.archive_file(watch_file_data[:archive_location])
         | 
| 15 | 
            +
             | 
| 12 16 | 
             
              # Load app archive on launch
         | 
| 13 | 
            -
              deployer.deploy(source:  | 
| 17 | 
            +
              deployer.deploy(source: archive_file) if ops[:deploy]
         | 
| 14 18 | 
             
              config = { watch_delay: ops[:watch_delay] }
         | 
| 15 19 |  | 
| 16 | 
            -
              Sidekiq::Redeploy::Loader.new(deployer:, logger:, sidekiq_app: ops[:sidekiq_app], config | 
| 20 | 
            +
              Sidekiq::Redeploy::Loader.new(deployer:, logger:, sidekiq_app: ops[:sidekiq_app], config:,
         | 
| 21 | 
            +
                                            num_processes: ops[:num_processes]).run
         | 
| 17 22 | 
             
            end
         | 
| 18 23 |  | 
| 19 24 | 
             
            def option_parser(opts)
         | 
| @@ -39,6 +44,11 @@ def option_parser(opts) | |
| 39 44 | 
             
                o.on '-s', '--sidekiq-app [PATH|DIR]', '[Optional] Location of application to pass to sidekiq.' do |arg|
         | 
| 40 45 | 
             
                  opts[:sidekiq_app] = arg
         | 
| 41 46 | 
             
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                o.on '-n', '--num-procs INTEGER', Integer,
         | 
| 49 | 
            +
                     '[Optional] Specify the number of sidekiq processes to create. Defaults to 1.' do |arg|
         | 
| 50 | 
            +
                  opts[:num_processes] = arg
         | 
| 51 | 
            +
                end
         | 
| 42 52 | 
             
              end
         | 
| 43 53 | 
             
            end
         | 
| 44 54 |  | 
| @@ -15,9 +15,8 @@ module Sidekiq | |
| 15 15 |  | 
| 16 16 | 
             
                  SIGNALS = [INT, TERM, USR2, TTIN].freeze
         | 
| 17 17 |  | 
| 18 | 
            -
                  def initialize(deployer:, sidekiq_app: nil, logger: Logger.new($stdout), config: {})
         | 
| 18 | 
            +
                  def initialize(deployer:, sidekiq_app: nil, logger: Logger.new($stdout), config: {}, num_processes: 1)
         | 
| 19 19 | 
             
                    require 'sidekiq/cli'
         | 
| 20 | 
            -
             | 
| 21 20 | 
             
                    @reload_sidekiq = false
         | 
| 22 21 | 
             
                    @exit_loader = false
         | 
| 23 22 | 
             
                    @loader_pid = ::Process.pid
         | 
| @@ -28,6 +27,8 @@ module Sidekiq | |
| 28 27 | 
             
                    @loop_delay = config[:loop_delay] || 0.5
         | 
| 29 28 | 
             
                    @deployer = deployer
         | 
| 30 29 | 
             
                    @sidekiq_app = sidekiq_app
         | 
| 30 | 
            +
                    @num_processes = num_processes || 1
         | 
| 31 | 
            +
                    @sidekiq_pids = []
         | 
| 31 32 | 
             
                  end
         | 
| 32 33 |  | 
| 33 34 | 
             
                  def run
         | 
| @@ -46,7 +47,7 @@ module Sidekiq | |
| 46 47 | 
             
                  rescue StandardError => e
         | 
| 47 48 | 
             
                    log "Error in sidekiq loader: #{e.message}"
         | 
| 48 49 | 
             
                    log e.backtrace.join("\n")
         | 
| 49 | 
            -
                    stop_sidekiq(@ | 
| 50 | 
            +
                    stop_sidekiq(@sidekiq_pids)
         | 
| 50 51 | 
             
                    ::Process.waitall
         | 
| 51 52 | 
             
                    exit 1
         | 
| 52 53 | 
             
                  end
         | 
| @@ -59,15 +60,25 @@ module Sidekiq | |
| 59 60 | 
             
                    loop do
         | 
| 60 61 | 
             
                      sleep(loop_delay)
         | 
| 61 62 | 
             
                      if needs_redeploy?
         | 
| 62 | 
            -
                        reload_app  | 
| 63 | 
            +
                        reload_app do
         | 
| 64 | 
            +
                          watch_file_data = deployer.watch_file_data
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                          archive_file = deployer.archive_file(watch_file_data[:archive_location])
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                          logger.info "Sidekiq restart begin file=#{deployer.watch_file} archive=#{archive_file}"
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                          Puma::Redeploy::CommandRunner.new(commands: watch_file_data[:commands], logger:).run
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                          deployer.deploy(source: archive_file)
         | 
| 73 | 
            +
                        end
         | 
| 63 74 | 
             
                      elsif reload_sidekiq
         | 
| 64 75 | 
             
                        reload_app
         | 
| 65 | 
            -
                      elsif process_died?(@sidekiq_pid)
         | 
| 66 | 
            -
                        fork_sidekiq
         | 
| 67 76 | 
             
                      end
         | 
| 77 | 
            +
                      @sidekiq_pids = running_pids(@sidekiq_pids)
         | 
| 78 | 
            +
                      fork_sidekiq(@num_processes - @sidekiq_pids.length) if @sidekiq_pids.length < @num_processes
         | 
| 68 79 | 
             
                      next unless exit_loader
         | 
| 69 80 |  | 
| 70 | 
            -
                      stop_sidekiq(@ | 
| 81 | 
            +
                      stop_sidekiq(@sidekiq_pids)
         | 
| 71 82 | 
             
                      break
         | 
| 72 83 | 
             
                    end
         | 
| 73 84 | 
             
                  end
         | 
| @@ -80,30 +91,32 @@ module Sidekiq | |
| 80 91 | 
             
                  end
         | 
| 81 92 |  | 
| 82 93 | 
             
                  def reload_app
         | 
| 83 | 
            -
                    quiet_sidekiq(@ | 
| 94 | 
            +
                    quiet_sidekiq(@sidekiq_pids)
         | 
| 84 95 |  | 
| 85 96 | 
             
                    yield if block_given?
         | 
| 86 97 |  | 
| 87 | 
            -
                    stop_sidekiq(@ | 
| 98 | 
            +
                    stop_sidekiq(@sidekiq_pids)
         | 
| 88 99 |  | 
| 89 100 | 
             
                    # wait for sidekiq to stop
         | 
| 90 101 | 
             
                    ::Process.waitall
         | 
| 91 | 
            -
             | 
| 92 102 | 
             
                    fork_sidekiq
         | 
| 93 103 | 
             
                    @reload_sidekiq = false
         | 
| 94 104 | 
             
                  end
         | 
| 95 105 |  | 
| 96 | 
            -
                  def fork_sidekiq
         | 
| 97 | 
            -
                     | 
| 98 | 
            -
                       | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
                       | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 106 | 
            +
                  def fork_sidekiq(num_children = @num_processes)
         | 
| 107 | 
            +
                    num_children.times do
         | 
| 108 | 
            +
                      pid = ::Process.fork do
         | 
| 109 | 
            +
                        cli = Sidekiq::CLI.instance
         | 
| 110 | 
            +
                        args = @sidekiq_app ? ['-r', @sidekiq_app] : []
         | 
| 111 | 
            +
                        cli.parse(args)
         | 
| 112 | 
            +
                        cli.run
         | 
| 113 | 
            +
                      rescue StandardError => e
         | 
| 114 | 
            +
                        message = "Error loading sidekiq process: #{e.message}"
         | 
| 115 | 
            +
                        log message
         | 
| 116 | 
            +
                        log e.backtrace.join("\n")
         | 
| 117 | 
            +
                        raise message
         | 
| 118 | 
            +
                      end
         | 
| 119 | 
            +
                      @sidekiq_pids << pid
         | 
| 107 120 | 
             
                    end
         | 
| 108 121 | 
             
                  end
         | 
| 109 122 |  | 
| @@ -126,32 +139,41 @@ module Sidekiq | |
| 126 139 | 
             
                    when USR2
         | 
| 127 140 | 
             
                      @reload_sidekiq = true
         | 
| 128 141 | 
             
                    when TTIN
         | 
| 129 | 
            -
                       | 
| 142 | 
            +
                      @sidekiq_pids.each do |pid|
         | 
| 143 | 
            +
                        ::Process.kill(signal, pid)
         | 
| 144 | 
            +
                      end
         | 
| 130 145 | 
             
                    when TERM, INT
         | 
| 131 146 | 
             
                      @exit_loader = true
         | 
| 132 147 | 
             
                    end
         | 
| 133 148 | 
             
                  end
         | 
| 134 149 |  | 
| 135 150 | 
             
                  def debug_handler(signal)
         | 
| 136 | 
            -
                    log_data = { signal:, current_pid: ::Process.pid, loader_pid: @loader_pid,  | 
| 151 | 
            +
                    log_data = { signal:, current_pid: ::Process.pid, loader_pid: @loader_pid, sidekiq_pids: @sidekiq_pids,
         | 
| 137 152 | 
             
                                 reload_sidekiq: @reload_sidekiq, exit_loader: @exit_loader }
         | 
| 138 153 | 
             
                    puts "handle_signal called with #{log_data}"
         | 
| 139 154 | 
             
                  end
         | 
| 140 155 |  | 
| 141 | 
            -
                  def stop_sidekiq( | 
| 142 | 
            -
                     | 
| 156 | 
            +
                  def stop_sidekiq(pids)
         | 
| 157 | 
            +
                    pids.each do |pid|
         | 
| 158 | 
            +
                      ::Process.kill(TERM, pid)
         | 
| 159 | 
            +
                    end
         | 
| 160 | 
            +
                    @sidekiq_pids = []
         | 
| 143 161 | 
             
                  end
         | 
| 144 162 |  | 
| 145 | 
            -
                  def quiet_sidekiq( | 
| 146 | 
            -
                     | 
| 163 | 
            +
                  def quiet_sidekiq(pids)
         | 
| 164 | 
            +
                    pids.each do |pid|
         | 
| 165 | 
            +
                      ::Process.kill(TSTP, pid)
         | 
| 166 | 
            +
                    end
         | 
| 147 167 | 
             
                  end
         | 
| 148 168 |  | 
| 149 | 
            -
                  def  | 
| 150 | 
            -
                     | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 154 | 
            -
             | 
| 169 | 
            +
                  def running_pids(pids)
         | 
| 170 | 
            +
                    new_pids = []
         | 
| 171 | 
            +
                    pids.each do |pid|
         | 
| 172 | 
            +
                      new_pids << pid unless ::Process.waitpid(pid, ::Process::WNOHANG)
         | 
| 173 | 
            +
                    rescue Errno::ECHILD
         | 
| 174 | 
            +
                      log "PID #{pid} does not exist."
         | 
| 175 | 
            +
                    end
         | 
| 176 | 
            +
                    new_pids
         | 
| 155 177 | 
             
                  end
         | 
| 156 178 |  | 
| 157 179 | 
             
                  def log(message)
         | 
    
        data/sidekiq-redeploy.gemspec
    CHANGED
    
    | @@ -32,7 +32,7 @@ Gem::Specification.new do |spec| | |
| 32 32 | 
             
              spec.bindir        = 'bin'
         | 
| 33 33 | 
             
              spec.require_paths = ['lib']
         | 
| 34 34 |  | 
| 35 | 
            -
              spec.add_dependency 'puma-redeploy', '~> 0.3. | 
| 35 | 
            +
              spec.add_dependency 'puma-redeploy', '~> 0.3.4'
         | 
| 36 36 | 
             
              spec.add_dependency 'sidekiq', '>= 6', '< 8'
         | 
| 37 37 |  | 
| 38 38 | 
             
              spec.metadata['rubygems_mfa_required'] = 'true'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sidekiq-redeploy
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.10
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - tbeauvais
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2024-03-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: puma-redeploy
         | 
| @@ -16,14 +16,14 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: 0.3. | 
| 19 | 
            +
                    version: 0.3.4
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: 0.3. | 
| 26 | 
            +
                    version: 0.3.4
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: sidekiq
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         |