aboutsummaryrefslogtreecommitdiff
path: root/app/jobs/govuk_guix
diff options
context:
space:
mode:
Diffstat (limited to 'app/jobs/govuk_guix')
-rw-r--r--app/jobs/govuk_guix/build_job.rb33
-rw-r--r--app/jobs/govuk_guix/fetch_revision_job.rb49
-rw-r--r--app/jobs/govuk_guix/job.rb24
3 files changed, 106 insertions, 0 deletions
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