From dea294c9caedda0d9c91e859c96f09a53b3ba96c Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 11 Oct 2021 15:51:31 +0200 Subject: [PATCH 01/63] update from base --- CHANGELOG.md | 3 +++ data/update_script.sh.erb | 23 +++++++++++++++++++---- lib/pull_preview/instance.rb | 16 +++++++++++++++- lib/pull_preview/up.rb | 2 +- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be87a26..98e93d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## master +* Add optional `PULLPREVIEW_SNAPSHOT_NAME` environment variable, which can be used to restore from a specific snapshot name rather than a snapshot for a specific instance name. +* Add optional `PULLPREVIEW_ENV_VARS` environment variable, which can be passed through, to set any environment variables during launch/update. +* Add optional `PULLPREVIEW_LAUNCH_COMMAND` environment variable, which can be passed through, to replace docker-compose launch/update commands. * Properly handle `repository_dispatch` events. * Add support for private registries, e.g. `registries: docker://${{ secrets.GHCR_PAT }}@ghcr.io` in workflow file. diff --git a/data/update_script.sh.erb b/data/update_script.sh.erb index 6c3c5cb..3979c44 100644 --- a/data/update_script.sh.erb +++ b/data/update_script.sh.erb @@ -5,6 +5,8 @@ set -o pipefail APP_TARBALL="$1" APP_PATH="<%= locals.remote_app_path %>" +PULLPREVIEW_LAUNCH_COMMAND="<%= locals.custom_launch_command %>" +PULLPREVIEW_ENV_VARS="<%= locals.custom_env_vars %>" PULLPREVIEW_ENV_FILE="/etc/pullpreview/env" lock_file="/tmp/update.lock" @@ -51,16 +53,24 @@ echo 'PULLPREVIEW_PUBLIC_IP=<%= locals.public_ip %>' >> $PULLPREVIEW_ENV_FILE echo 'PULLPREVIEW_URL=<%= locals.url %>' >> $PULLPREVIEW_ENV_FILE echo "PULLPREVIEW_FIRST_RUN=$PULLPREVIEW_FIRST_RUN" >> $PULLPREVIEW_ENV_FILE +if [ -n "${PULLPREVIEW_ENV_VARS}" ] ; then +while read -d, -r pair; do + IFS='=' read -r key val <<<"$pair" + echo "$key=$val" >> $PULLPREVIEW_ENV_FILE +done <<<"$PULLPREVIEW_ENV_VARS," +fi + set -o allexport source $PULLPREVIEW_ENV_FILE set +o allexport cd / -sudo rm -rf "$APP_PATH" -sudo mkdir -p "$APP_PATH" -sudo chown -R ec2-user.ec2-user "$APP_PATH" -tar xzf "$1" -C "$APP_PATH" +sudo rm -rf "/tmp$APP_PATH" +sudo mkdir -p "$APP_PATH" "/tmp$APP_PATH" +sudo chown -R ec2-user.ec2-user "$APP_PATH" "/tmp$APP_PATH" +tar xzf "$1" -C "/tmp$APP_PATH" +rsync -auz "/tmp$APP_PATH" / --remove-source-files --delete cd "$APP_PATH" @@ -69,6 +79,11 @@ if ! /tmp/pre_script.sh ; then exit 1 fi +if [ -n "${PULLPREVIEW_LAUNCH_COMMAND}" ] ; then + echo "Command to be executed: $PULLPREVIEW_LAUNCH_COMMAND" + bash -c "$PULLPREVIEW_LAUNCH_COMMAND" ; exit $? +fi + pull() { docker-compose <%= locals.compose_files.map{|f| ["-f", f.inspect]}.flatten.join(" ") %> pull -q } diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 128f2dd..9e70c92 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -111,7 +111,7 @@ def launch(az, bundle_id, blueprint_id, tags = {}) def latest_snapshot @latest_snapshot ||= client.get_instance_snapshots.instance_snapshots.sort{|a,b| b.created_at <=> a.created_at}.find do |snap| - snap.state == "available" && snap.from_instance_name == name + snap.state == "available" && (snap.name == snapshot_name || snap.from_instance_name == name) end end @@ -132,9 +132,23 @@ def erb_locals public_dns: public_dns, admins: admins, url: url, + custom_launch_command: custom_launch_command, + custom_env_vars: custom_env_vars ) end + def custom_launch_command + ENV.fetch("PULLPREVIEW_LAUNCH_COMMAND", "") + end + + def custom_env_vars + ENV.fetch("PULLPREVIEW_ENV_VARS", "") + end + + def snapshot_name + ENV.fetch("PULLPREVIEW_SNAPSHOT_NAME", "") + end + def github_token ENV.fetch("GITHUB_TOKEN", "") end diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 8ed75e8..06a9754 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -21,7 +21,7 @@ def self.run(app_path, opts) instance_name = opts[:name] PullPreview.logger.info "Taring up repository at #{app_path.inspect}..." - unless system("tar czf /tmp/app.tar.gz --exclude .git -C '#{app_path}' .") + unless system("tar cf /tmp/app.tar.gz --use-compress-program='pigz -k -9' --exclude=.git --exclude-from=.dockerignore -C '#{app_path}' .") exit 1 end From 1579d20303b4a2463cf2f11a1c3bcd14e0ec1129 Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 11 Oct 2021 15:51:49 +0200 Subject: [PATCH 02/63] remove swapping, shrink /dev/shm --- lib/pull_preview/instance.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 9e70c92..390c630 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -91,10 +91,7 @@ def launch(az, bundle_id, blueprint_id, tags = {}) %{echo '#{ssh_public_keys.join("\n")}' > /home/ec2-user/.ssh/authorized_keys}, "mkdir -p #{REMOTE_APP_PATH} && chown -R ec2-user.ec2-user #{REMOTE_APP_PATH}", "echo 'cd #{REMOTE_APP_PATH}' > /etc/profile.d/pullpreview.sh", - "fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile", - "echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab", - "sysctl vm.swappiness=10 && sysctl vm.vfs_cache_pressure=50", - "echo 'vm.swappiness=10' | tee -a /etc/sysctl.conf", + "sudo sed -i '/^tmpfs/c\tmpfs \/dev\/shm tmpfs defaults,size=256M 0 0' /etc/fstab", "echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf", "yum install -y docker", %{curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose}, From 10e15fe6a306552b6e8ca93e7567a1a221957c2f Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:12:30 +0200 Subject: [PATCH 03/63] refactor provisioning --- lib/pull_preview/instance.rb | 90 ++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 390c630..61b39bb 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -12,12 +12,51 @@ class Instance attr_reader :subdomain attr_reader :ports attr_reader :registries + attr_reader :ip_prefix + attr_reader :swap_enabled; alias_method :swap_enabled?, :swap_enabled class << self attr_accessor :client attr_accessor :logger end + class Provisioner + class << self + def ssh_access(ssh_public_keys) + %{echo '#{ssh_public_keys.join("\n")}' > /home/ec2-user/.ssh/authorized_keys} + end + + def prepare_user(remote_app_path) + [ + "mkdir -p #{remote_app_path} && chown -R ec2-user.ec2-user #{remote_app_path}", + "echo 'cd #{remote_app_path}' > /etc/profile.d/pullpreview.sh" + ] + end + + def setup_swapping + [ + "sudo sed -i '/^tmpfs/c\tmpfs \/dev\/shm tmpfs defaults,size=256M 0 0' /etc/fstab", + "echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf" + ] + end + + def install_and_setup_docker + [ + "yum install -y docker", + %{curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose}, + "chmod +x /usr/local/bin/docker-compose", + "usermod -aG docker ec2-user", + "service docker start", + "echo 'docker image prune -a --filter=\"until=96h\" --force' > /etc/cron.daily/docker-prune && chmod a+x /etc/cron.daily/docker-prune" + ] + end + + def finish_setup + "mkdir -p /etc/pullpreview && touch /etc/pullpreview/ready && chown -R ec2-user:ec2-user /etc/pullpreview" + end + end + end + def self.normalize_name(name) name. gsub(/[^a-z0-9]/i, "-"). @@ -36,7 +75,9 @@ def initialize(name, opts = {}) @compose_files = opts[:compose_files] || ["docker-compose.yml"] @registries = opts[:registries] || [] @dns = opts[:dns] + @ip_prefix = opts[:ip_prefix] || "ip" @ssh_results = [] + @swap_enabled = !opts[:disable_swap] end def remote_app_path @@ -78,34 +119,35 @@ def launch(az, bundle_id, blueprint_id, tags = {}) if latest_snapshot logger.info "Found snapshot to restore from: #{latest_snapshot.name}" logger.info "Creating new instance name=#{name}..." - client.create_instances_from_snapshot(params.merge({ - user_data: [ - "service docker restart" - ].join(" && "), - instance_snapshot_name: latest_snapshot.name, - })) + client.create_instances_from_snapshot(params.merge( + user_data: init_from_snapshot_command, + instance_snapshot_name: latest_snapshot.name + )) else logger.info "Creating new instance name=#{name}..." - client.create_instances(params.merge({ - user_data: [ - %{echo '#{ssh_public_keys.join("\n")}' > /home/ec2-user/.ssh/authorized_keys}, - "mkdir -p #{REMOTE_APP_PATH} && chown -R ec2-user.ec2-user #{REMOTE_APP_PATH}", - "echo 'cd #{REMOTE_APP_PATH}' > /etc/profile.d/pullpreview.sh", - "sudo sed -i '/^tmpfs/c\tmpfs \/dev\/shm tmpfs defaults,size=256M 0 0' /etc/fstab", - "echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf", - "yum install -y docker", - %{curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose}, - "chmod +x /usr/local/bin/docker-compose", - "usermod -aG docker ec2-user", - "service docker start", - "echo 'docker image prune -a --filter=\"until=96h\" --force' > /etc/cron.daily/docker-prune && chmod a+x /etc/cron.daily/docker-prune", - "mkdir -p /etc/pullpreview && touch /etc/pullpreview/ready && chown -R ec2-user:ec2-user /etc/pullpreview", - ].join(" && "), + client.create_instances(params.merge( + user_data: setup_command, blueprint_id: blueprint_id - })) + )) end end + def init_from_snapshot_command + [ + "service docker restart" + ].join(" && ") + end + + def setup_command + [ + Provisioner.ssh_access(ssh_public_keys), + Provisioner.prepare_user(REMOTE_APP_PATH), + swap_enabled? ? Provisioner.setup_swapping : nil, + Provisioner.install_and_setup_docker, + Provisioner.finish_setup + ].flatten.reject(&:empty?).join(" && ") + end + def latest_snapshot @latest_snapshot ||= client.get_instance_snapshots.instance_snapshots.sort{|a,b| b.created_at <=> a.created_at}.find do |snap| snap.state == "available" && (snap.name == snapshot_name || snap.from_instance_name == name) @@ -296,9 +338,9 @@ def public_ip def public_dns # https://community.letsencrypt.org/t/a-certificate-for-a-63-character-domain/78870/4 - remaining_chars_for_subdomain = 62 - dns.size - public_ip.size - "ip".size - ("." * 3).size + remaining_chars_for_subdomain = 62 - dns.size - public_ip.size - ip_prefix.size - ("." * 3).size [ - [subdomain[0..remaining_chars_for_subdomain], "ip", public_ip.gsub(".", "-")].join("-"), + [subdomain[0..remaining_chars_for_subdomain], ip_prefix, public_ip.gsub(".", "-")].compact.join("-"), dns ].join(".") end From 3651b58696d68fe01d8d0b7ae0170eec4a6d1a86 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:15:27 +0200 Subject: [PATCH 04/63] update compose --- lib/pull_preview/instance.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 61b39bb..39c2a17 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -21,6 +21,8 @@ class << self end class Provisioner + COMPOSE_VERSION = "1.29.2".freeze + class << self def ssh_access(ssh_public_keys) %{echo '#{ssh_public_keys.join("\n")}' > /home/ec2-user/.ssh/authorized_keys} @@ -43,7 +45,7 @@ def setup_swapping def install_and_setup_docker [ "yum install -y docker", - %{curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose}, + %{curl -L "https://github.com/docker/compose/releases/download/#{COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose}, "chmod +x /usr/local/bin/docker-compose", "usermod -aG docker ec2-user", "service docker start", From 8ebf31db1039a6f728e3f91984d498509a35bab2 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:16:44 +0200 Subject: [PATCH 05/63] cop fix --- lib/pull_preview/instance.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 39c2a17..7a91cb7 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -13,7 +13,8 @@ class Instance attr_reader :ports attr_reader :registries attr_reader :ip_prefix - attr_reader :swap_enabled; alias_method :swap_enabled?, :swap_enabled + attr_reader :swap_enabled + alias :swap_enabled? :swap_enabled class << self attr_accessor :client From 6c1260583013d9eeb03560b3c70f1519d16276c6 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:28:48 +0200 Subject: [PATCH 06/63] minor fixes --- lib/pull_preview/instance.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 7a91cb7..23282d3 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -14,7 +14,7 @@ class Instance attr_reader :registries attr_reader :ip_prefix attr_reader :swap_enabled - alias :swap_enabled? :swap_enabled + alias swap_enabled? swap_enabled class << self attr_accessor :client @@ -78,7 +78,7 @@ def initialize(name, opts = {}) @compose_files = opts[:compose_files] || ["docker-compose.yml"] @registries = opts[:registries] || [] @dns = opts[:dns] - @ip_prefix = opts[:ip_prefix] || "ip" + @ip_prefix = opts.key?(:ip_prefix) ? opts[:ip_prefix] : "ip" @ssh_results = [] @swap_enabled = !opts[:disable_swap] end @@ -341,7 +341,7 @@ def public_ip def public_dns # https://community.letsencrypt.org/t/a-certificate-for-a-63-character-domain/78870/4 - remaining_chars_for_subdomain = 62 - dns.size - public_ip.size - ip_prefix.size - ("." * 3).size + remaining_chars_for_subdomain = 62 - dns.size - public_ip.size - (ip_prefix&.size || 0) - ("." * 3).size [ [subdomain[0..remaining_chars_for_subdomain], ip_prefix, public_ip.gsub(".", "-")].compact.join("-"), dns From 666bd1f2ad81448bd177d04561126cf481460691 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:34:03 +0200 Subject: [PATCH 07/63] update pry --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8c9f6f4..2a763e4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,7 +15,7 @@ GEM aws-sigv4 (~> 1.1) aws-sigv4 (1.1.3) aws-eventstream (~> 1.0, >= 1.0.2) - coderay (1.1.2) + coderay (1.1.3) faraday (1.0.1) multipart-post (>= 1.2, < 3) jmespath (1.4.0) @@ -24,7 +24,7 @@ GEM octokit (4.18.0) faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) - pry (0.13.1) + pry (0.14.1) coderay (~> 1.1) method_source (~> 1.0) public_suffix (4.0.4) From a68764cee1be0707c97d63cfcce6c0fa3a7f4aed Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:49:37 +0200 Subject: [PATCH 08/63] add gemspec --- pullpreview.gemspec | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pullpreview.gemspec diff --git a/pullpreview.gemspec b/pullpreview.gemspec new file mode 100644 index 0000000..c66fff1 --- /dev/null +++ b/pullpreview.gemspec @@ -0,0 +1,14 @@ +Gem::Specification.new do |s| + s.name = 'pullpreview' + s.version = '0.0.1' + s.default_executable = 'pullpreview' + + s.authors = ['Cyril Rohr', 'Manuel Fittko'] + s.date = '2021-10-19' + s.description = '1-click preview environments for GitHub repositories.' + s.email = 'info@mfittko.com' + s.files = ['lib/pull_preview.rb', 'bin/pullpreview'] + s.homepage = 'https://pullpreview.com/' + s.require_paths = ['lib'] + s.summary = 'pullpreview!' +end From 65efb5070ed417aa8295a073720806f78ec15faf Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 11:54:45 +0200 Subject: [PATCH 09/63] fix deprecation --- pullpreview.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index c66fff1..4f613d4 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -1,7 +1,6 @@ Gem::Specification.new do |s| s.name = 'pullpreview' s.version = '0.0.1' - s.default_executable = 'pullpreview' s.authors = ['Cyril Rohr', 'Manuel Fittko'] s.date = '2021-10-19' From 4a346a2281e0a2106165388bcf541599eb3480f3 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:06:07 +0200 Subject: [PATCH 10/63] update gemspec --- pullpreview.gemspec | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 4f613d4..5c71202 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -1,13 +1,19 @@ -Gem::Specification.new do |s| - s.name = 'pullpreview' - s.version = '0.0.1' +Gem::Specification.new do |spec| + spec.name = 'pullpreview' + spec.version = '0.0.1' - s.authors = ['Cyril Rohr', 'Manuel Fittko'] - s.date = '2021-10-19' - s.description = '1-click preview environments for GitHub repositories.' - s.email = 'info@mfittko.com' - s.files = ['lib/pull_preview.rb', 'bin/pullpreview'] - s.homepage = 'https://pullpreview.com/' - s.require_paths = ['lib'] - s.summary = 'pullpreview!' + spec.authors = ['Cyril Rohr', 'Manuel Fittko'] + spec.date = '2021-10-19' + spec.description = '1-click preview environments for GitHub repositoriespec.' + spec.email = 'info@mfittko.com' + spec.files = Dir['lib/**/*'] + spec.executables = ['pullpreview'] + spec.homepage = 'https://pullpreview.com/' + spec.require_paths = ['lib'] + spec.summary = 'pullpreview!' + spec.required_ruby_version = '>= 2.4.0' + spec.add_dependency 'aws-sdk-lightsail', '~> 1.30' + spec.add_dependency 'slop', '~> 4.8' + spec.add_dependency 'octokit', '~> 4.18' + spec.add_dependency 'terminal-table', '~> 1.8' end From 96b8eca3809cf6dbb82d632664b3f2bd47c1ee0f Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:34:00 +0200 Subject: [PATCH 11/63] update gemspec --- pullpreview.gemspec | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 5c71202..2be7f7f 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -1,19 +1,18 @@ Gem::Specification.new do |spec| - spec.name = 'pullpreview' - spec.version = '0.0.1' + spec.name = "pullpreview" + spec.version = "0.0.1" - spec.authors = ['Cyril Rohr', 'Manuel Fittko'] - spec.date = '2021-10-19' - spec.description = '1-click preview environments for GitHub repositoriespec.' - spec.email = 'info@mfittko.com' - spec.files = Dir['lib/**/*'] - spec.executables = ['pullpreview'] - spec.homepage = 'https://pullpreview.com/' - spec.require_paths = ['lib'] - spec.summary = 'pullpreview!' - spec.required_ruby_version = '>= 2.4.0' - spec.add_dependency 'aws-sdk-lightsail', '~> 1.30' - spec.add_dependency 'slop', '~> 4.8' - spec.add_dependency 'octokit', '~> 4.18' - spec.add_dependency 'terminal-table', '~> 1.8' + spec.authors = ["Cyril Rohr", "Manuel Fittko"] + spec.date = "2021-10-19" + spec.description = "1-click preview environments for GitHub repositories." + spec.email = "info@mfittko.com" + spec.files = Dir["lib/**/*"] + spec.executables = ["pullpreview"] + spec.homepage = "https://pullpreview.com/" + spec.summary = "pullpreview!" + spec.required_ruby_version = ">= 2.4.0" + spec.add_dependency "aws-sdk-lightsail", "~> 1.30" + spec.add_dependency "slop", "~> 4.8" + spec.add_dependency "octokit", "~> 4.18" + spec.add_dependency "terminal-table", "~> 1.8" end From 6839b544b3bb74b63ce119c9f0485c484486b115 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:37:45 +0200 Subject: [PATCH 12/63] try to fix require --- pullpreview.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 2be7f7f..98ea444 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -9,6 +9,7 @@ Gem::Specification.new do |spec| spec.files = Dir["lib/**/*"] spec.executables = ["pullpreview"] spec.homepage = "https://pullpreview.com/" + spec.require_paths = ["lib", "lib/pull_preview"] spec.summary = "pullpreview!" spec.required_ruby_version = ">= 2.4.0" spec.add_dependency "aws-sdk-lightsail", "~> 1.30" From 9c93a0e4271704e49c0f9ae26bd8220aa5c2a7e6 Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:42:08 +0200 Subject: [PATCH 13/63] one more --- pullpreview.gemspec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 98ea444..70c1df6 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -6,10 +6,11 @@ Gem::Specification.new do |spec| spec.date = "2021-10-19" spec.description = "1-click preview environments for GitHub repositories." spec.email = "info@mfittko.com" - spec.files = Dir["lib/**/*"] + spec.files = `git ls-files -z`.split("\x0").reject do |f| + f.match(%r{^(test|spec|features)/}) + end spec.executables = ["pullpreview"] spec.homepage = "https://pullpreview.com/" - spec.require_paths = ["lib", "lib/pull_preview"] spec.summary = "pullpreview!" spec.required_ruby_version = ">= 2.4.0" spec.add_dependency "aws-sdk-lightsail", "~> 1.30" From 345077b3bb00defa09eec0d1755e05968c4f7d0c Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:45:13 +0200 Subject: [PATCH 14/63] bump version --- pullpreview.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 70c1df6..07cdebb 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |spec| spec.name = "pullpreview" - spec.version = "0.0.1" + spec.version = "0.0.2" spec.authors = ["Cyril Rohr", "Manuel Fittko"] spec.date = "2021-10-19" From e7c19ac8576f896b89f3ce26d5c2728d72d1dbce Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 19 Oct 2021 12:52:41 +0200 Subject: [PATCH 15/63] use glob again --- pullpreview.gemspec | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 07cdebb..3a7fd7e 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -6,9 +6,7 @@ Gem::Specification.new do |spec| spec.date = "2021-10-19" spec.description = "1-click preview environments for GitHub repositories." spec.email = "info@mfittko.com" - spec.files = `git ls-files -z`.split("\x0").reject do |f| - f.match(%r{^(test|spec|features)/}) - end + spec.files = Dir.glob("lib/**/*") spec.executables = ["pullpreview"] spec.homepage = "https://pullpreview.com/" spec.summary = "pullpreview!" From 82954fa2d6f64f3830bc8d207a31feb5638088fc Mon Sep 17 00:00:00 2001 From: Kornelius Kalnbach Date: Sat, 12 Mar 2022 14:05:07 +0100 Subject: [PATCH 16/63] remove unknown argument for tar --- lib/pull_preview/up.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 06a9754..408ef63 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -21,7 +21,7 @@ def self.run(app_path, opts) instance_name = opts[:name] PullPreview.logger.info "Taring up repository at #{app_path.inspect}..." - unless system("tar cf /tmp/app.tar.gz --use-compress-program='pigz -k -9' --exclude=.git --exclude-from=.dockerignore -C '#{app_path}' .") + unless system("tar czf /tmp/app.tar.gz --exclude=.git --exclude-from=.dockerignore -C '#{app_path}' .") exit 1 end From 1efb4d5cb829f9059744d1a2ff27782b1eca11e0 Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 18 May 2022 19:26:52 +0200 Subject: [PATCH 17/63] skip ip prefix --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index a6ba3b0..be9af18 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -78,7 +78,7 @@ def initialize(name, opts = {}) @compose_files = opts[:compose_files] || ["docker-compose.yml"] @registries = opts[:registries] || [] @dns = opts[:dns] - @ip_prefix = opts.key?(:ip_prefix) ? opts[:ip_prefix] : "ip" + @ip_prefix = opts.key?(:ip_prefix) ? opts[:ip_prefix] : nil @ssh_results = [] @swap_enabled = !opts[:disable_swap] end From bf6acb794d54643afa65ea06ddef3fcd6659e3fa Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 18 May 2022 19:27:11 +0200 Subject: [PATCH 18/63] source env by default --- lib/pull_preview/instance.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index be9af18..2e8a713 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -32,7 +32,8 @@ def ssh_access(ssh_public_keys) def prepare_user(remote_app_path) [ "mkdir -p #{remote_app_path} && chown -R ec2-user.ec2-user #{remote_app_path}", - "echo 'cd #{remote_app_path}' > /etc/profile.d/pullpreview.sh" + "echo 'cd #{remote_app_path}' > /etc/profile.d/pullpreview.sh", + "echo '[[ -f /etc/pullpreview/env ]] && set -o allexport; source /etc/pullpreview/env; set +o allexport' >> /etc/profile.d/pullpreview.sh" ] end From 3da00b80506dd80b706f5a4bc4c7b2057b0be6f7 Mon Sep 17 00:00:00 2001 From: mfittko Date: Fri, 27 May 2022 01:06:28 +0200 Subject: [PATCH 19/63] allow passing in instance subdomain via CLI cmd --- bin/pullpreview | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/pullpreview b/bin/pullpreview index 70b1161..65f4210 100755 --- a/bin/pullpreview +++ b/bin/pullpreview @@ -35,6 +35,7 @@ up_opts = lambda do |o| o.string '--default-port', 'Default port to use when displaying the instance hostname', default: "80" o.array '--tags', 'Tags to add to the instance' o.array '--compose-files', 'Compose files to use when running docker-compose up', default: ["docker-compose.yml"] + o.string '--subdomain', 'Instance subdomain (optional)' end begin From ec6c42ec9935ad8010bb6eab14e387c11eec492b Mon Sep 17 00:00:00 2001 From: mfittko Date: Fri, 27 May 2022 11:28:12 +0200 Subject: [PATCH 20/63] add optional basic_auth via BASIC_AUTH=user:pass ENV variable --- lib/pull_preview/instance.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 2e8a713..d729f83 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -180,6 +180,10 @@ def erb_locals ) end + def basic_auth + ENV.fetch("BASIC_AUTH", nil) + end + def custom_launch_command ENV.fetch("PULLPREVIEW_LAUNCH_COMMAND", "") end @@ -352,7 +356,7 @@ def public_dns def url scheme = (default_port == "443" ? "https" : "http") - "#{scheme}://#{public_dns}:#{default_port}" + "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}" end def ssh_address From 2fe79a2fe3dfd0464d31152a656fbab3bc6f8c16 Mon Sep 17 00:00:00 2001 From: mfittko Date: Fri, 27 May 2022 12:10:35 +0200 Subject: [PATCH 21/63] try hardcoded basic auth --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index d729f83..987f94b 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -356,7 +356,7 @@ def public_dns def url scheme = (default_port == "443" ? "https" : "http") - "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}" + "#{scheme}://sofa:mathe@#{public_dns}:#{default_port}" end def ssh_address From b78016f7256cf44d99b13f5b3df419ea00b3c5ad Mon Sep 17 00:00:00 2001 From: mfittko Date: Fri, 27 May 2022 12:25:43 +0200 Subject: [PATCH 22/63] Revert "try hardcoded basic auth" This reverts commit 2fe79a2fe3dfd0464d31152a656fbab3bc6f8c16. --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 987f94b..d729f83 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -356,7 +356,7 @@ def public_dns def url scheme = (default_port == "443" ? "https" : "http") - "#{scheme}://sofa:mathe@#{public_dns}:#{default_port}" + "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}" end def ssh_address From ad36e4c7dd72459703592310ef11bdfc64461c33 Mon Sep 17 00:00:00 2001 From: mfittko Date: Fri, 27 May 2022 13:04:24 +0200 Subject: [PATCH 23/63] ignore all unknown actions --- lib/pull_preview/github_sync.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/pull_preview/github_sync.rb b/lib/pull_preview/github_sync.rb index 514bfe5..a6027e3 100644 --- a/lib/pull_preview/github_sync.rb +++ b/lib/pull_preview/github_sync.rb @@ -142,13 +142,12 @@ def guess_action_from_event end if push? || pr_synchronize? - if pr_has_label?(LABEL) - action = :pr_push - else - PullPreview.logger.info "Unable to find label #{LABEL} on PR##{pr_number}" - return :ignored - end + return :pr_push if pr_has_label?(LABEL) + + PullPreview.logger.info "Unable to find label #{LABEL} on PR##{pr_number}" end + + :ignored # default: ignore all other actions end def commit_status_for(status) From f9e1bf0e25ce5829b83e3a41934dbd133b9d6b38 Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 1 Jun 2022 15:50:25 +0200 Subject: [PATCH 24/63] make github sync more robust --- lib/pull_preview/github_sync.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/pull_preview/github_sync.rb b/lib/pull_preview/github_sync.rb index a6027e3..fd36cd7 100644 --- a/lib/pull_preview/github_sync.rb +++ b/lib/pull_preview/github_sync.rb @@ -23,7 +23,20 @@ def self.run(app_path, opts) # https://help.github.com/en/actions/reference/events-that-trigger-workflows github_context = JSON.parse(File.read(github_event_path)) PullPreview.logger.debug "github_context = #{github_context.inspect}" - self.new(github_context, app_path, opts).sync! + github_sync = new(github_context, app_path, opts) + begin + seconds ||= 0.2 + github_sync.sync! + rescue => e + if seconds > 10 + raise e + github_sync.update_github_status(:error) + end + + sleep seconds + seconds *= 2 + retry + end end # Go over closed pull requests that are still labelled as "pullpreview", and force the destroyal of the corresponding environments @@ -116,9 +129,6 @@ def sync! else PullPreview.logger.info "Ignoring event #{pp_action.inspect}" end - rescue => e - update_github_status(:error) - raise e end def guess_action_from_event From c40d19e784721b3307fc1ad663019dbe23c0e21f Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 7 Jun 2022 23:48:32 +0200 Subject: [PATCH 25/63] fix dockerhub login --- lib/pull_preview/instance.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index d729f83..0ec3226 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -242,10 +242,10 @@ def setup_prepost_scripts password = username username = "doesnotmatter" end - tmpfile.puts 'echo "Logging into ghcr.io..."' + tmpfile.puts 'echo "Logging into %{host}..."' % { host: uri.host } # https://docs.github.com/en/packages/guides/using-github-packages-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio - tmpfile.puts 'echo "%{password}" | docker login "%{host}" -u "%{username}" --password-stdin' % { - host: uri.host, + tmpfile.puts 'echo "%{password}" | docker login %{host} -u "%{username}" --password-stdin' % { + host: uri.host.end_with?('docker.io') ? nil : '"' + uri.host + '"', username: username, password: password, } From f2de689980c05f82adff1a4167fdcb4eb087d318 Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 15 Jun 2022 17:53:16 +0200 Subject: [PATCH 26/63] only use first admin for initial ssh setup --- lib/pull_preview/instance.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 0ec3226..703d9b1 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -25,8 +25,8 @@ class Provisioner COMPOSE_VERSION = "1.29.2".freeze class << self - def ssh_access(ssh_public_keys) - %{echo '#{ssh_public_keys.join("\n")}' > /home/ec2-user/.ssh/authorized_keys} + def ssh_access(ssh_public_key) + %{echo '#{ssh_public_key}' > /home/ec2-user/.ssh/authorized_keys} end def prepare_user(remote_app_path) @@ -144,7 +144,7 @@ def init_from_snapshot_command def setup_command [ - Provisioner.ssh_access(ssh_public_keys), + Provisioner.ssh_access(ssh_public_keys.first), Provisioner.prepare_user(REMOTE_APP_PATH), swap_enabled? ? Provisioner.setup_swapping : nil, Provisioner.install_and_setup_docker, From 2bf4bf32302395e5c12dbbe7dab141ac73daa382 Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 20 Jun 2022 11:41:22 +0200 Subject: [PATCH 27/63] fix security threat by opening too many ports by default. we should be having a clear white list policy here. --- action.yml | 2 +- bin/pullpreview | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/action.yml b/action.yml index 06ed5ba..95bb5c1 100644 --- a/action.yml +++ b/action.yml @@ -25,7 +25,7 @@ inputs: ports: description: "Ports to open for external access on the preview server (port 22 is always open), comma-separated" required: false - default: "80/tcp,443/tcp,1000-10000/tcp" + default: "80/tcp,443/tcp" cidrs: description: "The IP address, or range of IP addresses in CIDR notation, that are allowed to connect to the instance" required: false diff --git a/bin/pullpreview b/bin/pullpreview index 65f4210..0793cf7 100755 --- a/bin/pullpreview +++ b/bin/pullpreview @@ -29,7 +29,7 @@ up_opts = lambda do |o| o.array '--registries', 'URIs of docker registries to authenticate against, e.g. docker://username:password@ghcr.io', default: [] o.string '--dns', 'Enable DNS support for pretty-looking URLs', default: "my.pullpreview.com" o.array '--ports', 'Ports to open for external access on the preview server', default: [ - "80/tcp", "443/tcp", "1000-10000/tcp" + "80/tcp", "443/tcp" ] o.string '--instance-type', 'Instance type to use', default: 'small_2_0' o.string '--default-port', 'Default port to use when displaying the instance hostname', default: "80" From decb5bbea5b292171f49a200584a58dbbfcec4e9 Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 27 Jun 2022 13:50:22 +0200 Subject: [PATCH 28/63] use base image for faster builds --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 53636fd..41fc003 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ -FROM ruby:2.7-slim +# FROM ruby:2.7-slim +FROM sofatutor/app:pullpreview-base +# comment in for re-building base +# RUN apt-get update -qq && apt-get install openssh-client git -y -RUN apt-get update -qq && apt-get install openssh-client git -y WORKDIR /app COPY Gemfile . COPY Gemfile.lock . From f3bad2b40d8de12ab7a521901dcd504a367bb6b7 Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 27 Jun 2022 13:52:11 +0200 Subject: [PATCH 29/63] revert (no access to dockerhub) --- Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 41fc003..7ebcae6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ -# FROM ruby:2.7-slim -FROM sofatutor/app:pullpreview-base -# comment in for re-building base -# RUN apt-get update -qq && apt-get install openssh-client git -y +FROM ruby:2.7-slim + +RUN apt-get update -qq && apt-get install openssh-client git -y WORKDIR /app COPY Gemfile . From 3ed7e5321f423b4667946c5d25fe20302ec14f4a Mon Sep 17 00:00:00 2001 From: mfittko Date: Mon, 27 Jun 2022 18:22:09 +0200 Subject: [PATCH 30/63] use trailing slash for basic auth to be stripped from location --- lib/pull_preview/instance.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 703d9b1..b148a7e 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -39,7 +39,9 @@ def prepare_user(remote_app_path) def setup_swapping [ - "sudo sed -i '/^tmpfs/c\tmpfs \/dev\/shm tmpfs defaults,size=256M 0 0' /etc/fstab", + "fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile", + "echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab", + "echo 'vm.swappiness=10' | tee - a /etc/sysctl.conf", "echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.conf" ] end @@ -356,7 +358,7 @@ def public_dns def url scheme = (default_port == "443" ? "https" : "http") - "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}" + "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}/" end def ssh_address From 38f7d30c91698cac19224e229d3b06d02d20f2e1 Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 29 Jun 2022 13:12:37 +0200 Subject: [PATCH 31/63] revert --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7ebcae6..53636fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ FROM ruby:2.7-slim RUN apt-get update -qq && apt-get install openssh-client git -y - WORKDIR /app COPY Gemfile . COPY Gemfile.lock . From b667a40108bc7ec4245c3bbc81f17d654812613e Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 29 Jun 2022 15:37:19 +0200 Subject: [PATCH 32/63] change label --- .github/workflows/pullpreview.yml | 2 +- lib/pull_preview/github_sync.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pullpreview.yml b/.github/workflows/pullpreview.yml index ea5f1ec..d9db7a9 100644 --- a/.github/workflows/pullpreview.yml +++ b/.github/workflows/pullpreview.yml @@ -11,7 +11,7 @@ on: jobs: deploy: runs-on: ubuntu-latest - if: github.event_name == 'schedule' || github.event_name == 'push' || github.event.label.name == 'pullpreview' || contains(github.event.pull_request.labels.*.name, 'pullpreview') + if: github.event_name == 'schedule' || github.event_name == 'push' || github.event.label.name == 'preview' || contains(github.event.pull_request.labels.*.name, 'preview') timeout-minutes: 30 steps: - uses: actions/checkout@v2 diff --git a/lib/pull_preview/github_sync.rb b/lib/pull_preview/github_sync.rb index fd36cd7..fe3f62c 100644 --- a/lib/pull_preview/github_sync.rb +++ b/lib/pull_preview/github_sync.rb @@ -8,7 +8,7 @@ class GithubSync attr_reader :opts attr_reader :always_on - LABEL = "pullpreview" + LABEL = "preview" def self.run(app_path, opts) github_event_name = ENV.fetch("GITHUB_EVENT_NAME") From 06bb0c0e2a70ba1737eee84765455466f14ddadb Mon Sep 17 00:00:00 2001 From: mfittko Date: Tue, 16 Aug 2022 14:15:59 +0200 Subject: [PATCH 33/63] add deploy_key --- action.yml | 4 ++++ bin/pullpreview | 1 + lib/pull_preview/instance.rb | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 95bb5c1..bf20f9a 100644 --- a/action.yml +++ b/action.yml @@ -46,6 +46,10 @@ inputs: description: "Names of private registries to authenticate against. E.g. docker://username:password@ghcr.io" required: false default: "" + deploy_key: + description: "Additional public SSH key used for authentication" + required: false + default: "" outputs: url: diff --git a/bin/pullpreview b/bin/pullpreview index 0793cf7..6020291 100755 --- a/bin/pullpreview +++ b/bin/pullpreview @@ -35,6 +35,7 @@ up_opts = lambda do |o| o.string '--default-port', 'Default port to use when displaying the instance hostname', default: "80" o.array '--tags', 'Tags to add to the instance' o.array '--compose-files', 'Compose files to use when running docker-compose up', default: ["docker-compose.yml"] + o.string '--deploy-key', 'Additional public SSH key (optional)' o.string '--subdomain', 'Instance subdomain (optional)' end diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index b148a7e..73440d2 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -12,6 +12,7 @@ class Instance attr_reader :subdomain attr_reader :ports attr_reader :registries + attr_reader :deploy_key attr_reader :ip_prefix attr_reader :swap_enabled alias swap_enabled? swap_enabled @@ -82,6 +83,7 @@ def initialize(name, opts = {}) @registries = opts[:registries] || [] @dns = opts[:dns] @ip_prefix = opts.key?(:ip_prefix) ? opts[:ip_prefix] : nil + @deploy_key = opts[:deploy_key] @ssh_results = [] @swap_enabled = !opts[:disable_swap] end @@ -91,7 +93,11 @@ def remote_app_path end def ssh_public_keys - @ssh_public_keys ||= admins.map do |github_username| + @ssh_public_keys ||= ([deploy_key] + github_keys).reject { |key| !key || key.empty? } + end + + def github_keys + @github_keys ||= admins.map do |github_username| URI.open("https://github.com/#{github_username}.keys").read.split("\n") end.flatten.reject{|key| key.empty?} end From 85642f356791c12ac2a62303528fbaf28e48b58d Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 31 Aug 2022 20:22:30 +0200 Subject: [PATCH 34/63] update compose version --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 73440d2..d37cb3a 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -23,7 +23,7 @@ class << self end class Provisioner - COMPOSE_VERSION = "1.29.2".freeze + COMPOSE_VERSION = "v2.10.2".freeze class << self def ssh_access(ssh_public_key) From 1483247fd4f3bfdaac7d6239100ab52e885692f0 Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 14 Sep 2022 11:37:19 +0200 Subject: [PATCH 35/63] try more often, pick random availablity zone --- lib/pull_preview/github_sync.rb | 2 +- lib/pull_preview/up.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pull_preview/github_sync.rb b/lib/pull_preview/github_sync.rb index fe3f62c..1c42993 100644 --- a/lib/pull_preview/github_sync.rb +++ b/lib/pull_preview/github_sync.rb @@ -28,7 +28,7 @@ def self.run(app_path, opts) seconds ||= 0.2 github_sync.sync! rescue => e - if seconds > 10 + if seconds > 30 raise e github_sync.update_github_status(:error) end diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 408ef63..3011997 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -50,7 +50,7 @@ def self.run(app_path, opts) end end.bundle_id - instance.launch(azs.first, bundle_id, blueprint_id, tags) + instance.launch(azs.sample, bundle_id, blueprint_id, tags) instance.wait_until_running! sleep 2 end From b721463f1a98bf68d58fc25e8795faa2d6d3669f Mon Sep 17 00:00:00 2001 From: mfittko Date: Wed, 14 Sep 2022 18:06:09 +0200 Subject: [PATCH 36/63] tackle docker not having been shut down cleanly on snapshot creation --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index d37cb3a..ce1c8ec 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -146,7 +146,7 @@ def launch(az, bundle_id, blueprint_id, tags = {}) def init_from_snapshot_command [ - "service docker restart" + "pkill -9 docker ; pkill -9 containerd ; rm -f /var/run/docker/containerd/containerd.pid ; service docker start" ].join(" && ") end From 01893ab40147dc3aa6f1c662c6a8af13bd27066e Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 6 Jan 2023 15:19:22 +0100 Subject: [PATCH 37/63] switch to using amazon linux 2 since the old blueprint became unavailable --- lib/pull_preview/up.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 8ed75e8..662c03e 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -35,7 +35,7 @@ def self.run(app_path, opts) blueprint_id = PullPreview.lightsail.get_blueprints.blueprints.find do |blueprint| blueprint.platform == "LINUX_UNIX" && - blueprint.group == "amazon-linux" && + blueprint.group == "amazon_linux_2" && blueprint.is_active && blueprint.type == "os" end.blueprint_id From 1300b807e0d20c224f2e9e12a8f68a49b153d51f Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Wed, 11 Jan 2023 18:08:59 +0100 Subject: [PATCH 38/63] remove docker volume cleanup --- data/update_script.sh.erb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/data/update_script.sh.erb b/data/update_script.sh.erb index b6055a1..3979c44 100644 --- a/data/update_script.sh.erb +++ b/data/update_script.sh.erb @@ -74,12 +74,6 @@ rsync -auz "/tmp$APP_PATH" / --remove-source-files --delete cd "$APP_PATH" -echo "Cleaning up..." -docker volume prune -f || true - -echo "Updating dependencies..." -yum update -y || true - if ! /tmp/pre_script.sh ; then echo "Failed to run the pre-script" exit 1 From 6fa534a171c4903758e75b09f0e88cd700017087 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 17 Feb 2023 10:50:16 +0100 Subject: [PATCH 39/63] make username/password optional --- lib/pull_preview/instance.rb | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index ce1c8ec..53658c5 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -246,17 +246,15 @@ def setup_prepost_scripts raise Error, "Invalid registry" if uri.host.nil? || uri.scheme != "docker" username = uri.user password = uri.password - if password.nil? - password = username - username = "doesnotmatter" + if username && password + tmpfile.puts 'echo "Logging into %{host}..."' % { host: uri.host } + # https://docs.github.com/en/packages/guides/using-github-packages-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio + tmpfile.puts 'echo "%{password}" | docker login %{host} -u "%{username}" --password-stdin' % { + host: uri.host.end_with?('docker.io') ? nil : '"' + uri.host + '"', + username: username, + password: password, + } end - tmpfile.puts 'echo "Logging into %{host}..."' % { host: uri.host } - # https://docs.github.com/en/packages/guides/using-github-packages-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio - tmpfile.puts 'echo "%{password}" | docker login %{host} -u "%{username}" --password-stdin' % { - host: uri.host.end_with?('docker.io') ? nil : '"' + uri.host + '"', - username: username, - password: password, - } rescue URI::Error, Error => e logger.warn "Registry ##{index} is invalid: #{e.message}" end From f0febbab4a9a36b6736fbee397b15218fba7c60a Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 17 Feb 2023 16:20:41 +0100 Subject: [PATCH 40/63] enable docker in systemctl on start --- lib/pull_preview/instance.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 53658c5..6b510c9 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -54,7 +54,8 @@ def install_and_setup_docker "chmod +x /usr/local/bin/docker-compose", "usermod -aG docker ec2-user", "service docker start", - "echo 'docker image prune -a --filter=\"until=96h\" --force' > /etc/cron.daily/docker-prune && chmod a+x /etc/cron.daily/docker-prune" + "echo 'docker image prune -a --filter=\"until=96h\" --force' > /etc/cron.daily/docker-prune && chmod a+x /etc/cron.daily/docker-prune", + "systemctl enable docker" ] end From f8d0df1970ffc2968b910e83912df46fef62b137 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 24 Feb 2023 10:47:42 +0100 Subject: [PATCH 41/63] add publish action --- .github/workflows/image.yml | 59 +++++++++++++++++++++++++++++++++++++ action.yml | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/image.yml diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml new file mode 100644 index 0000000..738b6c1 --- /dev/null +++ b/.github/workflows/image.yml @@ -0,0 +1,59 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. +--- +name: Create and publish a Container image + +on: + push: + branches: + - master + tags: + - "v*" + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.event.repository.owner.name }}/pullpreview + +jobs: + build-and-push-image: + runs-on: ubuntu-22.04 + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@57396166ad8aefe6098280995947635806a0e6ea + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + + - name: Build and push Docker image + uses: docker/build-push-action@c56af957549030174b10d6867f20e78cfd7debc5 + with: + context: . + push: true + pull: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/action.yml b/action.yml index bf20f9a..874b331 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: "Dockerfile" + image: ghcr.io/${{ github.event.repository.owner.name }}/pullpreview args: - "github-sync" - "${{ inputs.app_path }}" From 0d4ea757d0f0fef74e6e79a44ab8f562eea764ff Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 24 Feb 2023 10:52:22 +0100 Subject: [PATCH 42/63] run on sofatutor branch --- .github/workflows/image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index 738b6c1..a70eccd 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -12,7 +12,7 @@ name: Create and publish a Container image on: push: branches: - - master + - sofatutor tags: - "v*" From 851f290aa840a8d7823c6c90c8bbf75b89e16010 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 24 Feb 2023 10:54:09 +0100 Subject: [PATCH 43/63] add tag --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 874b331..f5d3519 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: ghcr.io/${{ github.event.repository.owner.name }}/pullpreview + image: ghcr.io/${{ github.event.repository.owner.name }}/pullpreview:sofatutor args: - "github-sync" - "${{ inputs.app_path }}" From 65e4b5553946b0c8f54f2923538526991b835ec5 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 24 Feb 2023 10:54:50 +0100 Subject: [PATCH 44/63] use fixed value --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index f5d3519..6bd9e2b 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: ghcr.io/${{ github.event.repository.owner.name }}/pullpreview:sofatutor + image: ghcr.io/sofatutor/pullpreview:sofatutor args: - "github-sync" - "${{ inputs.app_path }}" From 754217e359e4bc51e889d99468e39ffbc76279e9 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 24 Feb 2023 10:55:52 +0100 Subject: [PATCH 45/63] add docker:// prefix --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 6bd9e2b..d350919 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: ghcr.io/sofatutor/pullpreview:sofatutor + image: docker://ghcr.io/sofatutor/pullpreview:sofatutor args: - "github-sync" - "${{ inputs.app_path }}" From 9a4aa56f94df666edeb3004be276249b5916c56a Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Sun, 26 Feb 2023 12:02:58 +0100 Subject: [PATCH 46/63] clean apt cache --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 53636fd..f465242 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM ruby:2.7-slim -RUN apt-get update -qq && apt-get install openssh-client git -y +RUN apt-get update -qq && apt-get install openssh-client git -y \ + && apt-get clean -y && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY Gemfile . COPY Gemfile.lock . From 53439df9ae1791590dd0e6f89678ccec700c655c Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 11:07:48 +0100 Subject: [PATCH 47/63] show all logs on error --- lib/pull_preview/up.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 7113509..c5d6442 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -99,6 +99,7 @@ def self.run(app_path, opts) if ok instance else + instance.ssh 'cd /app && docker-compose logs --tail 1000' raise Error, "Trying to launch the application failed. Please see the logs above to troubleshoot the issue and for informations on how to connect to the instance" end end From 7d2210257ffe5eb6f168d3bc0d1e481f117a1492 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 16:04:27 +0100 Subject: [PATCH 48/63] upload and tar together --- .github/workflows/image.yml | 1 + lib/pull_preview/instance.rb | 12 ++++++++++-- lib/pull_preview/up.rb | 8 +------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index a70eccd..b40dda4 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -13,6 +13,7 @@ on: push: branches: - sofatutor + - sofatutor-tar-upload tags: - "v*" diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 6b510c9..93ff05a 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -321,11 +321,19 @@ def open_ports }) end + def tar_upload(app_folder, remote_tarball_path) + system "tar --exclude=.git --exclude-from=.dockerignore -cvzf - #{app_folder} | #{ssh_command('cat > ' + remote_tarball_path)}" + end + def scp(source, target, mode: "0644") ssh("cat - > #{target} && chmod #{mode} #{target}", input: File.new(source)) end def ssh(command, input: nil) + system(ssh_command(command, input: input)).tap {|result| @ssh_results.push([cmd, result])} + end + + def ssh_command(command, input: nil) key_file_path = "/tmp/tempkey" cert_key_path = "/tmp/tempkey-cert.pub" File.open(key_file_path, "w+") do |f| @@ -340,8 +348,8 @@ def ssh(command, input: nil) if input && input.respond_to?(:path) cmd = "cat #{input.path} | #{cmd}" end - logger.debug cmd - system(cmd).tap {|result| @ssh_results.push([cmd, result])} + + cmd end def username diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index c5d6442..0e1d41f 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -19,12 +19,6 @@ def self.run(app_path, opts) aws_region = PullPreview.lightsail.config.region instance_name = opts[:name] - - PullPreview.logger.info "Taring up repository at #{app_path.inspect}..." - unless system("tar czf /tmp/app.tar.gz --exclude=.git --exclude-from=.dockerignore -C '#{app_path}' .") - exit 1 - end - instance = Instance.new(instance_name, opts) unless instance.running? @@ -70,7 +64,7 @@ def self.run(app_path, opts) PullPreview.logger.info "Preparing to push app tarball (#{(File.size("/tmp/app.tar.gz") / 1024.0**2).round(2)}MB)" remote_tarball_path = "/tmp/app-#{Time.now.utc.strftime("%Y%m%d%H%M%S")}.tar.gz" - unless instance.scp("/tmp/app.tar.gz", remote_tarball_path) + unless instance.tar_upload(app_folder, remote_tarball_path) raise Error, "Unable to copy application content on instance. Aborting." end From 8b1ede90f04ce8deec7010729d33c65b74564996 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 16:13:22 +0100 Subject: [PATCH 49/63] use correct image --- action.yml | 2 +- lib/pull_preview/up.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index d350919..4df585a 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: docker://ghcr.io/sofatutor/pullpreview:sofatutor + image: docker://ghcr.io/sofatutor/pullpreview:sofatutor-tar-upload args: - "github-sync" - "${{ inputs.app_path }}" diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 0e1d41f..9c7f9d5 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -61,10 +61,10 @@ def self.run(app_path, opts) puts " ssh #{instance.ssh_address}" puts - PullPreview.logger.info "Preparing to push app tarball (#{(File.size("/tmp/app.tar.gz") / 1024.0**2).round(2)}MB)" remote_tarball_path = "/tmp/app-#{Time.now.utc.strftime("%Y%m%d%H%M%S")}.tar.gz" - unless instance.tar_upload(app_folder, remote_tarball_path) + PullPreview.logger.info "Uploading app tarball..." + unless instance.tar_upload(app_path, remote_tarball_path) raise Error, "Unable to copy application content on instance. Aborting." end From e2c5c61806440e771d65b325591c35f7c75e3898 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 16:17:03 +0100 Subject: [PATCH 50/63] fix missing cmd --- lib/pull_preview/instance.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 93ff05a..adca5c2 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -330,7 +330,8 @@ def scp(source, target, mode: "0644") end def ssh(command, input: nil) - system(ssh_command(command, input: input)).tap {|result| @ssh_results.push([cmd, result])} + cmd = ssh_command(command, input: input) + system(cmd).tap {|result| @ssh_results.push([cmd, result])} end def ssh_command(command, input: nil) @@ -348,6 +349,7 @@ def ssh_command(command, input: nil) if input && input.respond_to?(:path) cmd = "cat #{input.path} | #{cmd}" end + logger.debug cmd cmd end From 0ed4c7ff05f40902356c2870c1d6160dd4cee596 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 16:28:26 +0100 Subject: [PATCH 51/63] no verbose --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index adca5c2..00cc92c 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -322,7 +322,7 @@ def open_ports end def tar_upload(app_folder, remote_tarball_path) - system "tar --exclude=.git --exclude-from=.dockerignore -cvzf - #{app_folder} | #{ssh_command('cat > ' + remote_tarball_path)}" + system "tar --exclude=.git --exclude-from=.dockerignore -czf - #{app_folder} | #{ssh_command('cat > ' + remote_tarball_path)}" end def scp(source, target, mode: "0644") From 5e976206928e1b9eb1eccd277f4c7a106d05e6b6 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 16:38:20 +0100 Subject: [PATCH 52/63] fix path --- lib/pull_preview/instance.rb | 4 ++-- lib/pull_preview/up.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 00cc92c..8c5d333 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -321,8 +321,8 @@ def open_ports }) end - def tar_upload(app_folder, remote_tarball_path) - system "tar --exclude=.git --exclude-from=.dockerignore -czf - #{app_folder} | #{ssh_command('cat > ' + remote_tarball_path)}" + def tar_upload(remote_tarball_path) + system "tar --exclude=.git --exclude-from=.dockerignore -czf - . | #{ssh_command('cat - > ' + remote_tarball_path)}" end def scp(source, target, mode: "0644") diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 9c7f9d5..34a0d01 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -64,7 +64,7 @@ def self.run(app_path, opts) remote_tarball_path = "/tmp/app-#{Time.now.utc.strftime("%Y%m%d%H%M%S")}.tar.gz" PullPreview.logger.info "Uploading app tarball..." - unless instance.tar_upload(app_path, remote_tarball_path) + unless instance.tar_upload(remote_tarball_path) raise Error, "Unable to copy application content on instance. Aborting." end From 026a9a06732edc1ab3f24c1f80601aba25b548e7 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 17:47:15 +0100 Subject: [PATCH 53/63] show upload size --- lib/pull_preview/up.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 34a0d01..41bafb7 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -68,6 +68,8 @@ def self.run(app_path, opts) raise Error, "Unable to copy application content on instance. Aborting." end + puts "Successfully uploaded " + `instance.ssh_command("du -sh #{remote_tarball_path}")`[/[^ ]+/] + PullPreview.logger.info "Launching application..." ok = instance.ssh("/tmp/update_script.sh #{remote_tarball_path}") From 6ba17f8aacdab8cc5a5783529e98757f13e62fff Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 17:48:39 +0100 Subject: [PATCH 54/63] show upload size --- lib/pull_preview/up.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 41bafb7..562ee81 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -68,7 +68,8 @@ def self.run(app_path, opts) raise Error, "Unable to copy application content on instance. Aborting." end - puts "Successfully uploaded " + `instance.ssh_command("du -sh #{remote_tarball_path}")`[/[^ ]+/] + size_fetch_command = instance.ssh_command("du -sh #{remote_tarball_path}") + puts "Successfully uploaded " + `#{size_fetch_command}`[/[^ ]+/] PullPreview.logger.info "Launching application..." ok = instance.ssh("/tmp/update_script.sh #{remote_tarball_path}") From 77a54a583643d5514d7b7461cc7084d20be72bdb Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 17:55:05 +0100 Subject: [PATCH 55/63] use logger --- lib/pull_preview/up.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 562ee81..cdaebb6 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -58,7 +58,7 @@ def self.run(app_path, opts) puts puts "To connect to the instance (authorized GitHub users: #{instance.admins.join(", ")}):" - puts " ssh #{instance.ssh_address}" + puts "ssh #{instance.ssh_address}" puts remote_tarball_path = "/tmp/app-#{Time.now.utc.strftime("%Y%m%d%H%M%S")}.tar.gz" @@ -69,7 +69,7 @@ def self.run(app_path, opts) end size_fetch_command = instance.ssh_command("du -sh #{remote_tarball_path}") - puts "Successfully uploaded " + `#{size_fetch_command}`[/[^ ]+/] + PullPreview.logger.info "Successfully uploaded " + `#{size_fetch_command}`[/\S+/] PullPreview.logger.info "Launching application..." ok = instance.ssh("/tmp/update_script.sh #{remote_tarball_path}") From 171df051f3da8b75c1c7585f2145db34c2e6e17c Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Tue, 28 Feb 2023 18:00:26 +0100 Subject: [PATCH 56/63] revert --- .github/workflows/image.yml | 1 - action.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index b40dda4..a70eccd 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -13,7 +13,6 @@ on: push: branches: - sofatutor - - sofatutor-tar-upload tags: - "v*" diff --git a/action.yml b/action.yml index 4df585a..d350919 100644 --- a/action.yml +++ b/action.yml @@ -61,7 +61,7 @@ outputs: runs: using: "docker" - image: docker://ghcr.io/sofatutor/pullpreview:sofatutor-tar-upload + image: docker://ghcr.io/sofatutor/pullpreview:sofatutor args: - "github-sync" - "${{ inputs.app_path }}" From 1d82eda7f865c7d2e07766e64f64f2edcf964190 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Thu, 2 Mar 2023 16:10:21 +0100 Subject: [PATCH 57/63] reduce fatal error log size --- lib/pull_preview/up.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index cdaebb6..f6793d4 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -96,7 +96,7 @@ def self.run(app_path, opts) if ok instance else - instance.ssh 'cd /app && docker-compose logs --tail 1000' + instance.ssh 'cd /app && docker-compose logs --tail 100' raise Error, "Trying to launch the application failed. Please see the logs above to troubleshoot the issue and for informations on how to connect to the instance" end end From 7a352aa25a70f46510509e299d6411c279fbec76 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Fri, 19 May 2023 14:13:20 +0200 Subject: [PATCH 58/63] fix output --- lib/pull_preview/up.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index f6793d4..3f6b6fc 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -74,9 +74,9 @@ def self.run(app_path, opts) PullPreview.logger.info "Launching application..." ok = instance.ssh("/tmp/update_script.sh #{remote_tarball_path}") - puts "::set-output name=url::#{instance.url}" - puts "::set-output name=host::#{instance.public_ip}" - puts "::set-output name=username::#{instance.username}" + puts "echo url=#{instance.url} >> $GITHUB_OUTPUT" + puts "echo host=#{instance.public_ip} >> $GITHUB_OUTPUT" + puts "echo username=#{instance.username} >> $GITHUB_OUTPUT" puts puts "You can access your application at the following URL:" From 0357b590e9c8a6d96697af52bd7087ae8547ffaa Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Mon, 3 Jul 2023 14:19:16 +0200 Subject: [PATCH 59/63] make sure that we can use a simple instance_type (e.g. medium) and be future proof --- lib/pull_preview/up.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/up.rb b/lib/pull_preview/up.rb index 3f6b6fc..c81b693 100644 --- a/lib/pull_preview/up.rb +++ b/lib/pull_preview/up.rb @@ -40,7 +40,7 @@ def self.run(app_path, opts) (2..3).include?(bundle.ram_size_in_gb) && bundle.supported_platforms.include?("LINUX_UNIX") else - bundle.bundle_id == opts[:instance_type] + bundle.bundle_id =~ /^#{opts[:instance_type]}/i end end.bundle_id From 585807314ca8b1ab149c672a1afdf76e4a0b46b1 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Wed, 15 May 2024 11:06:20 +0200 Subject: [PATCH 60/63] remove trailing slash --- lib/pull_preview/instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pull_preview/instance.rb b/lib/pull_preview/instance.rb index 8c5d333..33f47a1 100644 --- a/lib/pull_preview/instance.rb +++ b/lib/pull_preview/instance.rb @@ -373,7 +373,7 @@ def public_dns def url scheme = (default_port == "443" ? "https" : "http") - "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}/" + "#{scheme}://#{basic_auth && basic_auth + '@'}#{public_dns}:#{default_port}" end def ssh_address From c2e99a5de9837a008156a3a4f794338e5ed4cd67 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Mon, 21 Oct 2024 17:28:52 +0200 Subject: [PATCH 61/63] Update terminal-table to 3.0.2, adjust dependencies, and bump version to 0.0.3 This commit updates the terminal-table gem to version 3.0.2, adjusts the unicode-display_width dependency to be compatible, and updates the pullpreview gem version to 0.0.3. Additionally, it updates the Bundler version to 2.4.22 and makes minor adjustments to other dependencies for compatibility. --- Gemfile.lock | 6 +++--- pullpreview.gemspec | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a88dcb..4cccd39 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -32,8 +32,8 @@ GEM addressable (>= 2.3.5) faraday (> 0.8, < 2.0) slop (4.8.1) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) unicode-display_width (1.7.0) PLATFORMS @@ -47,4 +47,4 @@ DEPENDENCIES terminal-table BUNDLED WITH - 2.1.4 + 2.4.22 diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 3a7fd7e..31a3de4 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |spec| spec.name = "pullpreview" - spec.version = "0.0.2" + spec.version = "0.0.3" spec.authors = ["Cyril Rohr", "Manuel Fittko"] spec.date = "2021-10-19" @@ -13,6 +13,6 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 2.4.0" spec.add_dependency "aws-sdk-lightsail", "~> 1.30" spec.add_dependency "slop", "~> 4.8" - spec.add_dependency "octokit", "~> 4.18" - spec.add_dependency "terminal-table", "~> 1.8" + spec.add_dependency "octokit", "~> 4.11.88" + spec.add_dependency "terminal-table", "~> 3.0.2" end From 1e14c3040394cb474e03d46b5d19b27f2713cfda Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Mon, 21 Oct 2024 17:36:25 +0200 Subject: [PATCH 62/63] Update dependencies for aws-sdk-lightsail, octokit, and slop This commit updates aws-sdk-lightsail to 1.32.0, octokit to 4.22.0, and slop to 4.10.1, ensuring compatibility and leveraging the latest features and bug fixes from these libraries. Terminal-table dependency version is relaxed to "~> 3.0". --- Gemfile.lock | 6 +++--- pullpreview.gemspec | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4cccd39..90c841b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,7 +10,7 @@ GEM aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-lightsail (1.30.0) + aws-sdk-lightsail (1.32.0) aws-sdk-core (~> 3, >= 3.71.0) aws-sigv4 (~> 1.1) aws-sigv4 (1.1.3) @@ -21,7 +21,7 @@ GEM jmespath (1.4.0) method_source (1.0.0) multipart-post (2.1.1) - octokit (4.18.0) + octokit (4.22.0) faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) pry (0.14.1) @@ -31,7 +31,7 @@ GEM sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) - slop (4.8.1) + slop (4.10.1) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) unicode-display_width (1.7.0) diff --git a/pullpreview.gemspec b/pullpreview.gemspec index 31a3de4..9be526b 100644 --- a/pullpreview.gemspec +++ b/pullpreview.gemspec @@ -11,8 +11,8 @@ Gem::Specification.new do |spec| spec.homepage = "https://pullpreview.com/" spec.summary = "pullpreview!" spec.required_ruby_version = ">= 2.4.0" - spec.add_dependency "aws-sdk-lightsail", "~> 1.30" - spec.add_dependency "slop", "~> 4.8" - spec.add_dependency "octokit", "~> 4.11.88" - spec.add_dependency "terminal-table", "~> 3.0.2" + spec.add_dependency "aws-sdk-lightsail", "~> 1.32" + spec.add_dependency "slop", "~> 4.10" + spec.add_dependency "octokit", "~> 4.22" + spec.add_dependency "terminal-table", "~> 3.0" end From 2de72ef1bccc9856aa50271cd4427d24b9345452 Mon Sep 17 00:00:00 2001 From: Manuel Fittko Date: Mon, 4 Nov 2024 10:09:43 +0100 Subject: [PATCH 63/63] use sofatutor's forked docker actions --- .github/workflows/image.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index a70eccd..2121eae 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -32,7 +32,7 @@ jobs: uses: actions/checkout@v3 - name: Log in to the Container registry - uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + uses: sofatutor/docker-login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -40,7 +40,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@57396166ad8aefe6098280995947635806a0e6ea + uses: sofatutor/docker-metadata-action@57396166ad8aefe6098280995947635806a0e6ea with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -50,7 +50,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} - name: Build and push Docker image - uses: docker/build-push-action@c56af957549030174b10d6867f20e78cfd7debc5 + uses: sofatutor/docker-build-push-action@c56af957549030174b10d6867f20e78cfd7debc5 with: context: . push: true