Files
feedc0de b83d01de23
Publish PHP Apache image / Build, test and push (push) Successful in 1m16s
Add Imagick and Iconv to PHP image
2026-09-11 09:02:53 +02:00

174 lines
6.3 KiB
YAML

name: Publish PHP Apache image
on:
push:
workflow_dispatch:
schedule:
# Refresh the rolling Arch Linux base weekly.
- cron: "13 3 * * 1"
env:
IMAGE: registry.brunner.ninja/feedc0de/php-apache
jobs:
publish:
name: Build, test and push
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Check out source
uses: actions/checkout@v4
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: v4.2.2
- name: Validate Helm chart
run: |
set -euo pipefail
helm lint helm/php-homepage
helm template ci-test helm/php-homepage > /dev/null
- name: Log in to Quay
uses: docker/login-action@v3
with:
registry: registry.brunner.ninja
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_TOKEN }}
- name: Build image
env:
COMMIT_SHA: ${{ gitea.sha }}
run: |
set -euo pipefail
docker build \
--pull \
--load \
--label "org.opencontainers.image.revision=${COMMIT_SHA}" \
--label "org.opencontainers.image.source=https://code.brunner.ninja/feedc0de/php-apache" \
--tag "${IMAGE}:${COMMIT_SHA}" \
.
- name: Test Apache and PHP extensions
env:
COMMIT_SHA: ${{ gitea.sha }}
run: |
set -euo pipefail
docker run --rm --entrypoint httpd "${IMAGE}:${COMMIT_SHA}" -t
docker run --rm \
--env APACHE_SERVER_ADMIN=ci@example.invalid \
--entrypoint /bin/bash \
"${IMAGE}:${COMMIT_SHA}" \
-euc '
httpd
php -r '\''
$status = file_get_contents("http://127.0.0.1:8080/server-status?auto");
if ($status === false || !str_contains($status, "ServerVersion:")) {
fwrite(STDERR, "Apache server-status smoke test failed.\n");
exit(1);
}
echo "Apache server-status smoke test passed.\n";
'\''
httpd -k stop
'
docker run --rm --entrypoint php "${IMAGE}:${COMMIT_SHA}" -r '
foreach (["exif", "gd", "iconv", "imagick", "intl", "Zend OPcache", "pgsql", "pdo_pgsql"] as $extension) {
if (!extension_loaded($extension)) {
fwrite(STDERR, "Missing PHP extension: {$extension}\n");
exit(1);
}
}
$info = gd_info();
foreach (["JPEG Support", "PNG Support", "WebP Support"] as $feature) {
if (empty($info[$feature])) {
fwrite(STDERR, "Missing GD feature: {$feature}\n");
exit(1);
}
}
$image = imagecreatetruecolor(8, 8);
$scaled = imagescale($image, 4, 4);
if ($scaled === false || imagesx($scaled) !== 4 || imagesy($scaled) !== 4) {
fwrite(STDERR, "GD resize smoke test failed.\n");
exit(1);
}
$imagick = new Imagick();
$imagick->newImage(8, 8, "white", "png");
$imagick->resizeImage(4, 4, Imagick::FILTER_LANCZOS, 1);
if ($imagick->getImageWidth() !== 4 || $imagick->getImageHeight() !== 4) {
fwrite(STDERR, "Imagick resize smoke test failed.\n");
exit(1);
}
if (iconv("UTF-8", "ASCII//TRANSLIT", "Grüße") === false) {
fwrite(STDERR, "Iconv smoke test failed.\n");
exit(1);
}
echo "GD resize smoke test passed.\n";
echo "Imagick and Iconv smoke tests passed.\n";
'
- name: Determine version tag
env:
COMMIT_SHA: ${{ gitea.sha }}
run: |
set -euo pipefail
apache_version="$(
docker run --rm --entrypoint httpd "${IMAGE}:${COMMIT_SHA}" -v \
| sed -n 's#^Server version: Apache/\([0-9.]*\).*$#\1#p'
)"
php_version="$(
docker run --rm --entrypoint php "${IMAGE}:${COMMIT_SHA}" \
-r 'echo PHP_VERSION;'
)"
test -n "${apache_version}"
test -n "${php_version}"
version_tag="${apache_version}-${php_version}"
printf 'VERSION_TAG=%s\n' "${version_tag}" >> "${GITHUB_ENV}"
run_attempt="${GITHUB_RUN_ATTEMPT:-1}"
test -n "${GITHUB_RUN_NUMBER}"
chart_version="0.${GITHUB_RUN_NUMBER}.${run_attempt}"
printf 'CHART_VERSION=%s\n' "${chart_version}" >> "${GITHUB_ENV}"
printf 'BUILD_TAG=chart-%s\n' "${chart_version}" >> "${GITHUB_ENV}"
- name: Push commit tag
if: gitea.event_name == 'push'
env:
COMMIT_SHA: ${{ gitea.sha }}
run: docker push "${IMAGE}:${COMMIT_SHA}"
- name: Push main tags
if: gitea.ref == 'refs/heads/main' || gitea.event_name == 'schedule'
env:
COMMIT_SHA: ${{ gitea.sha }}
run: |
set -euo pipefail
docker tag "${IMAGE}:${COMMIT_SHA}" "${IMAGE}:${BUILD_TAG}"
docker tag "${IMAGE}:${COMMIT_SHA}" "${IMAGE}:${VERSION_TAG}"
docker tag "${IMAGE}:${COMMIT_SHA}" "${IMAGE}:latest"
docker push "${IMAGE}:${BUILD_TAG}"
docker push "${IMAGE}:${VERSION_TAG}"
docker push "${IMAGE}:latest"
- name: Publish Helm chart
if: gitea.ref == 'refs/heads/main' || gitea.event_name == 'schedule'
env:
PACKAGE_USERNAME: ${{ secrets.PACKAGE_USERNAME }}
PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }}
run: |
set -euo pipefail
test -n "${PACKAGE_USERNAME}"
test -n "${PACKAGE_TOKEN}"
install -d .chart-packages
helm package helm/php-homepage \
--destination .chart-packages \
--version "${CHART_VERSION}" \
--app-version "${BUILD_TAG}"
chart_file=".chart-packages/php-homepage-${CHART_VERSION}.tgz"
test -f "${chart_file}"
curl --fail --silent --show-error \
--user "${PACKAGE_USERNAME}:${PACKAGE_TOKEN}" \
--request POST \
--upload-file "${chart_file}" \
https://code.brunner.ninja/api/packages/feedc0de/helm/api/charts