diff --git a/src/docker/assets.ts b/src/docker/assets.ts index d90c645..b1286b3 100644 --- a/src/docker/assets.ts +++ b/src/docker/assets.ts @@ -231,6 +231,7 @@ provision: script: | #!/bin/bash set -eux -o pipefail + archiveInstallLog=/var/log/docker-actions-toolkit-archive-install.log command -v docker >/dev/null 2>&1 && exit 0 if [ ! -e /etc/systemd/system/docker.socket.d/override.conf ]; then mkdir -p /etc/systemd/system/docker.socket.d @@ -248,12 +249,14 @@ provision: fi export DEBIAN_FRONTEND=noninteractive if [ "{{srcType}}" == "archive" ]; then - curl -fsSL https://get.docker.com | sh -s -- --channel {{srcArchiveChannel}} --version {{srcArchiveVersion}} - sed -i 's|^ExecStart=.*|ExecStart=/usr/bin/dockerd -H fd://{{#if localTCPPort}} -H tcp://0.0.0.0:2375{{/if}} --containerd=/run/containerd/containerd.sock|' /usr/lib/systemd/system/docker.service - systemctl daemon-reload - systemctl restart docker - systemctl status docker.socket || true - systemctl status docker.service || true + { + curl -fsSL https://get.docker.com | sh -s -- --channel {{srcArchiveChannel}} --version {{srcArchiveVersion}} + sed -i 's|^ExecStart=.*|ExecStart=/usr/bin/dockerd -H fd://{{#if localTCPPort}} -H tcp://0.0.0.0:2375{{/if}} --containerd=/run/containerd/containerd.sock|' /usr/lib/systemd/system/docker.service + systemctl daemon-reload + systemctl restart docker + systemctl status docker.socket || true + systemctl status docker.service || true + } 2>&1 | tee "$archiveInstallLog" elif [ "{{srcType}}" == "image" ]; then arch=$(uname -m) case $arch in diff --git a/src/docker/install.ts b/src/docker/install.ts index cfcf616..2e56ea7 100644 --- a/src/docker/install.ts +++ b/src/docker/install.ts @@ -326,6 +326,7 @@ export class Install { try { await Exec.exec(`limactl ${limaStartArgs.join(' ')}`, [], {env: envs}); } catch (e) { + await this.printDarwinDiagnostics(); fsp .readdir(limaDir) .then(files => { @@ -539,11 +540,7 @@ EOF`, } private async tearDownDarwin(): Promise { - await core.group('Docker daemon logs', async () => { - await Exec.exec('limactl', ['shell', '--tty=false', this.limaInstanceName, 'sudo', 'journalctl', '-u', 'docker.service', '-l', '--no-pager']).catch(() => { - core.warning(`Failed to get Docker daemon logs`); - }); - }); + await this.printDarwinDiagnostics(); await core.group('Stopping lima instance', async () => { await Exec.exec('limactl', ['stop', '--tty=false', this.limaInstanceName, '--force']); }); @@ -558,6 +555,36 @@ EOF`, }); } + private async printDarwinDiagnostics(): Promise { + await this.printDarwinGuestCommandOutput('Cloud-init output log', ['sudo', 'cat', '/var/log/cloud-init-output.log']); + await this.printDarwinGuestCommandOutput('Cloud-init status', ['sudo', 'timeout', '300s', 'cloud-init', 'status', '--wait']); + await this.printDarwinGuestCommandOutput('Docker unit file', ['sudo', 'systemctl', 'cat', 'docker.service']); + await this.printDarwinGuestCommandOutput('Docker service status', ['sudo', 'systemctl', 'status', 'docker.service', 'docker.socket', '-l', '--no-pager']); + await this.printDarwinGuestCommandOutput('Archive install script log', ['sudo', 'cat', '/var/log/docker-actions-toolkit-archive-install.log']); + await this.printDarwinGuestCommandOutput('Docker daemon logs', ['sudo', 'journalctl', '-u', 'docker.service', '-l', '--no-pager']); + } + + private async printDarwinGuestCommandOutput(title: string, args: string[]): Promise { + await core.group(title, async () => { + const res = await Exec.getExecOutput('limactl', ['shell', '--tty=false', this.limaInstanceName, ...args], { + ignoreReturnCode: true, + silent: true + }).catch(error => { + core.info(`Failed to get ${title}: ${error}`); + return undefined; + }); + if (!res) { + return; + } + const output = [res.stdout.trim(), res.stderr.trim()].filter(Boolean).join('\n'); + if (output.length > 0) { + core.info(output); + } else if (res.exitCode !== 0) { + core.info(`${title} exited with code ${res.exitCode}`); + } + }); + } + private async tearDownLinux(): Promise { await core.group('Docker daemon logs', async () => { core.info(fs.readFileSync(path.join(this.runDir, 'dockerd.log'), {encoding: 'utf8'}));