Compare commits

...
Sign in to create a new pull request.

33 commits

Author SHA1 Message Date
Packit
dfa0f5cd2b Update to 1.26 upstream release
Upstream tag: 1.26
Upstream commit: 3241e671

Commit authored by Packit automation (https://packit.dev/)
2025-12-22 16:06:48 +00:00
Packit
94c3dc6bac Update to 1.25.1 upstream release
Upstream tag: 1.25.1
Upstream commit: 156ae065

Commit authored by Packit automation (https://packit.dev/)
2025-11-25 14:50:56 +00:00
Packit
584087122b Update to 1.25 upstream release
Upstream tag: 1.25
Upstream commit: d9a0adce

Commit authored by Packit automation (https://packit.dev/)
2025-11-10 13:34:54 +00:00
Packit
fa91863b11 Update to 1.24 upstream release
Upstream tag: 1.24
Upstream commit: 54693209

Commit authored by Packit automation (https://packit.dev/)
2025-09-09 20:19:46 +00:00
Packit
dec4e2f02c Update to 1.23.1 upstream release
Upstream tag: 1.23.1
Upstream commit: d20b23db

Commit authored by Packit automation (https://packit.dev/)
2025-07-31 20:31:37 +00:00
Packit
de0aacca89 Update to 1.23 upstream release
Upstream tag: 1.23
Upstream commit: 3fc25616

Commit authored by Packit automation (https://packit.dev/)
2025-07-24 20:40:07 +00:00
Fedora Release Engineering
d8749367c8 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-23 18:52:31 +00:00
Packit
554bf1b07a Update to 1.22 upstream release
Upstream tag: 1.22
Upstream commit: 4de19b63

Commit authored by Packit automation (https://packit.dev/)
2025-06-27 13:22:58 +00:00
Kristina Hanicova
3b0f113331 Revert "Disable criu support on riscv64"
This reverts commit 3024c6913e.
2025-04-30 13:53:44 +02:00
Packit
a0b4675434 Update to 1.21 upstream release
Upstream tag: 1.21
Upstream commit: 10269840

Commit authored by Packit automation (https://packit.dev/)
2025-03-28 08:38:07 +00:00
Lokesh Mandvekar
890408dccf
fix gating config 2025-02-10 19:59:24 +05:30
Packit
3c8e9346f2 Update to 1.20 upstream release
Upstream tag: 1.20
Upstream commit: 9c9a76ac

Commit authored by Packit automation (https://packit.dev/)
2025-02-05 08:39:36 +00:00
Fedora Release Engineering
ddd2534e35 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-16 14:57:04 +00:00
Lokesh Mandvekar
5025451057
TMT: use prepare conditionals
Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org>
2025-01-15 18:25:43 +05:30
Lokesh Mandvekar
b6aa0a8fdf
TMT: sync tests from upstream
Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org>
2024-12-26 21:09:37 +05:30
Packit
a4cf7dd241 Update to 1.19.1 upstream release
Upstream tag: 1.19.1
Upstream commit: 3e32a70c

Commit authored by Packit automation (https://packit.dev/)
2024-12-17 20:53:08 +00:00
Packit
3a2e4feb28 Update to 1.19 upstream release
Upstream tag: 1.19
Upstream commit: db31c42a

Commit authored by Packit automation (https://packit.dev/)
2024-12-06 14:47:31 +00:00
Packit
4e043cf9e0 Update to 1.18.2 upstream release
Upstream tag: 1.18.2
Upstream commit: 00ab38af

Commit authored by Packit automation (https://packit.dev/)
2024-10-31 16:46:35 +00:00
Packit
37d91b502e Update to 1.18.1 upstream release
Upstream tag: 1.18.1
Upstream commit: c41f034f

Commit authored by Packit automation (https://packit.dev/)
2024-10-30 11:04:35 +00:00
Packit
01e5e28680 Update to 1.18 upstream release
Upstream tag: 1.18
Upstream commit: 8656b254

Commit authored by Packit automation (https://packit.dev/)
2024-10-22 13:01:49 +00:00
Yaakov Selkowitz
366d677a3b Use embedded yajl in RHEL builds
https://github.com/containers/crun/pull/1583
https://gitlab.com/redhat/centos-stream/rpms/crun/-/merge_requests/102
2024-10-21 15:24:03 -04:00
David Abdurachmanov
3024c6913e Disable criu support on riscv64
criu is not ported to riscv64 arch.

Signed-off-by: David Abdurachmanov <davidlt@rivosinc.com>
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
2024-09-26 14:47:59 +02:00
Lokesh Mandvekar
b8cbee4f44
bump to 1.17 2024-09-10 15:49:12 +05:30
Fedora Release Engineering
675a199edb Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-17 20:16:14 +00:00
Packit
15fe108e10 Update to 1.15 upstream release
Upstream tag: 1.15
Upstream commit: e6eacaf4

Commit authored by Packit automation (https://packit.dev/)
2024-05-02 11:52:55 +00:00
Lokesh Mandvekar
7d471b682c
wasmedge should stay enabled for official fedora 2024-03-27 21:24:24 +05:30
Lokesh Mandvekar
2f7268f661
remove eln macro
Resolves: #2271814

Signed-off-by: Lokesh Mandvekar <lsm5@redhat.com>
2024-03-27 21:09:03 +05:30
Giuseppe Scrivano
d70c46713e
Revert "Add riscv64 support."
This reverts commit 73b7137ed8.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
2024-03-05 22:06:08 +01:00
Giuseppe Scrivano
1ae74567c2 Merge #60 Add riscv64 support 2024-03-05 11:57:38 +00:00
JasenChao
73b7137ed8 Add riscv64 support. 2024-03-05 19:52:42 +08:00
Packit
2807443b74 [packit] 1.14.4 upstream release
Upstream tag: 1.14.4
Upstream commit: a220ca66
2024-02-29 17:46:46 +00:00
Packit
a5344701e7 [packit] 1.14.3 upstream release
Upstream tag: 1.14.3
Upstream commit: 1961d211
2024-02-17 08:36:04 +00:00
Packit
f133fdfcb3 [packit] 1.14.2 upstream release
Upstream tag: 1.14.2
Upstream commit: 32b139f7
2024-02-16 17:13:05 +00:00
15 changed files with 537 additions and 48 deletions

1
.fmf/version Normal file
View file

@ -0,0 +1 @@
1

19
.gitignore vendored
View file

@ -83,3 +83,22 @@ crun-0.1.1.tar.gz
/crun-1.13.tar.xz
/crun-1.14.tar.xz
/crun-1.14.1.tar.xz
/crun-1.14.2.tar.xz
/crun-1.14.3.tar.xz
/crun-1.14.4.tar.xz
/crun-1.15.tar.zst
/crun-1.17.tar.zst
/crun-1.18.tar.zst
/crun-1.18.1.tar.zst
/crun-1.18.2.tar.zst
/crun-1.19.tar.zst
/crun-1.19.1.tar.zst
/crun-1.20.tar.zst
/crun-1.21.tar.zst
/crun-1.22.tar.zst
/crun-1.23.tar.zst
/crun-1.23.1.tar.zst
/crun-1.24.tar.zst
/crun-1.25.tar.zst
/crun-1.25.1.tar.zst
/crun-1.26.tar.zst

View file

@ -2,12 +2,42 @@
# See the documentation for more information:
# https://packit.dev/docs/configuration/
specfile_path: rpm/crun.spec
downstream_package_name: crun
# Ref: https://packit.dev/docs/configuration#files_to_sync
files_to_sync:
- src: rpm/gating.yaml
dest: gating.yaml
- src: plans/
dest: plans/
delete: true
mkpath: true
- src: tests/tmt/
dest: tests/tmt/
delete: true
mkpath: true
- src: .fmf/
dest: .fmf/
delete: true
mkpath: true
- .packit.yaml
packages:
crun-fedora:
pkg_tool: fedpkg
specfile_path: rpm/crun.spec
crun-centos:
pkg_tool: centpkg
specfile_path: rpm/crun.spec
crun-eln:
specfile_path: rpm/crun.spec
srpm_build_deps:
- git-archive-all
- make
actions:
# This action runs only on copr build jobs
create-archive:
- "git-archive-all -v --force-submodules rpm/crun-HEAD.tar.xz"
- bash -c "ls -1 rpm/crun-HEAD.tar.xz"
@ -15,24 +45,36 @@ actions:
jobs:
- job: copr_build
trigger: pull_request
notifications:
packages: [crun-fedora]
notifications: &copr_build_failure_notification
failure_comment:
message: "Ephemeral COPR build failed. @containers/packit-build please check."
targets:
targets: &fedora_copr_targets
- fedora-all-x86_64
- fedora-all-aarch64
- job: copr_build
trigger: pull_request
packages: [crun-eln]
notifications: *copr_build_failure_notification
targets:
- fedora-eln-x86_64
- fedora-eln-aarch64
- centos-stream+epel-next-8-x86_64
- centos-stream+epel-next-8-aarch64
- centos-stream+epel-next-9-x86_64
- centos-stream+epel-next-9-aarch64
additional_repos:
- "copr://rhcontainerbot/podman-next"
- job: copr_build
trigger: pull_request
packages: [crun-centos]
notifications: *copr_build_failure_notification
targets: &centos_copr_targets
- centos-stream-9-x86_64
- centos-stream-9-aarch64
- centos-stream-10-x86_64
- centos-stream-10-aarch64
# Run on commit to main branch
- job: copr_build
trigger: commit
packages: [crun-fedora]
notifications:
failure_comment:
message: "podman-next COPR build failed. @containers/packit-build please check."
@ -40,18 +82,59 @@ jobs:
owner: rhcontainerbot
project: podman-next
# Podman system tests for Fedora and CentOS Stream
- job: tests
trigger: pull_request
packages: [crun-fedora]
notifications: &test_failure_notification
failure_comment:
message: "TMT tests failed. @containers/packit-build please check."
targets: *fedora_copr_targets
tf_extra_params:
environments:
- artifacts:
- type: repository-file
id: https://copr.fedorainfracloud.org/coprs/rhcontainerbot/podman-next/repo/fedora-$releasever/rhcontainerbot-podman-next-fedora-$releasever.repo
# Podman system tests for CentOS Stream
- job: tests
trigger: pull_request
packages: [crun-centos]
notifications: *test_failure_notification
# TODO: Re-enable centos-stream-10-x86_64 once criu issues are solved
# Ref: https://github.com/containers/crun/pull/1758#issuecomment-2901772392
# Issue filed: https://github.com/containers/crun/issues/1759
#targets: *centos_copr_targets
targets:
- centos-stream-9-x86_64
- centos-stream-9-aarch64
- centos-stream-10-aarch64
tf_extra_params:
environments:
- artifacts:
- type: repository-file
id: https://copr.fedorainfracloud.org/coprs/rhcontainerbot/podman-next/repo/centos-stream-$releasever/rhcontainerbot-podman-next-centos-stream-$releasever.repo
- job: propose_downstream
trigger: release
update_release: false
dist_git_branches:
packages: [crun-fedora]
dist_git_branches: &fedora_targets
- fedora-all
# Disabled until we're switching to Packit for CentOS Stream
- job: propose_downstream
trigger: ignore
packages: [crun-centos]
dist_git_branches:
- c10s
- job: koji_build
trigger: commit
dist_git_branches:
- fedora-all
packages: [crun-fedora]
dist_git_branches: *fedora_targets
- job: bodhi_update
trigger: commit
packages: [crun-fedora]
dist_git_branches:
- fedora-branched # rawhide updates are created automatically

View file

@ -1,3 +1,3 @@
This repository is maintained by packit.
https://packit.dev/
The file was generated using packit 0.90.0.post1.dev9+g1f0325d1.
The file was generated using packit 1.13.0.post1.dev2+g84134016c.

View file

@ -1,34 +1,36 @@
%global krun_opts %{nil}
%global wasmedge_opts %{nil}
%global wasmtime_opts %{nil}
%global yajl_opts %{nil}
# krun and wasm[edge,time] support only on aarch64 and x86_64
%if %{defined copr_username}
%define copr_build 1
%endif
# krun and wasm support only on aarch64 and x86_64
%ifarch aarch64 || x86_64
%global wasm_support 1
# wasmedge not present on Fedora ELN environments
%if !0%{?eln}
%if %{defined fedora}
# krun only exists on fedora
%global krun_support 1
%global krun_opts --with-libkrun
# Keep wasmedge enabled only on Fedora. It breaks a lot on EPEL.
%global wasm_support 1
%global wasmedge_support 1
%global wasmedge_opts --with-wasmedge
%endif
# krun only exists on fedora
%if %{defined fedora}
%global krun_support 1
%global krun_opts --with-libkrun
%endif
# wasmtime exists only on podman-next copr for now
%if %{defined copr_project} && "%{?copr_project}" == "podman-next"
%global wasmtime_support 1
%global wasmtime_opts --with-wasmtime
%endif
%if %{defined fedora} || (%{defined rhel} && 0%{?rhel} < 10)
%global system_yajl 1
%else
%global yajl_opts --enable-embedded-yajl
%endif
Summary: OCI runtime written in C
Name: crun
%if %{defined copr_username}
%if %{defined copr_build}
Epoch: 102
%endif
# DO NOT TOUCH the Version string!
@ -37,10 +39,10 @@ Epoch: 102
# If that's what you're reading, Version must be 0, and will be updated by Packit for
# copr and koji builds.
# If you're reading this on dist-git, the version is automatically filled in by Packit.
Version: 1.14.1
Version: 1.26
Release: %autorelease
URL: https://github.com/containers/%{name}
Source0: %{url}/releases/download/%{version}/%{name}-%{version}.tar.xz
Source0: %{url}/releases/download/%{version}/%{name}-%{version}.tar.zst
License: GPL-2.0-only
%if %{defined golang_arches_future}
ExclusiveArch: %{golang_arches_future}
@ -57,7 +59,9 @@ BuildRequires: libcap-devel
BuildRequires: libkrun-devel
%endif
BuildRequires: systemd-devel
%if %{defined system_yajl}
BuildRequires: yajl-devel
%endif
BuildRequires: libseccomp-devel
BuildRequires: python3-libmount
BuildRequires: libtool
@ -68,14 +72,8 @@ Recommends: criu-libs
%if %{defined wasmedge_support}
BuildRequires: wasmedge-devel
%endif
%if %{defined wasmtime_support}
BuildRequires: wasmtime-c-api-devel
%endif
%if %{defined rhel} && 0%{?rhel} == 8
BuildRequires: python3
%else
BuildRequires: python
%endif
BuildRequires: glibc-static
Provides: oci-runtime
%description
@ -96,7 +94,11 @@ krun is a symlink to the %{name} binary, with libkrun as an additional dependenc
%package wasm
Summary: %{name} with wasm support
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
# wasm packages are not present on RHEL yet and are currently a PITA to test
# Best to only include wasmedge as weak dep on rhel
%if %{defined fedora}
Requires: wasm-library
%endif
Recommends: wasmedge
%description wasm
@ -108,20 +110,15 @@ Recommends: wasmedge
%build
./autogen.sh
./configure --disable-silent-rules %{krun_opts} %{wasmedge_opts} %{wasmtime_opts}
./configure --disable-silent-rules %{krun_opts} %{wasmedge_opts} %{yajl_opts}
%make_build
%install
%make_install prefix=%{_prefix}
rm -rf %{buildroot}%{_prefix}/lib*
%if %{defined krun_support}
ln -s %{_bindir}/%{name} %{buildroot}%{_bindir}/krun
%endif
%if %{defined wasm_support}
ln -s %{_bindir}/%{name} %{buildroot}%{_bindir}/%{name}-wasm
%endif
# Placeholder check to silence rpmlint
%check
%files
%license COPYING

15
gating.yaml Normal file
View file

@ -0,0 +1,15 @@
--- !Policy
product_versions:
- fedora-*
decision_contexts:
- bodhi_update_push_stable
- bodhi_update_push_testing
rules:
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
--- !Policy
product_versions:
- rhel-*
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

40
plans/main.fmf Normal file
View file

@ -0,0 +1,40 @@
discover:
how: fmf
execute:
how: tmt
prepare:
- when: distro == centos-stream or distro == rhel
how: shell
script: |
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm --eval '%{?rhel}').noarch.rpm
dnf -y config-manager --set-enabled epel
order: 10
- when: initiator == packit
how: shell
script: |
COPR_REPO_FILE="/etc/yum.repos.d/*podman-next*.repo"
if compgen -G $COPR_REPO_FILE > /dev/null; then
sed -i -n '/^priority=/!p;$apriority=1' $COPR_REPO_FILE
fi
dnf -y upgrade --allowerasing
order: 20
- how: install
package:
- bats
- crun
- podman-tests
/shellcheck:
discover+:
filter: 'tag:shellcheck'
enabled: true
adjust:
enabled: false
when: distro == centos-stream-10 or distro == rhel-10
prepare+:
- how: install
package: ShellCheck
/tests:
discover+:
filter: 'tag:podman | tag:sanity'

9
plans/tmt.fmf Normal file
View file

@ -0,0 +1,9 @@
/:
inherit: false
summary: Run tmt's integration tests
plan:
import:
url: https://github.com/teemtee/tmt
path: /plans/friends
name: /podman

View file

@ -1 +1 @@
SHA512 (crun-1.14.1.tar.xz) = 4a45941e8257b5180e30bcd5b40837c632261187508693002c02c33764bc8e031a3c9345d8a5e5989a5427c7f237595c457f1eb8cdc7967867976cc4abe6bc5a
SHA512 (crun-1.26.tar.zst) = 0785af6095a26290f433c5739bea5d98a029c3f0e8efbeed420481849ebddd70acde6c1105133c392abf26bca90d232cced5e5994da7506d66a020a02c129fb3

View file

@ -0,0 +1,7 @@
adjust:
duration: 10m
when: arch == aarch64
summary: Run crun specific Podman tests
test: bash ./system-test.sh
tag: [ podman ]

View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -exo pipefail
if [[ "$(id -u)" -ne 0 ]];then
echo "Please run this script as superuser"
exit 1
fi
cat /etc/redhat-release
rpm -q conmon containers-common crun podman podman-tests
# Run crun specific podman tests
bats -t /usr/share/podman/test/system/030-run.bats
bats -t /usr/share/podman/test/system/075-exec.bats
bats -t /usr/share/podman/test/system/280-update.bats
bats -t /usr/share/podman/test/system/520-checkpoint.bats

View file

@ -0,0 +1,180 @@
{
"ociVersion": "1.0.0",
"process": {
"terminal": false,
"user": {
"uid": 0,
"gid": 0
},
"args": [
"sleep", "10"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/",
"capabilities": {
"bounding": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"effective": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"inheritable": [
],
"permitted": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"ambient": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
]
},
"rlimits": [
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
}
],
"noNewPrivileges": true
},
"root": {
"path": "rootfs",
"readonly": true
},
"hostname": "crun",
"mounts": [
{
"destination": "/proc",
"type": "proc",
"source": "proc"
},
{
"destination": "/dev",
"type": "tmpfs",
"source": "tmpfs",
"options": [
"nosuid",
"strictatime",
"mode=755",
"size=65536k"
]
},
{
"destination": "/dev/pts",
"type": "devpts",
"source": "devpts",
"options": [
"nosuid",
"noexec",
"newinstance",
"ptmxmode=0666",
"mode=0620",
"gid=5"
]
},
{
"destination": "/dev/shm",
"type": "tmpfs",
"source": "shm",
"options": [
"nosuid",
"noexec",
"nodev",
"mode=1777",
"size=65536k"
]
},
{
"destination": "/dev/mqueue",
"type": "mqueue",
"source": "mqueue",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys",
"type": "sysfs",
"source": "sysfs",
"options": [
"nosuid",
"noexec",
"nodev",
"ro"
]
},
{
"destination": "/sys/fs/cgroup",
"type": "cgroup",
"source": "cgroup",
"options": [
"nosuid",
"noexec",
"nodev",
"relatime",
"ro"
]
}
],
"linux": {
"resources": {
"devices": [
{
"allow": false,
"access": "rwm"
}
]
},
"namespaces": [
{
"type": "pid"
},
{
"type": "network"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "cgroup"
},
{
"type": "mount"
}
],
"maskedPaths": [
"/proc/acpi",
"/proc/asound",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/sys/firmware",
"/proc/scsi"
],
"readonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
}
}

View file

@ -0,0 +1,4 @@
summary: Sanity test for crun
test: bash ./runtest.sh
duration: 10m
tag: [ sanity ]

113
tests/tmt/sanity/runtest.sh Normal file
View file

@ -0,0 +1,113 @@
#!/usr/bin/env bash
set -exo pipefail
TEMPDIR=$(mktemp -d)
TESTIMG="quay.io/libpod/busybox"
CNAME="mycont-$RANDOM"
cat /etc/redhat-release
uname -r
rpm -q crun criu
if ! crun --version; then
exit 1
fi
if ! crun features; then
exit 1
fi
if ! crun list; then
exit 1
fi
# create the top most bundle and rootfs directory
mkdir -p "$TEMPDIR"/rootfs
# export busybox via podman into the rootfs directory
if ! (podman export "$(podman create $TESTIMG)" | tar -C "$TEMPDIR"/rootfs -xvf -); then
exit 1
fi
# use existing spec
cp ./config.json "$TEMPDIR"
ls "$TEMPDIR"
cd "$TEMPDIR"
if ! crun create $CNAME; then
exit 1
fi
if ! crun list; then
exit 1
fi
if ! crun start $CNAME; then
exit 1
fi
if ! crun list; then
exit 1
fi
if ! crun state $CNAME; then
exit 1
fi
if ! crun ps $CNAME; then
exit 1
fi
if ! ret=$(crun exec $CNAME pwd) || [[ "$ret" != '/' ]]; then
exit 1
fi
if ! crun pause $CNAME; then
exit 1
fi
if ! crun state $CNAME; then
exit 1
fi
if ! crun resume $CNAME; then
exit 1
fi
if ! crun state $CNAME; then
exit 1
fi
if ! ret=$(crun exec $CNAME pwd) || [[ "$ret" != '/' ]]; then
exit 1
fi
if ! crun delete --force $CNAME; then
exit 1
fi
if ! crun list; then
exit 1
fi
if ! (crun run $CNAME &); then
exit 1
fi
if ! crun list; then
exit 1
fi
# make sure the container is running state
sleep 2
if ! ret=$(crun exec $CNAME echo 'ok') || [[ "$ret" != 'ok' ]]; then
exit 1
fi
if ! crun kill $CNAME; then
exit 1
fi
exit 0

View file

@ -0,0 +1,4 @@
summary: Shellcheck tests
test: find ../ -type f -name "*.sh" -exec shellcheck {} +
duration: 10m
tag: [ shellcheck ]