Compare commits
14 Commits
v2.0.0.bet
...
v2.0.0.rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b89ec2bf63 | ||
|
|
3172adca30 | ||
|
|
04d21f45bb | ||
|
|
eabd57350c | ||
|
|
487f6f5f53 | ||
|
|
d98500982d | ||
|
|
8693e968c1 | ||
|
|
6ab5fc9459 | ||
|
|
6fc2915884 | ||
|
|
afa6898a82 | ||
|
|
384b36d158 | ||
|
|
6df169a4fb | ||
|
|
ab109afc52 | ||
|
|
a6a48c456c |
@@ -1,7 +1,7 @@
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
kamal (2.0.0.beta2)
|
||||
kamal (2.0.0.rc1)
|
||||
activesupport (>= 7.0)
|
||||
base64 (~> 0.2)
|
||||
bcrypt_pbkdf (~> 1.0)
|
||||
|
||||
@@ -147,23 +147,25 @@ class Kamal::Cli::Accessory < Kamal::Cli::Base
|
||||
option :grep, aliases: "-g", desc: "Show lines with grep match only (use this to fetch specific requests by id)"
|
||||
option :grep_options, aliases: "-o", desc: "Additional options supplied to grep"
|
||||
option :follow, aliases: "-f", desc: "Follow logs on primary server (or specific host set by --hosts)"
|
||||
option :skip_timestamps, aliases: "-T", desc: "Skip appending timestamps to logging output"
|
||||
def logs(name)
|
||||
with_accessory(name) do |accessory, hosts|
|
||||
grep = options[:grep]
|
||||
grep_options = options[:grep_options]
|
||||
timestamps = !options[:skip_timestamps]
|
||||
|
||||
if options[:follow]
|
||||
run_locally do
|
||||
info "Following logs on #{hosts}..."
|
||||
info accessory.follow_logs(grep: grep, grep_options: grep_options)
|
||||
exec accessory.follow_logs(grep: grep, grep_options: grep_options)
|
||||
info accessory.follow_logs(timestamps: timestamps, grep: grep, grep_options: grep_options)
|
||||
exec accessory.follow_logs(timestamps: timestamps, grep: grep, grep_options: grep_options)
|
||||
end
|
||||
else
|
||||
since = options[:since]
|
||||
lines = options[:lines].presence || ((since || grep) ? nil : 100) # Default to 100 lines if since or grep isn't set
|
||||
|
||||
on(hosts) do
|
||||
puts capture_with_info(*accessory.logs(since: since, lines: lines, grep: grep, grep_options: grep_options))
|
||||
puts capture_with_info(*accessory.logs(timestamps: timestamps, since: since, lines: lines, grep: grep, grep_options: grep_options))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -188,12 +188,14 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
||||
option :grep, aliases: "-g", desc: "Show lines with grep match only (use this to fetch specific requests by id)"
|
||||
option :grep_options, aliases: "-o", desc: "Additional options supplied to grep"
|
||||
option :follow, aliases: "-f", desc: "Follow log on primary server (or specific host set by --hosts)"
|
||||
option :skip_timestamps, aliases: "-T", desc: "Skip appending timestamps to logging output"
|
||||
def logs
|
||||
# FIXME: Catch when app containers aren't running
|
||||
|
||||
grep = options[:grep]
|
||||
grep_options = options[:grep_options]
|
||||
since = options[:since]
|
||||
timestamps = !options[:skip_timestamps]
|
||||
|
||||
if options[:follow]
|
||||
lines = options[:lines].presence || ((since || grep) ? nil : 10) # Default to 10 lines if since or grep isn't set
|
||||
@@ -205,8 +207,8 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
||||
role = KAMAL.roles_on(KAMAL.primary_host).first
|
||||
|
||||
app = KAMAL.app(role: role, host: host)
|
||||
info app.follow_logs(host: KAMAL.primary_host, lines: lines, grep: grep, grep_options: grep_options)
|
||||
exec app.follow_logs(host: KAMAL.primary_host, lines: lines, grep: grep, grep_options: grep_options)
|
||||
info app.follow_logs(host: KAMAL.primary_host, timestamps: timestamps, lines: lines, grep: grep, grep_options: grep_options)
|
||||
exec app.follow_logs(host: KAMAL.primary_host, timestamps: timestamps, lines: lines, grep: grep, grep_options: grep_options)
|
||||
end
|
||||
else
|
||||
lines = options[:lines].presence || ((since || grep) ? nil : 100) # Default to 100 lines if since or grep isn't set
|
||||
@@ -216,7 +218,7 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
||||
|
||||
roles.each do |role|
|
||||
begin
|
||||
puts_by_host host, capture_with_info(*KAMAL.app(role: role, host: host).logs(since: since, lines: lines, grep: grep, grep_options: grep_options))
|
||||
puts_by_host host, capture_with_info(*KAMAL.app(role: role, host: host).logs(timestamps: timestamps, since: since, lines: lines, grep: grep, grep_options: grep_options))
|
||||
rescue SSHKit::Command::Failed
|
||||
puts_by_host host, "Nothing found"
|
||||
end
|
||||
|
||||
@@ -140,21 +140,23 @@ class Kamal::Cli::Proxy < Kamal::Cli::Base
|
||||
option :lines, type: :numeric, aliases: "-n", desc: "Number of log lines to pull from each server"
|
||||
option :grep, aliases: "-g", desc: "Show lines with grep match only (use this to fetch specific requests by id)"
|
||||
option :follow, aliases: "-f", desc: "Follow logs on primary server (or specific host set by --hosts)"
|
||||
option :skip_timestamps, aliases: "-T", desc: "Skip appending timestamps to logging output"
|
||||
def logs
|
||||
grep = options[:grep]
|
||||
timestamps = !options[:skip_timestamps]
|
||||
|
||||
if options[:follow]
|
||||
run_locally do
|
||||
info "Following logs on #{KAMAL.primary_host}..."
|
||||
info KAMAL.proxy.follow_logs(host: KAMAL.primary_host, grep: grep)
|
||||
exec KAMAL.proxy.follow_logs(host: KAMAL.primary_host, grep: grep)
|
||||
info KAMAL.proxy.follow_logs(host: KAMAL.primary_host, timestamps: timestamps, grep: grep)
|
||||
exec KAMAL.proxy.follow_logs(host: KAMAL.primary_host, timestamps: timestamps, grep: grep)
|
||||
end
|
||||
else
|
||||
since = options[:since]
|
||||
lines = options[:lines].presence || ((since || grep) ? nil : 100) # Default to 100 lines if since or grep isn't set
|
||||
|
||||
on(KAMAL.proxy_hosts) do |host|
|
||||
puts_by_host host, capture(*KAMAL.proxy.logs(since: since, lines: lines, grep: grep)), type: "Proxy"
|
||||
puts_by_host host, capture(*KAMAL.proxy.logs(timestamps: timestamps, since: since, lines: lines, grep: grep)), type: "Proxy"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,16 +39,16 @@ class Kamal::Commands::Accessory < Kamal::Commands::Base
|
||||
end
|
||||
|
||||
|
||||
def logs(since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
def logs(timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
pipe \
|
||||
docker(:logs, service_name, (" --since #{since}" if since), (" --tail #{lines}" if lines), "--timestamps", "2>&1"),
|
||||
docker(:logs, service_name, (" --since #{since}" if since), (" --tail #{lines}" if lines), ("--timestamps" if timestamps), "2>&1"),
|
||||
("grep '#{grep}'#{" #{grep_options}" if grep_options}" if grep)
|
||||
end
|
||||
|
||||
def follow_logs(grep: nil, grep_options: nil)
|
||||
def follow_logs(timestamps: true, grep: nil, grep_options: nil)
|
||||
run_over_ssh \
|
||||
pipe \
|
||||
docker(:logs, service_name, "--timestamps", "--tail", "10", "--follow", "2>&1"),
|
||||
docker(:logs, service_name, ("--timestamps" if timestamps), "--tail", "10", "--follow", "2>&1"),
|
||||
(%(grep "#{grep}"#{" #{grep_options}" if grep_options}) if grep)
|
||||
end
|
||||
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
module Kamal::Commands::App::Logging
|
||||
def logs(version: nil, since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
def logs(version: nil, timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
pipe \
|
||||
version ? container_id_for_version(version) : current_running_container_id,
|
||||
"xargs docker logs#{" --since #{since}" if since}#{" --tail #{lines}" if lines} 2>&1",
|
||||
"xargs docker logs#{" --timestamps" if timestamps}#{" --since #{since}" if since}#{" --tail #{lines}" if lines} 2>&1",
|
||||
("grep '#{grep}'#{" #{grep_options}" if grep_options}" if grep)
|
||||
end
|
||||
|
||||
def follow_logs(host:, lines: nil, grep: nil, grep_options: nil)
|
||||
def follow_logs(host:, timestamps: true, lines: nil, grep: nil, grep_options: nil)
|
||||
run_over_ssh \
|
||||
pipe(
|
||||
current_running_container_id,
|
||||
"xargs docker logs --timestamps#{" --tail #{lines}" if lines} --follow 2>&1",
|
||||
"xargs docker logs#{" --timestamps" if timestamps}#{" --tail #{lines}" if lines} --follow 2>&1",
|
||||
(%(grep "#{grep}"#{" #{grep_options}" if grep_options}) if grep)
|
||||
),
|
||||
host: host
|
||||
|
||||
@@ -35,15 +35,15 @@ class Kamal::Commands::Proxy < Kamal::Commands::Base
|
||||
[ :cut, "-d:", "-f2" ]
|
||||
end
|
||||
|
||||
def logs(since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
def logs(timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil)
|
||||
pipe \
|
||||
docker(:logs, container_name, (" --since #{since}" if since), (" --tail #{lines}" if lines), "--timestamps", "2>&1"),
|
||||
docker(:logs, container_name, ("--since #{since}" if since), ("--tail #{lines}" if lines), ("--timestamps" if timestamps), "2>&1"),
|
||||
("grep '#{grep}'#{" #{grep_options}" if grep_options}" if grep)
|
||||
end
|
||||
|
||||
def follow_logs(host:, grep: nil, grep_options: nil)
|
||||
def follow_logs(host:, timestamps: true, grep: nil, grep_options: nil)
|
||||
run_over_ssh pipe(
|
||||
docker(:logs, container_name, "--timestamps", "--tail", "10", "--follow", "2>&1"),
|
||||
docker(:logs, container_name, ("--timestamps" if timestamps), "--tail", "10", "--follow", "2>&1"),
|
||||
(%(grep "#{grep}"#{" #{grep_options}" if grep_options}) if grep)
|
||||
).join(" "), host: host
|
||||
end
|
||||
|
||||
@@ -2,10 +2,6 @@
|
||||
#
|
||||
# The builder configuration controls how the application is built with `docker build`
|
||||
#
|
||||
# If no configuration is specified, Kamal will:
|
||||
# 1. Create a buildx context called `kamal-local-docker-container`, using the docker-container driver
|
||||
# 2. Use `docker build` to build a multiarch image for linux/amd64,linux/arm64 with that context
|
||||
#
|
||||
# See https://kamal-deploy.org/docs/configuration/builder-examples/ for more information
|
||||
|
||||
# Builder options
|
||||
@@ -78,7 +74,7 @@ builder:
|
||||
|
||||
# Build secrets
|
||||
#
|
||||
# Values are read from the .kamal/secrets.
|
||||
# Values are read from .kamal/secrets.
|
||||
#
|
||||
secrets:
|
||||
- SECRET1
|
||||
|
||||
@@ -36,6 +36,8 @@ image: my-image
|
||||
labels:
|
||||
my-label: my-value
|
||||
|
||||
# Volumes
|
||||
#
|
||||
# Additional volumes to mount into the container
|
||||
volumes:
|
||||
- /path/on/host:/path/in/container:ro
|
||||
@@ -58,7 +60,7 @@ servers:
|
||||
env:
|
||||
...
|
||||
|
||||
# Asset Bridging
|
||||
# Asset Path
|
||||
#
|
||||
# Used for asset bridging across deployments, default to `nil`
|
||||
#
|
||||
@@ -74,6 +76,8 @@ env:
|
||||
# To configure this, set the path to the assets:
|
||||
asset_path: /path/to/assets
|
||||
|
||||
# Hooks path
|
||||
#
|
||||
# Path to hooks, defaults to `.kamal/hooks`
|
||||
# See https://kamal-deploy.org/docs/hooks for more information
|
||||
hooks_path: /user_home/kamal/hooks
|
||||
@@ -83,7 +87,7 @@ hooks_path: /user_home/kamal/hooks
|
||||
# Whether deployments require a destination to be specified, defaults to `false`
|
||||
require_destination: true
|
||||
|
||||
# The primary role
|
||||
# Primary role
|
||||
#
|
||||
# This defaults to `web`, but if you have no web role, you can change this
|
||||
primary_role: workers
|
||||
|
||||
@@ -12,11 +12,16 @@ env:
|
||||
DATABASE_HOST: mysql-db1
|
||||
DATABASE_PORT: 3306
|
||||
|
||||
# Using .kamal/secrets file to load required environment variables
|
||||
# Secrets
|
||||
#
|
||||
# Kamal uses dotenv to automatically load environment variables set in the .kamal/secrets file.
|
||||
# Kamal uses dotenv to automatically load environment variables set in the `.kamal/secrets` file.
|
||||
#
|
||||
# This file can be used to set variables like KAMAL_REGISTRY_PASSWORD or database passwords.
|
||||
# If you are using destinations, secrets will instead be read from `.kamal/secrets-<DESTINATION>` if
|
||||
# it exists.
|
||||
#
|
||||
# Common secrets across all destinations can be set in `.kamal/secrets-common`.
|
||||
#
|
||||
# This file can be used to set variables like `KAMAL_REGISTRY_PASSWORD` or database passwords.
|
||||
# You can use variable or command substitution in the secrets file.
|
||||
#
|
||||
# ```
|
||||
@@ -24,6 +29,14 @@ env:
|
||||
# RAILS_MASTER_KEY=$(cat config/master.key)
|
||||
# ```
|
||||
#
|
||||
# You can also use [secret helpers](../commands/secrets) for some common password managers.
|
||||
# ```
|
||||
# SECRETS=$(kamal secrets fetch ...)
|
||||
#
|
||||
# REGISTRY_PASSWORD=$(kamal secrets extract REGISTRY_PASSWORD $SECRETS)
|
||||
# DB_PASSWORD=$(kamal secrets extract DB_PASSWORD $SECRETS)
|
||||
# ```
|
||||
#
|
||||
# If you store secrets directly in .kamal/secrets, ensure that it is not checked into version control.
|
||||
#
|
||||
# To pass the secrets you should list them under the `secret` key. When you do this the
|
||||
|
||||
@@ -47,7 +47,7 @@ proxy:
|
||||
# Response timeout
|
||||
#
|
||||
# How long to wait for requests to complete before timing out, defaults to 30 seconds
|
||||
response_timeout: 10s
|
||||
response_timeout: 10
|
||||
|
||||
# Healthcheck
|
||||
#
|
||||
@@ -91,7 +91,7 @@ proxy:
|
||||
|
||||
# Forward headers
|
||||
#
|
||||
# Whether to forward the X-Forwarded-For and X-Forwarded-Proto headers (defaults to false)
|
||||
# Whether to forward the X-Forwarded-For and X-Forwarded-Proto headers.
|
||||
#
|
||||
# If you are behind a trusted proxy, you can set this to true to forward the headers.
|
||||
#
|
||||
|
||||
@@ -26,8 +26,12 @@ servers:
|
||||
#
|
||||
# When there are other options to set, the list of hosts goes under the `hosts` key
|
||||
#
|
||||
# By default only the primary role uses a proxy, but you can set `proxy` to change
|
||||
# it.
|
||||
# By default only the primary role uses a proxy.
|
||||
#
|
||||
# For other roles, you can set it to `proxy: true` enable it and inherit the root proxy
|
||||
# configuration or provide a map of options to override the root configuration.
|
||||
#
|
||||
# For the primary role, you can set `proxy: false` to disable the proxy.
|
||||
#
|
||||
# You can also set a custom cmd to run in the container, and overwrite other settings
|
||||
# from the root configuration.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Kamal
|
||||
VERSION = "2.0.0.beta2"
|
||||
VERSION = "2.0.0.rc1"
|
||||
end
|
||||
|
||||
@@ -315,11 +315,11 @@ class CliAppTest < CliTestCase
|
||||
SSHKit::Backend::Abstract.any_instance.stubs(:exec)
|
||||
.with("ssh -t root@1.1.1.1 'sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1| xargs docker logs --timestamps --tail 10 2>&1'")
|
||||
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --tail 100 2>&1", run_command("logs")
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --tail 100 2>&1", run_command("logs")
|
||||
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs 2>&1 | grep 'hey'", run_command("logs", "--grep", "hey")
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps 2>&1 | grep 'hey'", run_command("logs", "--grep", "hey")
|
||||
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs 2>&1 | grep 'hey' -C 2", run_command("logs", "--grep", "hey", "--grep-options", "-C 2")
|
||||
assert_match "sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps 2>&1 | grep 'hey' -C 2", run_command("logs", "--grep", "hey", "--grep-options", "-C 2")
|
||||
end
|
||||
|
||||
test "logs with follow" do
|
||||
|
||||
@@ -111,11 +111,11 @@ class CliProxyTest < CliTestCase
|
||||
|
||||
test "logs" do
|
||||
SSHKit::Backend::Abstract.any_instance.stubs(:capture)
|
||||
.with(:docker, :logs, "kamal-proxy", " --tail 100", "--timestamps", "2>&1")
|
||||
.with(:docker, :logs, "kamal-proxy", "--tail 100", "--timestamps", "2>&1")
|
||||
.returns("Log entry")
|
||||
|
||||
SSHKit::Backend::Abstract.any_instance.stubs(:capture)
|
||||
.with(:docker, :logs, "proxy", " --tail 100", "--timestamps", "2>&1")
|
||||
.with(:docker, :logs, "proxy", "--tail 100", "--timestamps", "2>&1")
|
||||
.returns("Log entry")
|
||||
|
||||
run_command("logs").tap do |output|
|
||||
|
||||
@@ -130,12 +130,20 @@ class CommandsAccessoryTest < ActiveSupport::TestCase
|
||||
assert_equal \
|
||||
"docker logs app-mysql --since 5m --tail 100 --timestamps 2>&1 | grep 'thing' -C 2",
|
||||
new_command(:mysql).logs(since: "5m", lines: 100, grep: "thing", grep_options: "-C 2").join(" ")
|
||||
|
||||
assert_equal \
|
||||
"docker logs app-mysql --since 5m --tail 100 2>&1 | grep 'thing' -C 2",
|
||||
new_command(:mysql).logs(timestamps: false, since: "5m", lines: 100, grep: "thing", grep_options: "-C 2").join(" ")
|
||||
end
|
||||
|
||||
test "follow logs" do
|
||||
assert_equal \
|
||||
"ssh -t root@1.1.1.5 -p 22 'docker logs app-mysql --timestamps --tail 10 --follow 2>&1'",
|
||||
new_command(:mysql).follow_logs
|
||||
|
||||
assert_equal \
|
||||
"ssh -t root@1.1.1.5 -p 22 'docker logs app-mysql --tail 10 --follow 2>&1'",
|
||||
new_command(:mysql).follow_logs(timestamps: false)
|
||||
end
|
||||
|
||||
test "remove container" do
|
||||
|
||||
@@ -129,49 +129,49 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
|
||||
test "logs" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs 2>&1",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps 2>&1",
|
||||
new_command.logs.join(" ")
|
||||
end
|
||||
|
||||
test "logs with since" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --since 5m 2>&1",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --since 5m 2>&1",
|
||||
new_command.logs(since: "5m").join(" ")
|
||||
end
|
||||
|
||||
test "logs with lines" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --tail 100 2>&1",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --tail 100 2>&1",
|
||||
new_command.logs(lines: "100").join(" ")
|
||||
end
|
||||
|
||||
test "logs with since and lines" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --since 5m --tail 100 2>&1",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --since 5m --tail 100 2>&1",
|
||||
new_command.logs(since: "5m", lines: "100").join(" ")
|
||||
end
|
||||
|
||||
test "logs with grep" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs 2>&1 | grep 'my-id'",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps 2>&1 | grep 'my-id'",
|
||||
new_command.logs(grep: "my-id").join(" ")
|
||||
end
|
||||
|
||||
test "logs with grep and grep options" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs 2>&1 | grep 'my-id' -C 2",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps 2>&1 | grep 'my-id' -C 2",
|
||||
new_command.logs(grep: "my-id", grep_options: "-C 2").join(" ")
|
||||
end
|
||||
|
||||
test "logs with since, grep and grep options" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --since 5m 2>&1 | grep 'my-id' -C 2",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --since 5m 2>&1 | grep 'my-id' -C 2",
|
||||
new_command.logs(since: "5m", grep: "my-id", grep_options: "-C 2").join(" ")
|
||||
end
|
||||
|
||||
test "logs with since and grep" do
|
||||
assert_equal \
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --since 5m 2>&1 | grep 'my-id'",
|
||||
"sh -c 'docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''{{.ID}}'\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting' | head -1 | xargs docker logs --timestamps --since 5m 2>&1 | grep 'my-id'",
|
||||
new_command.logs(since: "5m", grep: "my-id").join(" ")
|
||||
end
|
||||
|
||||
@@ -191,6 +191,10 @@ class CommandsAppTest < ActiveSupport::TestCase
|
||||
assert_equal \
|
||||
"ssh -t root@app-1 -p 22 'sh -c '\\''docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''\\'\\'''\\''{{.ID}}'\\''\\'\\'''\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting'\\'' | head -1 | xargs docker logs --timestamps --tail 123 --follow 2>&1 | grep \"Completed\"'",
|
||||
new_command.follow_logs(host: "app-1", lines: 123, grep: "Completed")
|
||||
|
||||
assert_equal \
|
||||
"ssh -t root@app-1 -p 22 'sh -c '\\''docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting --filter ancestor=$(docker image ls --filter reference=dhh/app:latest --format '\\''\\'\\'''\\''{{.ID}}'\\''\\'\\'''\\'') ; docker ps --latest --quiet --filter label=service=app --filter label=role=web --filter status=running --filter status=restarting'\\'' | head -1 | xargs docker logs --tail 123 --follow 2>&1 | grep \"Completed\"'",
|
||||
new_command.follow_logs(host: "app-1", timestamps: false, lines: 123, grep: "Completed")
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -67,16 +67,22 @@ class CommandsProxyTest < ActiveSupport::TestCase
|
||||
|
||||
test "proxy logs since 2h" do
|
||||
assert_equal \
|
||||
"docker logs kamal-proxy --since 2h --timestamps 2>&1",
|
||||
"docker logs kamal-proxy --since 2h --timestamps 2>&1",
|
||||
new_command.logs(since: "2h").join(" ")
|
||||
end
|
||||
|
||||
test "proxy logs last 10 lines" do
|
||||
assert_equal \
|
||||
"docker logs kamal-proxy --tail 10 --timestamps 2>&1",
|
||||
"docker logs kamal-proxy --tail 10 --timestamps 2>&1",
|
||||
new_command.logs(lines: 10).join(" ")
|
||||
end
|
||||
|
||||
test "proxy logs without timestamps" do
|
||||
assert_equal \
|
||||
"docker logs kamal-proxy 2>&1",
|
||||
new_command.logs(timestamps: false).join(" ")
|
||||
end
|
||||
|
||||
test "proxy logs with grep hello!" do
|
||||
assert_equal \
|
||||
"docker logs kamal-proxy --timestamps 2>&1 | grep 'hello!'",
|
||||
|
||||
Reference in New Issue
Block a user