From ef4c8731284ff07d861a03235b2ceecd2e37918e Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Sat, 21 Sep 2024 16:28:42 +0000 Subject: [PATCH 1/7] .devcontainer: Added Implement a dev container to make contributing easier, adding docker-in-docker for building images locally, and nektos/act for testing GH actions locally. --- .devcontainer/Dockerfile | 6 ++++++ .devcontainer/devcontainer.json | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..e562dd43 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,6 @@ +ARG VARIANT=5-bookworm +FROM perl:${VARIANT} + +COPY cpanfile /tmp/cpanfile +RUN cpm install -g --with-develop --cpanfile /tmp/cpanfile \ + && rm -rf /root/.perl-cpm /tmp/cpanfile diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..13e06f45 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "build": { + "dockerfile": "./Dockerfile", + "context": ".." + }, + "features": { + "ghcr.io/devcontainers/features/common-utils:2": { + "configureZshAsDefaultShell": "true" + }, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/dhoeric/features/act:1": {} + }, + "customizations": { + "vscode": { + "settings": { + "files.associations": { + "cpanfile": "cpanfile" + } + }, + "extensions": [ + "bscan.perlnavigator", + "bayashi.perlcpanfile", + "stkb.rewrap", + "GitHub.vscode-pull-request-github", + "GitHub.vscode-github-actions" + ] + } + }, + "remoteUser": "vscode" +} From 9a8a40ac6f07cf6ef30dffc8dddeeae4b56c7d30 Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Sat, 21 Sep 2024 16:34:52 +0000 Subject: [PATCH 2/7] generate.pl: allow setting alternate dir for downloads This can be helpful in docker volumes or dev containers, where using the default location under the repo root can have issues due to host/container sync. --- generate.pl | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/generate.pl b/generate.pl index db6239f9..ceb0e0e9 100755 --- a/generate.pl +++ b/generate.pl @@ -122,8 +122,9 @@ sub die_with_sample { die_with_sample unless defined $config->{releases}; die_with_sample unless ref $config->{releases} eq "ARRAY"; -if (!-d "downloads") { - mkdir "downloads" or die "Couldn't create a downloads directory"; +my $downloads = $ENV{DOCKER_PERL_DOWNLOADS_DIR} // "downloads"; +if (!-d "$downloads") { + mkdir "$downloads" or die "Couldn't create a downloads directory at $downloads"; } for my $build (@{$config->{builds}}) { @@ -141,21 +142,21 @@ sub die_with_sample { my $tarball = CPAN::Perl::Releases::MetaCPAN::perl_tarballs($release->{version})->{'tar.gz'}; my ($file) = File::Basename::fileparse($tarball); my $url = "https://cpan.metacpan.org/authors/id/$tarball"; - if (-f "downloads/$file" && `sha256sum downloads/$file` =~ /^\Q$release->{sha256}\E\s+\Qdownloads\/$file\E/) { + if (-f "$downloads/$file" && `sha256sum $downloads/$file` =~ /^\Q$release->{sha256}\E\s+\Q$downloads\/$file\E/) { print "Skipping download of $file, already current\n"; } else { print "Downloading $url\n"; - getstore($url, "downloads/$file"); + getstore($url, "$downloads/$file"); } { - my $dir = "downloads/perl-$release->{version}"; + my $dir = "$downloads/perl-$release->{version}"; qx{rm -fR $dir}; mkdir $dir or die "Couldn't create $dir"; qx{ - tar -C "downloads" -xf $dir.tar.gz &&\ + tar -C "$downloads" -xf $dir.tar.gz &&\ cd $dir &&\ - find . -exec chmod u+w {} + &&\ + chown -R \$(id -u):\$(id -g) . &&\ git init &&\ git add . &&\ git commit -m tmp From bd33fa01f5f106fc03aa0a83848f96c747a544eb Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Sat, 21 Sep 2024 16:44:41 +0000 Subject: [PATCH 3/7] .devcontainer: set alternate downloads dir --- .devcontainer/devcontainer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 13e06f45..26defd2f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,6 +3,9 @@ "dockerfile": "./Dockerfile", "context": ".." }, + "containerEnv": { + "DOCKER_PERL_DOWNLOADS_DIR": "/tmp/docker-perl-downloads" + }, "features": { "ghcr.io/devcontainers/features/common-utils:2": { "configureZshAsDefaultShell": "true" From 11b14d0eb3db5f0f1d3a6ef8dda8f4c5bfe78f1a Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Sat, 21 Sep 2024 17:42:02 +0000 Subject: [PATCH 4/7] workflows: improve generate dockerfile workflow - Run under perl:devel container - Run only for changes on selected paths - Install prereqs via cpm - Fail when extra diffs are detected --- .../generate-dockerfiles-patches.yml | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/.github/workflows/generate-dockerfiles-patches.yml b/.github/workflows/generate-dockerfiles-patches.yml index 7f11cfa7..7dd95583 100644 --- a/.github/workflows/generate-dockerfiles-patches.yml +++ b/.github/workflows/generate-dockerfiles-patches.yml @@ -3,32 +3,54 @@ name: Generate Dockerfiles/patches on: push: branches: - - '**' + - master tags-ignore: - '*' pull_request: + paths: + - cpanfile + - config.yml + - generate.pl + - .github/workflows/generate-dockerfiles-patches.yml jobs: generate: runs-on: ubuntu-latest + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - name: Set up git user name and email run: | git config --global user.email "test@github-actions" git config --global user.name "GitHub Actions" - - uses: actions/checkout@master + - name: Install system perl and cpanm run: | - sudo apt-get install --no-install-recommends -y perl cpanminus + sudo apt-get update && sudo apt-get install -y --no-install-recommends perl cpanminus + - name: Install dependencies run: | - cpanm --quiet --installdeps --notest -L local . + sudo cpanm --quiet --installdeps --notest . + - name: Generate Dockerfiles/patches + id: generate run: | - perl -Ilocal/lib/perl5 ./generate.pl - - name: Show diffstat (if any) - run: | - git --no-pager diff --stat HEAD - - name: Show diffstat (if any) + export DOCKER_PERL_DOWNLOADS_DIR=/tmp/docker-perl-downloads + perl ./generate.pl + /usr/bin/git --no-pager diff --stat > diffstat.txt + if [[ -s diffstat.txt ]]; then + echo has_extra_diffs=1 >> $GITHUB_OUTPUT + fi + + - name: Fail if there are extra diffs + if: steps.generate.outputs.has_extra_diffs run: | - git --no-pager diff --stat HEAD + echo "::error title=generate::Extra diffs found during generate" + echo "Additional changes found during generate - check diffstat below:" + echo "::group::diffstat" + cat diffstat.txt + echo "::endgroup::" + echo + + exit 1 From 8e83516a847bba49a4a5aecc66e0ba09e633b9ac Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Sat, 21 Sep 2024 20:07:21 +0000 Subject: [PATCH 5/7] workflows: build image only on build context changes Also switch to using docker-buildx, and remove unneeded step. --- .github/workflows/build-image.yml | 37 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index b2eb606d..affa84b0 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -1,12 +1,11 @@ name: Build and Test on: - push: - branches: - - '**' - tags-ignore: - - '*' pull_request: + paths: + - '**/Dockerfile' + - '!.devcontainer/Dockerfile' + - '**/DevelPatchPerl.patch' defaults: run: @@ -18,46 +17,56 @@ jobs: runs-on: ubuntu-latest outputs: matrix: ${{ steps.generate.outputs.matrix }} + steps: - - uses: actions/checkout@master + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - id: generate name: Enumerate Dockerfiles run: | matrix="$(dirname */Dockerfile | sort -rn | jq -csR 'rtrimstr("\n") | split("\n") | { directory: . }')" echo "matrix=$matrix" >> $GITHUB_OUTPUT + build-image: needs: generate-matrix runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} name: ${{ matrix.directory }} + steps: - - uses: actions/checkout@master + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - name: Clone docker-library/official-images (for testing) run: | git clone --depth 1 --single-branch https://github.com/docker-library/official-images.git + - name: Build image run: | docker version dir='${{ matrix.directory }}' img="perl:${dir//,/-}" - docker build -t "$img" "$dir" + docker buildx build --progress=plain -t "$img" "$dir" + - name: Inspect image creation and tag time run: | dir='${{ matrix.directory }}' img="perl:${dir//,/-}" docker image inspect --format '{{.Created}}' "$img" docker image inspect --format '{{.Metadata.LastTagTime}}' "$img" + - name: Run tests from docker-library/official-images run: | dir='${{ matrix.directory }}' img="perl:${dir//,/-}" ./official-images/test/run.sh "$img" + - name: Run HTTPS access test run: | dir='${{ matrix.directory }}' img="perl:${dir//,/-}" docker run "$img" perl -MHTTP::Tiny -E 'if (HTTP::Tiny->new->get("https://github.com")->{status} == 200) { exit 0 } exit 1' + - name: Run cpanm install test run: | dir='${{ matrix.directory }}' @@ -67,6 +76,7 @@ jobs: docker run "$img" cpanm -v Net::DNS@1.45_02 fi docker run "$img" cpanm -v Mojolicious + - name: Run cpanm no-lwp by default test run: | dir='${{ matrix.directory }}' @@ -74,6 +84,7 @@ jobs: if [[ "$dir" != *"slim"* ]]; then docker run "$img" bash -c "cpanm -v -n LWP && cpanm -v -n local::lib" fi + - name: Run cpm install test run: | dir='${{ matrix.directory }}' @@ -83,13 +94,3 @@ jobs: docker run "$img" cpm install -v Net::DNS@1.45_02 fi docker run "$img" cpm install -v Mojolicious - - name: COPY all to default WORKDIR - run: | - dir='${{ matrix.directory }}' - img="perl:${dir//,/-}" - mkdir -p test/lib - cat <Dockerfile - FROM $img - COPY . . - EOF - docker build -f Dockerfile test From 698134f3cf861e3fa8c533d86a8a5133e336e8e0 Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Tue, 6 May 2025 07:26:51 +0000 Subject: [PATCH 6/7] workflows: update actions/checkout --- .github/workflows/build-image.yml | 4 ++-- .github/workflows/generate-dockerfiles-patches.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index affa84b0..af986d98 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -19,7 +19,7 @@ jobs: matrix: ${{ steps.generate.outputs.matrix }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - id: generate name: Enumerate Dockerfiles @@ -35,7 +35,7 @@ jobs: name: ${{ matrix.directory }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Clone docker-library/official-images (for testing) run: | diff --git a/.github/workflows/generate-dockerfiles-patches.yml b/.github/workflows/generate-dockerfiles-patches.yml index 7dd95583..cade6ae9 100644 --- a/.github/workflows/generate-dockerfiles-patches.yml +++ b/.github/workflows/generate-dockerfiles-patches.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up git user name and email run: | From dbcc46bd32d14423b04fd59fef46fd84254c5055 Mon Sep 17 00:00:00 2001 From: "Zak B. Elep" Date: Fri, 13 Jun 2025 10:58:06 +0000 Subject: [PATCH 7/7] .devcontainer: update rewrap extension Use rewrap-revived to replace the unmaintained rewrap extension. --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 26defd2f..b7dd7b8c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -24,7 +24,7 @@ "extensions": [ "bscan.perlnavigator", "bayashi.perlcpanfile", - "stkb.rewrap", + "dnut.rewrap-revived", "GitHub.vscode-pull-request-github", "GitHub.vscode-github-actions" ]