@@ -9,13 +9,22 @@ cd -- "$(dirname -- "$0")"/..
99# GITHUB_TOKEN=$(gh auth token) ./tools/tidy.sh
1010#
1111# Note: This script requires the following tools:
12- # - docker
12+ # - docker or podman (or compatible CLI specified by TIDY_DOCKER_PATH. when both available and TIDY_DOCKER_PATH is not set, docker is preferred)
1313#
1414# This script is shared by projects under github.com/taiki-e, so there may also
1515# be checks for files not included in this repository, but they will be skipped
1616# if the corresponding files do not exist.
1717# It is not intended for manual editing.
1818
19+ bail () {
20+ if [[ -n " ${GITHUB_ACTIONS:- } " ]]; then
21+ printf ' ::error::%s\n' " $* "
22+ else
23+ printf >&2 ' error: %s\n' " $* "
24+ fi
25+ exit 1
26+ }
27+
1928if [[ $# -gt 0 ]]; then
2029 cat << EOF
2130USAGE:
2433 exit 1
2534fi
2635
36+ image=' ghcr.io/taiki-e/tidy'
2737if [[ -n " ${TIDY_DEV:- } " ]]; then
28- image= " ghcr.io/taiki-e/tidy :latest"
38+ image+= ' :latest'
2939else
30- image= " ghcr.io/taiki-e/tidy @sha256:c78ba09aa420feddc57ca76fca38b1d4c998a0ede37f76378f12df15a826cf59 "
40+ image+= ' @sha256:151cd5c4f7c88bd21322c7dab255d60e699ffe4d4903e4e712429952537df6cf '
3141fi
3242user=" $( id -u) :$( id -g) "
33- workdir=$( pwd )
43+ workdir=" ${PWD} "
3444tmp=$( mktemp -d)
3545trap -- ' rm -rf -- "${tmp:?}"' EXIT
3646mkdir -p -- " ${tmp} " /{pwsh-cache,pwsh-local,zizmor-cache,dummy-dir,tmp}
@@ -40,8 +50,12 @@ color=''
4050if [[ -t 1 ]] || [[ -n " ${GITHUB_ACTIONS:- } " ]]; then
4151 color=1
4252fi
53+ # Refs:
54+ # - https://docs.docker.com/reference/cli/docker/container/run/
55+ # - https://docs.podman.io/en/latest/markdown/podman-run.1.html
56+ # - https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
4357common_args=(
44- run --rm --init -i --user " ${user} "
58+ run --rm --init
4559 --cap-drop=all
4660 --security-opt=no-new-privileges
4761 --read-only
@@ -59,6 +73,30 @@ common_args=(
5973 --env TIDY_EXPECTED_SHELL_FILE_COUNT
6074 --env TIDY_EXPECTED_DOCKER_FILE_COUNT
6175)
76+ if [[ -n " ${TIDY_DOCKER_PATH:- } " ]]; then
77+ docker=" ${TIDY_DOCKER_PATH} "
78+ elif type -P docker > /dev/null; then
79+ docker=' docker'
80+ elif type -P podman > /dev/null; then
81+ docker=' podman'
82+ else
83+ bail ' this script requires docker or podman'
84+ fi
85+ rootless=' '
86+ if [[ " $( " ${docker} " --version) " == * ' podman' * ]]; then
87+ if [[ " $( " ${docker} " info) " == * ' rootless: true' * ]]; then
88+ rootless=1
89+ fi
90+ elif [[ " $( " ${docker} " info -f ' {{println .SecurityOptions}}' ) " == * ' rootless' * ]]; then
91+ rootless=1
92+ fi
93+ if [[ -n " ${rootless} " ]]; then
94+ printf ' docker path: %s\n' " ${docker} (rootless)"
95+ else
96+ printf ' docker path: %s\n' " ${docker} "
97+ common_args+=(--user " ${user} " )
98+ fi
99+
62100# Map ignored files (e.g., .env) to dummy files.
63101while IFS= read -r path; do
64102 if [[ -d " ${path} " ]]; then
@@ -73,36 +111,33 @@ while IFS= read -r path; do
73111done < <( git status --porcelain --ignored | grep -E ' ^!!' | cut -d' ' -f2)
74112
75113docker_run () {
76- docker " ${common_args[@]} " " $@ "
114+ local script=" $1 "
115+ shift
116+ " ${docker} " " ${common_args[@]} " " $@ " " ${image} " /checks/" ${script} "
77117 code2=" $? "
78118 if [[ ${code} -eq 0 ]] && [[ ${code2} -ne 0 ]]; then
79119 code=" ${code2} "
80120 fi
81121}
82122
83123set +e
84- docker_run \
124+ docker_run offline.sh \
85125 --mount " type=bind,source=${workdir} ,target=${workdir} " --workdir " ${workdir} " \
126+ --mount " type=bind,source=${workdir} /.git,target=${workdir} /.git,readonly" \
86127 --mount " type=bind,source=${tmp} /tmp,target=/tmp/tidy" \
87128 --mount " type=bind,source=${tmp} /pwsh-cache,target=/.cache/powershell" \
88129 --mount " type=bind,source=${tmp} /pwsh-local,target=/.local/share/powershell" \
89- --network=none \
90- " ${image} " \
91- /checks/offline.sh
130+ --network=none
92131# Some good audits requires access to GitHub API.
93- docker_run \
132+ docker_run zizmor.sh \
94133 --mount " type=bind,source=${workdir} ,target=${workdir} ,readonly" --workdir " ${workdir} " \
95134 --mount " type=bind,source=${tmp} /zizmor-cache,target=/.cache/zizmor" \
96- --env GH_TOKEN --env GITHUB_TOKEN --env ZIZMOR_GITHUB_TOKEN \
97- " ${image} " \
98- /checks/zizmor.sh
135+ --env GH_TOKEN --env GITHUB_TOKEN --env ZIZMOR_GITHUB_TOKEN
99136# We use remote dictionary.
100- docker_run \
137+ docker_run cspell.sh \
101138 --mount " type=bind,source=${workdir} ,target=${workdir} ,readonly" --workdir " ${workdir} " \
102139 --mount " type=bind,source=${workdir} /.github/.cspell/project-dictionary.txt,target=${workdir} /.github/.cspell/project-dictionary.txt" \
103140 --mount " type=bind,source=${workdir} /.github/.cspell/rust-dependencies.txt,target=${workdir} /.github/.cspell/rust-dependencies.txt" \
104- --mount " type=bind,source=${tmp} /tmp,target=/tmp/tidy" \
105- " ${image} " \
106- /checks/cspell.sh
141+ --mount " type=bind,source=${tmp} /tmp,target=/tmp/tidy"
107142
108143exit " ${code} "
0 commit comments