Skip to content

Commit 671825a

Browse files
authored
Merge branch 'master' into be-helpful
2 parents f22bfa9 + 2687d91 commit 671825a

7 files changed

Lines changed: 404 additions & 163 deletions

File tree

.github/workflows/ci.yml

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,44 @@ jobs:
99
strategy:
1010
matrix:
1111
os:
12-
- ubuntu:20.04
1312
- ubuntu:22.04
14-
- centos:7
13+
- ubuntu:24.04
1514
- quay.io/centos/centos:stream9
1615
version:
17-
- "20.10"
16+
- "27.5"
17+
- "29.4.2"
1818
- ""
1919

2020
steps:
21-
- uses: actions/checkout@v3
21+
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
2222
- name: Shellcheck
23+
env:
24+
GH_TOKEN: ${{ github.token }}
2325
run: make shellcheck
2426
- name: Check distribution
27+
env:
28+
GH_TOKEN: ${{ github.token }}
2529
run: TEST_IMAGE=${{ matrix.os }} VERSION=${{ matrix.version }} make test
30+
31+
# This is a separate workflow step, because we need to check it outside of container (due to lsmod, iptables checks)
32+
test-install-rootless:
33+
runs-on: ubuntu-latest
34+
timeout-minutes: 5
35+
strategy:
36+
matrix:
37+
channel:
38+
- test
39+
- stable
40+
include:
41+
- channel: stable
42+
stable_latest: "29.4.2"
43+
steps:
44+
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
45+
- name: Install rootless
46+
env:
47+
GH_TOKEN: ${{ github.token }}
48+
run: |
49+
sudo sh -c 'echo 0 > /proc/sys/kernel/apparmor_restrict_unprivileged_userns'
50+
make build/${{ matrix.channel }}/rootless-install.sh \
51+
${{ matrix.stable_latest && format('STABLE_LATEST={0}', matrix.stable_latest) || '' }}
52+
FORCE_ROOTLESS_INSTALL=1 ./build/${{ matrix.channel }}/rootless-install.sh

.github/workflows/diff.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: Diff
2+
3+
on:
4+
pull_request:
5+
6+
jobs:
7+
diff:
8+
name: Diff
9+
runs-on: ubuntu-24.04
10+
steps:
11+
- name: Checkout code
12+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
13+
14+
- name: Diff stable
15+
env:
16+
GH_TOKEN: ${{ github.token }}
17+
run: |
18+
make CHANNEL=stable diff
19+
20+
- name: Diff test
21+
env:
22+
GH_TOKEN: ${{ github.token }}
23+
run: |
24+
make CHANNEL=test diff
25+

Makefile

Lines changed: 81 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,95 @@ VOLUME_MOUNTS=-v "$(CURDIR)":/v
66
SHELLCHECK_EXCLUSIONS=$(addprefix -e, SC1091 SC1117 SC2317 SC2329)
77
SHELLCHECK=docker run --rm $(VOLUME_MOUNTS) -w /v koalaman/shellcheck:stable $(SHELLCHECK_EXCLUSIONS)
88

9-
ENVSUBST_VARS=LOAD_SCRIPT_COMMIT_SHA
9+
ENVSUBST_VARS=LOAD_SCRIPT_COMMIT_SHA LOAD_SCRIPT_STABLE_LATEST LOAD_SCRIPT_TEST_LATEST
10+
11+
# Define the channels we want to build for
12+
CHANNELS=test stable
13+
14+
FILES=build/test/install.sh build/stable/install.sh build/stable/rootless-install.sh
15+
16+
STABLE_LATEST=$(shell ./scripts/get-version.sh stable)
17+
TEST_LATEST=$(shell ./scripts/get-version.sh test)
18+
19+
# Error checking for empty version variables
20+
ifeq ($(STABLE_LATEST),)
21+
$(error STABLE_LATEST is empty)
22+
endif
23+
ifeq ($(TEST_LATEST),)
24+
$(error TEST_LATEST is empty)
25+
endif
1026

1127
.PHONY: build
12-
build: build/install.sh
28+
build: $(FILES)
29+
30+
build/%/install.sh: install.sh
31+
mkdir -p $(@D)
32+
sed 's/DEFAULT_CHANNEL_VALUE="stable"/DEFAULT_CHANNEL_VALUE="$*"/' $< | \
33+
LOAD_SCRIPT_COMMIT_SHA='$(shell git rev-parse HEAD)' \
34+
LOAD_SCRIPT_STABLE_LATEST='$(STABLE_LATEST)' \
35+
LOAD_SCRIPT_TEST_LATEST='$(TEST_LATEST)' \
36+
envsubst '$(addprefix $$,$(ENVSUBST_VARS))' > $@
37+
chmod +x $@
1338

14-
build/install.sh: install.sh
39+
build/%/rootless-install.sh: rootless-install.sh
1540
mkdir -p $(@D)
16-
LOAD_SCRIPT_COMMIT_SHA='$(shell git rev-parse HEAD)' envsubst '$(addprefix $$,$(ENVSUBST_VARS))' < $< > $@
41+
sed 's/DEFAULT_CHANNEL_VALUE="stable"/DEFAULT_CHANNEL_VALUE="$*"/' $< | \
42+
LOAD_SCRIPT_COMMIT_SHA='$(shell git rev-parse HEAD)' \
43+
LOAD_SCRIPT_STABLE_LATEST='$(STABLE_LATEST)' \
44+
LOAD_SCRIPT_TEST_LATEST='$(TEST_LATEST)' \
45+
envsubst '$(addprefix $$,$(ENVSUBST_VARS))' > $@
46+
chmod +x $@
1747

1848
.PHONY: shellcheck
19-
shellcheck: build/install.sh
20-
$(SHELLCHECK) $<
49+
shellcheck: $(FILES)
50+
$(SHELLCHECK) $^
2151

2252
.PHONY: test
23-
test: build/install.sh
24-
docker run --rm -i \
25-
$(VOLUME_MOUNTS) \
26-
-w /v \
27-
-e VERSION \
28-
-e CHANNEL \
29-
$(TEST_IMAGE) \
30-
sh "$<"
53+
test: $(foreach channel,$(CHANNELS),build/$(channel)/install.sh)
54+
for file in $^; do \
55+
(set -eux; docker run --rm -i \
56+
$(VOLUME_MOUNTS) \
57+
--privileged \
58+
-e HOME=/tmp \
59+
-v /var/lib/docker \
60+
-w /v \
61+
-e VERSION \
62+
-e CHANNEL \
63+
$(TEST_IMAGE) \
64+
sh $$file) || exit $$?; \
65+
done
66+
67+
AWS?=docker run \
68+
-v ./build:/build \
69+
-e AWS_ACCESS_KEY_ID \
70+
-e AWS_SECRET_ACCESS_KEY \
71+
-e AWS_SESSION_TOKEN \
72+
--rm amazon/aws-cli
73+
74+
.PHONY: deploy
75+
deploy: build/$(CHANNEL)/install.sh build/$(CHANNEL)/rootless-install.sh
76+
ifeq ($(S3_BUCKET),)
77+
$(error S3_BUCKET is empty.)
78+
endif
79+
ifeq ($(CF_DISTRIBUTION_ID),)
80+
$(error CF_DISTRIBUTION_ID is empty.)
81+
endif
82+
ifeq ($(CHANNEL),)
83+
$(error CHANNEL is empty.)
84+
endif
85+
$(AWS) s3 cp --acl public-read --content-type 'text/plain' /build/$(CHANNEL)/install.sh s3://$(S3_BUCKET)/index
86+
ifeq ($(CHANNEL),stable)
87+
$(AWS) s3 cp --acl public-read --content-type 'text/plain' /build/$(CHANNEL)/rootless-install.sh s3://$(S3_BUCKET)/rootless
88+
endif
89+
90+
$(AWS) cloudfront create-invalidation --distribution-id $(CF_DISTRIBUTION_ID) --paths '/*'
91+
92+
.PHONY: diff
93+
diff: build/$(CHANNEL)/install.sh build/$(CHANNEL)/rootless-install.sh
94+
ifeq ($(CHANNEL),)
95+
$(error CHANNEL is empty.)
96+
endif
97+
./diff.sh $(CHANNEL) || true
3198

3299
.PHONY: clean
33100
clean:

diff.sh

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/bin/bash
2+
3+
if [ -z "$1" ]; then
4+
echo "usage: $0 <stable|test>" >&2
5+
exit 2
6+
fi
7+
8+
CHANNEL="$1"
9+
10+
# Determine subdomain based on channel
11+
case "$CHANNEL" in
12+
test)
13+
SUBDOMAIN="test"
14+
;;
15+
stable)
16+
SUBDOMAIN="get"
17+
;;
18+
*)
19+
echo "Error: Invalid CHANNEL: $CHANNEL" >&2
20+
exit 1
21+
;;
22+
esac
23+
24+
set -euo pipefail
25+
26+
DIFF_FOUND=0
27+
28+
if [[ ! -f "build/$CHANNEL/install.sh" ]]; then
29+
echo "Error: build/$CHANNEL/install.sh not found" >&2
30+
exit 1
31+
fi
32+
33+
if [[ "$CHANNEL" == "stable" ]] && [[ ! -f "build/$CHANNEL/rootless-install.sh" ]]; then
34+
echo "Error: build/$CHANNEL/rootless-install.sh not found" >&2
35+
exit 1
36+
fi
37+
38+
TMP_DIR=$(mktemp -d)
39+
40+
# Download and compare install.sh
41+
curl -sfSL "https://$SUBDOMAIN.docker.com" -o "$TMP_DIR/install.sh"
42+
43+
echo "# Diff $CHANNEL install.sh"
44+
if ! diff -u "$TMP_DIR/install.sh" "build/$CHANNEL/install.sh"; then
45+
DIFF_FOUND=1
46+
fi
47+
48+
# For stable channel, also compare rootless-install.sh
49+
if [[ "$CHANNEL" == "stable" ]]; then
50+
curl -sfSL "https://$SUBDOMAIN.docker.com/rootless" -o "$TMP_DIR/rootless-install.sh"
51+
echo "# Diff $CHANNEL rootless-install.sh"
52+
if ! diff -u "$TMP_DIR/rootless-install.sh" "build/$CHANNEL/rootless-install.sh"; then
53+
DIFF_FOUND=1
54+
fi
55+
fi
56+
57+
exit $DIFF_FOUND

0 commit comments

Comments
 (0)