mirror of https://github.com/madler/zlib.git
parent
5a82f71ed1
commit
fde50b06a2
9 changed files with 318 additions and 5 deletions
@ -0,0 +1,64 @@ |
||||
|
||||
# Testing |
||||
|
||||
> [!NOTE] |
||||
> This is a copy of the s390x self-hosted action runner scripts from |
||||
> https://github.com/zlib-ng/zlib-ng/tree/a0fa24710c8faa1a746a20cfd5c7c24571e15ca4/arch/s390/self-hosted-builder |
||||
|
||||
Given complexity of DFLTCC machine instruction, it is not clear whether |
||||
QEMU TCG will ever support it. At the time of writing, one has to have |
||||
access to an IBM z15+ VM or LPAR in order to test DFLTCC support. Since |
||||
DFLTCC is a non-privileged instruction, neither special VM/LPAR |
||||
configuration nor root are required. |
||||
|
||||
zlib CI uses a self-hosted builder, provided by marist university |
||||
for the DFLTCC testing. There is no official IBM Z GitHub Actions runner, |
||||
so we build one inspired by `anup-kodlekere/gaplib`. |
||||
Future updates to actions-runner might need an updated patch. The .net |
||||
version number patch has been separated into a separate file to avoid a |
||||
need for constantly changing the patch. |
||||
|
||||
## Configuring the builder. |
||||
|
||||
### Install prerequisites. |
||||
``` |
||||
sudo dnf install podman |
||||
``` |
||||
|
||||
### Create a config file, needs github personal access token. |
||||
Access token needs permissions; Repo Admin RW, Org Self-hosted runners RW. |
||||
For details, consult |
||||
https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-a-repository |
||||
|
||||
#### Create file /etc/actions-runner: |
||||
``` |
||||
REPO=<owner>/<name> |
||||
PAT_TOKEN=<github_pat_***> |
||||
``` |
||||
|
||||
#### Set permissions on /etc/actions-runner: |
||||
``` |
||||
chmod 0600 /etc/actions-runner |
||||
``` |
||||
|
||||
### Add actions-runner service. |
||||
``` |
||||
sudo cp self-hosted-builder/actions-runner.service /etc/systemd/system/ |
||||
sudo systemctl daemon-reload |
||||
``` |
||||
|
||||
### Autostart actions-runner. |
||||
``` |
||||
$ sudo systemctl enable --now actions-runner |
||||
``` |
||||
|
||||
### Add auto-rebuild cronjob |
||||
``` |
||||
sudo cp self-hosted-builder/actions-runner-rebuild.sh /etc/cron.weekly/ |
||||
chmod +x /etc/cron.weekly/actions-runner-rebuild.sh |
||||
``` |
||||
|
||||
## Building / Rebuilding the container |
||||
``` |
||||
sudo /etc/cron.weekly/actions-runner-rebuild.sh |
||||
``` |
@ -0,0 +1,59 @@ |
||||
#!/bin/bash |
||||
|
||||
# |
||||
# Ephemeral runner startup script. |
||||
# |
||||
# Expects the following environment variables: |
||||
# |
||||
# - REPO=<owner> |
||||
# - PAT_TOKEN=<github_pat_***> |
||||
# |
||||
|
||||
set -e -u |
||||
|
||||
# Validate required environment variables |
||||
if [ -z "${REPO:-}" ] || [ -z "${PAT_TOKEN:-}" ]; then |
||||
echo "Error: REPO and/or PAT_TOKEN environment variables not found" |
||||
exit 1 |
||||
fi |
||||
|
||||
# Check the cached registration token. |
||||
TOKEN_FILE=registration-token.json |
||||
if [ -f $TOKEN_FILE ]; then |
||||
set +e |
||||
EXPIRES=$(jq --raw-output .EXPIRES "$TOKEN_FILE" 2>/dev/null) |
||||
STATUS=$? |
||||
set -e |
||||
else |
||||
STATUS=1 |
||||
fi |
||||
if [[ $STATUS -ne 0 || $(date +%s) -ge $(date -d "$EXPIRES" +%s) ]]; then |
||||
# Refresh the cached registration token. |
||||
curl \ |
||||
-X POST \ |
||||
-H "Accept: application/vnd.github+json" \ |
||||
-H "Authorization: Bearer $PAT_TOKEN" \ |
||||
"https://api.github.com/repos/$REPO/actions/runners/registration-token" \ |
||||
-o "$TOKEN_FILE" |
||||
fi |
||||
|
||||
REG_TOKEN=$(jq --raw-output .token "$TOKEN_FILE") |
||||
if [ $REG_TOKEN = "null" ]; then |
||||
echo "Failed to get registration token" |
||||
exit 1 |
||||
fi |
||||
|
||||
# (Re-)register the runner. |
||||
./config.sh remove --token "$REG_TOKEN" || true |
||||
set -x |
||||
./config.sh \ |
||||
--url "https://github.com/$REPO" \ |
||||
--token "$REG_TOKEN" \ |
||||
--unattended \ |
||||
--disableupdate \ |
||||
--replace \ |
||||
--labels S390X \ |
||||
--ephemeral |
||||
|
||||
# Run one job. |
||||
./run.sh |
@ -0,0 +1,49 @@ |
||||
#!/usr/bin/bash |
||||
set -ex |
||||
|
||||
TMPDIR="$(mktemp -d)" |
||||
|
||||
if [ -f actions-runner.Dockerfile ]; then |
||||
MODE=1 |
||||
cp actions-runner.Dockerfile actions-runner entrypoint $TMPDIR |
||||
cd $TMPDIR |
||||
else |
||||
MODE=2 |
||||
cd $TMPDIR |
||||
wget https://raw.githubusercontent.com/fneddy/zlib/refs/heads/s390x_native_ci/contrib/s390x/self-hosted-builder/actions-runner.Dockerfile |
||||
wget https://raw.githubusercontent.com/fneddy/zlib/refs/heads/s390x_native_ci/contrib/s390x/self-hosted-builder/actions-runner |
||||
wget https://raw.githubusercontent.com/fneddy/zlib/refs/heads/s390x_native_ci/contrib/s390x/self-hosted-builder/entrypoint |
||||
fi |
||||
|
||||
# Stop service |
||||
systemctl stop actions-runner || true |
||||
|
||||
# Delete old container |
||||
podman container rm gaplib-actions-runner || true |
||||
|
||||
# Delete old image |
||||
podman image rm localhost/zlib/actions-runner || true |
||||
|
||||
# Build new image |
||||
podman build --squash -f actions-runner.Dockerfile --tag zlib/actions-runner . 2>&1 | tee /var/log/actions-runner-build.log |
||||
|
||||
# Create new container |
||||
podman create --replace --name=gaplib-actions-runner --env-file=/etc/actions-runner --init \ |
||||
--volume=actions-runner-temp:/home/actions-runner zlib/actions-runner 2>&1 | tee -a /var/log/actions-runner-build.log |
||||
|
||||
# Start service |
||||
systemctl start actions-runner || true |
||||
|
||||
# Cleanup |
||||
podman image prune -af || true |
||||
|
||||
# Clean up tempfile |
||||
if [ "$MODE" == "2" ] ; then |
||||
cd $TMPDIR |
||||
rm actions-runner.Dockerfile |
||||
rm actions-runner |
||||
rm entrypoint |
||||
cd .. |
||||
rmdir $TMPDIR |
||||
echo "Deleted tempfiles." |
||||
fi |
@ -0,0 +1,45 @@ |
||||
# Self-Hosted IBM Z Github Actions Runner. |
||||
|
||||
FROM almalinux:9 |
||||
|
||||
RUN dnf update -y -q && \ |
||||
dnf install -y -q --enablerepo=crb wget git which sudo jq sed \ |
||||
cmake make automake autoconf m4 libtool ninja-build python3-pip \ |
||||
gcc gcc-c++ clang llvm-toolset glibc-all-langpacks langpacks-en \ |
||||
glibc-static libstdc++-static libstdc++-devel libxslt-devel libxml2-devel |
||||
|
||||
RUN dnf install -y -q dotnet-sdk-8.0 && \ |
||||
echo "Using SDK - `dotnet --version`" |
||||
|
||||
RUN cd /tmp && \ |
||||
git clone -q https://github.com/actions/runner && \ |
||||
cd runner && \ |
||||
git checkout main -b build && \ |
||||
wget https://github.com/anup-kodlekere/gaplib/raw/refs/heads/main/build-files/runner-sdk-8.s390x.patch && \ |
||||
git apply runner-sdk-8.s390x.patch && \ |
||||
sed -i'' -e /version/s/8......\"$/$8.0.100\"/ src/global.json |
||||
|
||||
|
||||
RUN cd /tmp/runner/src && \ |
||||
./dev.sh layout && \ |
||||
./dev.sh package && \ |
||||
rm -rf /root/.dotnet /root/.nuget |
||||
|
||||
RUN useradd -c "Action Runner" -m actions-runner && \ |
||||
usermod -L actions-runner |
||||
|
||||
RUN tar -xf /tmp/runner/_package/*.tar.gz -C /home/actions-runner && \ |
||||
chown -R actions-runner:actions-runner /home/actions-runner |
||||
|
||||
# Cleanup |
||||
RUN rm -rf /tmp/runner /var/cache/dnf/* /tmp/runner.patch /tmp/global.json && \ |
||||
dnf clean all |
||||
|
||||
USER actions-runner |
||||
|
||||
# Scripts. |
||||
COPY --chmod=555 entrypoint /usr/bin/ |
||||
COPY --chmod=555 actions-runner /usr/bin/ |
||||
WORKDIR /home/actions-runner |
||||
ENTRYPOINT ["/usr/bin/entrypoint"] |
||||
CMD ["/usr/bin/actions-runner"] |
@ -0,0 +1,18 @@ |
||||
[Unit] |
||||
Description=Podman container: Gaplib Github Actions Runner |
||||
Wants=network-online.target |
||||
After=network-online.target |
||||
StartLimitIntervalSec=1 |
||||
RequiresMountsFor=/run/user/1001/containers |
||||
|
||||
[Service] |
||||
Environment=PODMAN_SYSTEMD_UNIT=%n |
||||
Restart=always |
||||
TimeoutStopSec=61 |
||||
ExecStart=/usr/bin/podman start gaplib-actions-runner |
||||
ExecStop=/usr/bin/podman stop -t 30 gaplib-actions-runner |
||||
ExecStopPost=/usr/bin/podman stop -t 10 gaplib-actions-runner |
||||
Type=forking |
||||
|
||||
[Install] |
||||
WantedBy=default.target |
@ -0,0 +1,30 @@ |
||||
#!/bin/bash |
||||
|
||||
# |
||||
# Container entrypoint that waits for all spawned processes. |
||||
# |
||||
|
||||
set -e -u |
||||
|
||||
# Create a FIFO and start reading from its read end. |
||||
tempdir=$(mktemp -d "/tmp/done.XXXXXXXXXX") |
||||
trap 'rm -r "$tempdir"' EXIT |
||||
done="$tempdir/pipe" |
||||
mkfifo "$done" |
||||
cat "$done" & waiter=$! |
||||
|
||||
# Start the workload. Its descendants will inherit the FIFO's write end. |
||||
status=0 |
||||
if [ "$#" -eq 0 ]; then |
||||
bash 9>"$done" || status=$? |
||||
else |
||||
"$@" 9>"$done" || status=$? |
||||
fi |
||||
|
||||
# When the workload and all of its descendants exit, the FIFO's write end will |
||||
# be closed and `cat "$done"` will exit. Wait until it happens. This is needed |
||||
# in order to handle SelfUpdater, which the workload may start in background |
||||
# before exiting. |
||||
wait "$waiter" |
||||
|
||||
exit "$status" |
Loading…
Reference in new issue