diff options
author | Christopher Baines <mail@cbaines.net> | 2018-02-18 11:23:41 +0000 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2018-03-29 07:41:09 +0100 |
commit | bc1ffc5214ab3f563b60523d9c349fab7974e634 (patch) | |
tree | 1caa1ed8bf2fb96c4d340aeffd53cd50a8799980 /app/jobs | |
parent | 700b8b0a112fa976b9850418a7f0c71d95b6dd79 (diff) | |
download | govuk-mini-environment-admin-bc1ffc5214ab3f563b60523d9c349fab7974e634.tar govuk-mini-environment-admin-bc1ffc5214ab3f563b60523d9c349fab7974e634.tar.gz |
Add some govuk-guix related jobs
And various other views and routes.
Diffstat (limited to 'app/jobs')
-rw-r--r-- | app/jobs/destroy_job.rb | 1 | ||||
-rw-r--r-- | app/jobs/govuk_guix/build_job.rb | 33 | ||||
-rw-r--r-- | app/jobs/govuk_guix/fetch_revision_job.rb | 49 | ||||
-rw-r--r-- | app/jobs/govuk_guix/job.rb | 24 | ||||
-rw-r--r-- | app/jobs/start_job.rb (renamed from app/jobs/setup_job.rb) | 6 |
5 files changed, 110 insertions, 3 deletions
diff --git a/app/jobs/destroy_job.rb b/app/jobs/destroy_job.rb index 7f13fdd..2bc72c1 100644 --- a/app/jobs/destroy_job.rb +++ b/app/jobs/destroy_job.rb @@ -12,6 +12,7 @@ class DestroyJob < TerraformJob aws_region: 'eu-west-1', slug: @mini_environment.name.parameterize, ssh_public_key: ssh_public_key, + start_command: @mini_environment.start_command }, force: true ) diff --git a/app/jobs/govuk_guix/build_job.rb b/app/jobs/govuk_guix/build_job.rb new file mode 100644 index 0000000..381a717 --- /dev/null +++ b/app/jobs/govuk_guix/build_job.rb @@ -0,0 +1,33 @@ +require 'ruby_terraform' +require 'open3' + +class GovukGuix::BuildJob < GovukGuix::Job + @retry_interval = 30 + + def run(mini_environment_id) + logger.info "GovukGuix::BuildJob: Building mini environment #{mini_environment_id}" + + mini_environment = MiniEnvironment.find(mini_environment_id) + + slug = mini_environment.name.parameterize + + command = [ + "#{mini_environment.govuk_guix_revision.store_path}/bin/govuk", + "system", + "build", + "--rails-environment=production", + "--app-domain=#{slug}.aws.cbaines.net", + "--web-domain=www.#{slug}.aws.cbaines.net", + "--use-high-ports=false", + "--use-https=certbot", + "--fallback", + ] + + run_command(command) do |output| + store_path = output.last.strip + logger.debug("GovukGuix::BuildJob: start_command: #{store_path}") + + mini_environment.update(start_command: store_path) + end + end +end diff --git a/app/jobs/govuk_guix/fetch_revision_job.rb b/app/jobs/govuk_guix/fetch_revision_job.rb new file mode 100644 index 0000000..b1cb171 --- /dev/null +++ b/app/jobs/govuk_guix/fetch_revision_job.rb @@ -0,0 +1,49 @@ +require 'ruby_terraform' +require 'git' +require 'open3' + +class GovukGuix::FetchRevisionJob < GovukGuix::Job + @retry_interval = 30 + + def run(commit_hash) + repository.fetch + + repository.checkout(commit_hash) + + command = [ + "#{repository_directory}/guix-pre-inst-env", + "guix", + "build", + "-e", + "(begin (use-modules (gds packages govuk)) (current-govuk-guix))" + ] + + run_command(command) do |output| + store_path = output.last.strip + logger.debug("FetchRevisionJob: store_path: #{store_path}") + + GovukGuix::Revision.create( + commit_hash: commit_hash, + store_path: store_path + ) + end + end + + def repository + @_repository ||= begin + if File.exists? repository_directory + Git.open(repository_directory, :log => Rails.logger) + else + Git.clone(repository_remote_location, repository_directory) + end + end + end + + def repository_directory + 'tmp/cache/govuk-guix' + end + + def repository_remote_location + 'git@git.cbaines.net:gds/govuk-guix' + end +end diff --git a/app/jobs/govuk_guix/job.rb b/app/jobs/govuk_guix/job.rb new file mode 100644 index 0000000..0161cb1 --- /dev/null +++ b/app/jobs/govuk_guix/job.rb @@ -0,0 +1,24 @@ +class GovukGuix::Job < Que::Job + def run_command(command) + logger.debug("#{self.class}: Running command #{command}") + + Open3.popen2e(*command) do |stdin, stdout_and_stderr, wait_thr| + logger.info("#{self.class}: commmand running, pid #{wait_thr.pid}") + + output = [] + stdout_and_stderr.each_line do |line| + logger.debug("#{self.class}: #{line}") + output << line + end + + exit_status = wait_thr.value + unless exit_status == 0 + logger.error("#{self.class}: failed, exit status #{exit_status}") + + raise "#{output.join}\n" + end + + yield(output) + end + end +end diff --git a/app/jobs/setup_job.rb b/app/jobs/start_job.rb index 6791dd6..ec17732 100644 --- a/app/jobs/setup_job.rb +++ b/app/jobs/start_job.rb @@ -1,10 +1,10 @@ require 'ruby_terraform' -class SetupJob < TerraformJob +class StartJob < TerraformJob @retry_interval = 30 def run_terraform - puts "Setting up #{@mini_environment.name}" + logger.info "Setting up #{@mini_environment.name}" Dir.chdir('terraform/aws') do RubyTerraform.init( @@ -15,11 +15,11 @@ class SetupJob < TerraformJob ) RubyTerraform.apply( - directory: 'mini_environment', vars: { aws_region: 'eu-west-1', slug: @mini_environment.name.parameterize, ssh_public_key: ssh_public_key, + start_command: @mini_environment.start_command }, auto_approve: true ) |