dora_web_upgrader 1.0.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +110 -0
- data/Rakefile +18 -0
- data/app/assets/config/haver_web_upgrader_manifest.js +1 -0
- data/app/assets/stylesheets/haver_web_upgrader/application.css +15 -0
- data/app/controllers/dora_web_upgrader/application_controller.rb +4 -0
- data/app/controllers/dora_web_upgrader/upgrade_controller.rb +24 -0
- data/app/jobs/dora_web_upgrader/application_job.rb +4 -0
- data/app/jobs/dora_web_upgrader/upgrade_job.rb +23 -0
- data/app/mailers/dora_web_upgrader/application_mailer.rb +10 -0
- data/app/mailers/dora_web_upgrader/upgrade_mailer.rb +31 -0
- data/app/views/dora_web_upgrader/upgrade_mailer/upgrade_performed.text.erb +5 -0
- data/app/views/dora_web_upgrader/upgrade_mailer/upgrade_started.text.erb +7 -0
- data/app/views/layouts/mail.text.erb +5 -0
- data/config/initializers/dora_web_upgrader.rb +18 -0
- data/config/routes.rb +5 -0
- data/lib/dora_web_upgrader.rb +18 -0
- data/lib/dora_web_upgrader/configuration.rb +5 -0
- data/lib/dora_web_upgrader/engine.rb +5 -0
- data/lib/dora_web_upgrader/version.rb +5 -0
- data/lib/generators/dora_web_upgrader/install_generator.rb +14 -0
- data/lib/generators/dora_web_upgrader/templates/config/initializers/dora_web_upgrader.rb +18 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e791400a872e203332bc43b8774a627e8fa0cba69c80d3e88362eb71e3ba0a94
|
4
|
+
data.tar.gz: b389c54da5b3a731f8130c93b0914032e0cf72ef302356ff0b3952cc0febd028
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 19e8ee7bc819aec30175b86872dcf0a38382d02893cb866129e2207f2b61fc9b47a37c43c929c1e359296e57b4c7b2f9215b1c9206edad906d85fed6d6f7b1c2
|
7
|
+
data.tar.gz: 7c141b2c5401c4cd108fe32c8e8a70734e0e7af5a4bcf67cd30839fe004efc05e39e82e2f23bf881c62621bcc3991ce487c4b78ec529b172fd074f206290d627
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2021
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# Dora Web Upgrader
|
2
|
+
|
3
|
+
**Dora Web Upgrader is a [Rails] [engine] that facilitates upgrading a
|
4
|
+
[dora]-powered Rails application via webhooks.**
|
5
|
+
|
6
|
+
[dora], short for *Do*cker container for *Ra*ils applications, is my
|
7
|
+
collection of utilities that I use to containerize my Rails applications.
|
8
|
+
|
9
|
+
I use web hooks to trigger upgrades from within the container whenever I push
|
10
|
+
code to the main branch. When this engine receives a `POST` request, it will
|
11
|
+
execute dora's `upgrade-app.sh` script if the request contains a pre-configured
|
12
|
+
secret value. It sends an e-mail notification when the request has been received,
|
13
|
+
and another one when the upgrade process has finished.
|
14
|
+
|
15
|
+
If the `POST` request does not contain the correct secret, a notification
|
16
|
+
e-mail is also send, but no further action is triggered.
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Add this line to your application's Gemfile:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
gem 'dora_web_upgrader', github: 'bovender/dora_web_upgrader', branch: 'main'
|
24
|
+
```
|
25
|
+
|
26
|
+
And then execute:
|
27
|
+
|
28
|
+
```bash
|
29
|
+
bundle
|
30
|
+
```
|
31
|
+
|
32
|
+
Mount the engine onto your Rails application:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
# config/routes.rb
|
36
|
+
Rails.application.routes.draw do
|
37
|
+
mount DoraWebUpgrader::Engine, at: '/dora_web_upgrader'
|
38
|
+
# ...
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
Generate an initializer:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
bin/rails generate dora_web_upgrader:install
|
46
|
+
```
|
47
|
+
|
48
|
+
And customize the resulting `config/initializers/dora_web_upgrader.rb`.
|
49
|
+
|
50
|
+
To avoid committing the Webhook secret in plain text to source control, the
|
51
|
+
default secret is read from the environment variable `$DORA_WEB_UPGRADER_SECRET`.
|
52
|
+
Of course you may also choose another means to store and retrieve the secret,
|
53
|
+
but make sure not to accidentally publish it.
|
54
|
+
|
55
|
+
## Usage
|
56
|
+
|
57
|
+
To make use of the engine, you must configure a Webhook in your Git repository
|
58
|
+
host (e.g., [GitHub] or [Gitea]) to issue a `POST` request to
|
59
|
+
`https://my_app.example.com/dora_web_upgrader/upgrade` with JSON data containing
|
60
|
+
the secret from the initializer file.
|
61
|
+
|
62
|
+
(If you mounted the engine at a different path, replace `dora_web_upgrader` in
|
63
|
+
the URL with that path.)
|
64
|
+
|
65
|
+
If everything is configured correctly, the upgrade process will start and finish
|
66
|
+
automagically. You should receive two e-mails. If you don't, double-check that
|
67
|
+
your mail server allows sending from and to the configured e-mail addresses.
|
68
|
+
|
69
|
+
## Development
|
70
|
+
|
71
|
+
To run tests, install [Docker] and [Docker Compose]. Clone DoraWebUpgrader and
|
72
|
+
[dora] into the same parent directory. Start up the container(s), execute `bash`
|
73
|
+
in the Rails container and run the tests like so:
|
74
|
+
|
75
|
+
```bash
|
76
|
+
$ cd dora_web_upgrader/
|
77
|
+
$ docker-compose -f ../dora/docker-compose.yml up -d
|
78
|
+
Creating network "dora_default" with the default driver
|
79
|
+
Creating dora_selenium_1 ... done
|
80
|
+
Creating dora_db_1 ... done
|
81
|
+
Creating dora_redis_1 ... done
|
82
|
+
Creating dora_mailhog_1 ... done
|
83
|
+
Creating dora_rails_1 ... done
|
84
|
+
Creating dora_adminer_1 ... done
|
85
|
+
$ docker-compose -f ../dora/docker-compose.yml exec rails bash
|
86
|
+
[dora_web_upgrader development]root@459cb7dc2277:/home/dora/rails$ bin/rails test
|
87
|
+
Run options: --seed 41689
|
88
|
+
|
89
|
+
# Running:
|
90
|
+
|
91
|
+
......
|
92
|
+
|
93
|
+
Finished in 0.180743s, 33.1962 runs/s, 94.0560 assertions/s.
|
94
|
+
6 runs, 17 assertions, 0 failures, 0 errors, 0 skips
|
95
|
+
```
|
96
|
+
|
97
|
+
(There are several containers included in the `docker-compose.yml` file that
|
98
|
+
are not needed to test DoraWebUpgrader, but are part of [dora].)
|
99
|
+
|
100
|
+
## License
|
101
|
+
|
102
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
103
|
+
|
104
|
+
[docker]: https://docs.docker.com/engine/install/ubuntu/
|
105
|
+
[docker compose]: https://docs.docker.com/compose/install/
|
106
|
+
[dora]: https://github.com/bovender/dora
|
107
|
+
[engine]: https://guides.rubyonrails.org/engines.html
|
108
|
+
[gitea]: https://gitea.io
|
109
|
+
[github]: https://github.com
|
110
|
+
[Rails]: https://rubyonrails.org
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
|
3
|
+
APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
|
4
|
+
load "rails/tasks/engine.rake"
|
5
|
+
|
6
|
+
load "rails/tasks/statistics.rake"
|
7
|
+
|
8
|
+
require "bundler/gem_tasks"
|
9
|
+
|
10
|
+
require "rake/testtask"
|
11
|
+
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.libs << 'test'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = false
|
16
|
+
end
|
17
|
+
|
18
|
+
task default: :test
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_directory ../stylesheets/dora_web_upgrader .css
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DoraWebUpgrader
|
4
|
+
class UpgradeController < ApplicationController
|
5
|
+
layout false
|
6
|
+
|
7
|
+
def upgrade
|
8
|
+
secret = DoraWebUpgrader.config.secret
|
9
|
+
raise 'DoraWebUpgrader.secret is not configured!' if secret.blank?
|
10
|
+
|
11
|
+
@payload = JSON.parse(request.raw_post)
|
12
|
+
if @payload['secret'] == secret
|
13
|
+
@message = 'ok'
|
14
|
+
UpgradeJob.perform_later
|
15
|
+
else
|
16
|
+
@message = 'invalid secret'
|
17
|
+
end
|
18
|
+
|
19
|
+
UpgradeMailer.upgrade_started(@message, @payload).deliver_later
|
20
|
+
|
21
|
+
render json: { message: @message }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DoraWebUpgrader
|
4
|
+
class UpgradeJob < ApplicationJob
|
5
|
+
queue_as :default
|
6
|
+
|
7
|
+
def perform(*)
|
8
|
+
# Do not upgrade developement environemnts as this might inadvertently
|
9
|
+
# overwrite uncommitted changes.
|
10
|
+
if %w[production staging].include? Rails.env
|
11
|
+
logger.warn '******** PERFORMING APPLICATION UPGRADE ********'
|
12
|
+
output = `/usr/local/bin/upgrade-app.sh 2>&1`
|
13
|
+
logger.warn output
|
14
|
+
result = $CHILD_STATUS.exitstatus
|
15
|
+
else
|
16
|
+
output = "Rails environment: #{Rails.env} -- not upgrading..."
|
17
|
+
logger.warn output
|
18
|
+
result = -1
|
19
|
+
end
|
20
|
+
UpgradeMailer.upgrade_performed(output, result).deliver_now
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DoraWebUpgrader
|
4
|
+
class ApplicationMailer < ActionMailer::Base
|
5
|
+
layout 'mail'
|
6
|
+
default from: DoraWebUpgrader.config.email_notifications_from,
|
7
|
+
to: DoraWebUpgrader.config.email_notifications_to,
|
8
|
+
x_mailer: "DoraWebUpgrader #{VERSION}"
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DoraWebUpgrader
|
4
|
+
class UpgradeMailer < ApplicationMailer
|
5
|
+
def upgrade_started(message, payload)
|
6
|
+
@message = message
|
7
|
+
@payload = payload
|
8
|
+
@payload[:secret] = '(REDACTED)' if @payload[:secret]
|
9
|
+
mail subject: "[#{app_identifier} #{Rails.env}] upgrade started"
|
10
|
+
end
|
11
|
+
|
12
|
+
def upgrade_performed(output, result)
|
13
|
+
@output = output
|
14
|
+
s = case result
|
15
|
+
when -1
|
16
|
+
'dry run'
|
17
|
+
when 0
|
18
|
+
'succeeded'
|
19
|
+
else
|
20
|
+
'failed'
|
21
|
+
end
|
22
|
+
mail subject: "[#{app_identifier} #{Rails.env}] upgrade #{s}"
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def app_identifier
|
28
|
+
::Rails.application.class.module_parent
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Configure DoraWebUpgrader <https://github.com/bovender/DoraWebUpgrader>
|
4
|
+
DoraWebUpgrader.configure do |config|
|
5
|
+
# Sender address for upgrade notifications.
|
6
|
+
# Make sure that this is a valid address that is accepted by the mail server
|
7
|
+
# that is configured for the current application.
|
8
|
+
config.email_notifications_from = 'webmaster'
|
9
|
+
|
10
|
+
# Recipient address for upgrade notifications.
|
11
|
+
# Make sure that this is a valid address that is accepted by the mail server
|
12
|
+
# that is configured for the current application.
|
13
|
+
config.email_notifications_to = 'webmaster'
|
14
|
+
|
15
|
+
# A secret string that must be included in the POST request to the API
|
16
|
+
# endpoint. If this is an empty string, the upgrader will raise an error.
|
17
|
+
config.secret = ENV['DORA_WEB_UPGRADER_SECRET']
|
18
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dora_web_upgrader/version'
|
4
|
+
require 'dora_web_upgrader/engine'
|
5
|
+
require 'dora_web_upgrader/configuration'
|
6
|
+
|
7
|
+
module DoraWebUpgrader
|
8
|
+
mattr_accessor :secret
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_reader :config
|
12
|
+
|
13
|
+
def configure
|
14
|
+
@config = Configuration.new
|
15
|
+
yield config
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DoraWebUpgrader
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
desc 'Install DoraWebUpgrader sample configuration'
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
|
9
|
+
def copy_config
|
10
|
+
template 'config/initializers/dora_web_upgrader.rb'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Configure DoraWebUpgrader <https://github.com/bovender/DoraWebUpgrader>
|
4
|
+
DoraWebUpgrader.configure do |config|
|
5
|
+
# Sender address for upgrade notifications.
|
6
|
+
# Make sure that this is a valid address that is accepted by the mail server
|
7
|
+
# that is configured for the current application.
|
8
|
+
config.email_notifications_from = 'webmaster'
|
9
|
+
|
10
|
+
# Recipient address for upgrade notifications.
|
11
|
+
# Make sure that this is a valid address that is accepted by the mail server
|
12
|
+
# that is configured for the current application.
|
13
|
+
config.email_notifications_to = 'webmaster'
|
14
|
+
|
15
|
+
# A secret string that must be included in the POST request to the API
|
16
|
+
# endpoint. If this is an empty string, the upgrader will raise an error.
|
17
|
+
config.secret = ENV['DORA_WEB_UPGRADER_SECRET']
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dora_web_upgrader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Kraus
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-05-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
description: Make use of web hooks that are triggered by pushing codeto a repository
|
28
|
+
and have your application taking care ofupgrading itself.
|
29
|
+
email: bovender@bovender.de
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- MIT-LICENSE
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- app/assets/config/haver_web_upgrader_manifest.js
|
38
|
+
- app/assets/stylesheets/haver_web_upgrader/application.css
|
39
|
+
- app/controllers/dora_web_upgrader/application_controller.rb
|
40
|
+
- app/controllers/dora_web_upgrader/upgrade_controller.rb
|
41
|
+
- app/jobs/dora_web_upgrader/application_job.rb
|
42
|
+
- app/jobs/dora_web_upgrader/upgrade_job.rb
|
43
|
+
- app/mailers/dora_web_upgrader/application_mailer.rb
|
44
|
+
- app/mailers/dora_web_upgrader/upgrade_mailer.rb
|
45
|
+
- app/views/dora_web_upgrader/upgrade_mailer/upgrade_performed.text.erb
|
46
|
+
- app/views/dora_web_upgrader/upgrade_mailer/upgrade_started.text.erb
|
47
|
+
- app/views/layouts/mail.text.erb
|
48
|
+
- config/initializers/dora_web_upgrader.rb
|
49
|
+
- config/routes.rb
|
50
|
+
- lib/dora_web_upgrader.rb
|
51
|
+
- lib/dora_web_upgrader/configuration.rb
|
52
|
+
- lib/dora_web_upgrader/engine.rb
|
53
|
+
- lib/dora_web_upgrader/version.rb
|
54
|
+
- lib/generators/dora_web_upgrader/install_generator.rb
|
55
|
+
- lib/generators/dora_web_upgrader/templates/config/initializers/dora_web_upgrader.rb
|
56
|
+
homepage: https://gibhub.com/bovender/dora_web_upgrader
|
57
|
+
licenses:
|
58
|
+
- MIT
|
59
|
+
metadata:
|
60
|
+
allowed_push_host: https://rubygems.org
|
61
|
+
homepage_uri: https://gibhub.com/bovender/dora_web_upgrader
|
62
|
+
source_code_uri: https://gibhub.com/bovender/dora_web_upgrader
|
63
|
+
changelog_uri: https://gibhub.com/bovender/dora_web_upgrader/blob/main/CHANGELOG.md
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '2.6'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubygems_version: 3.1.2
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Dora Web Upgrader is a Rails engine that facilitates upgrading a dora-powered
|
83
|
+
Rails application via webhooks.
|
84
|
+
test_files: []
|