Skip to content

Commit

Permalink
Added CI worker for native S390X
Browse files Browse the repository at this point in the history
  • Loading branch information
fneddy committed Mar 3, 2025
1 parent 5a82f71 commit b79402d
Show file tree
Hide file tree
Showing 9 changed files with 317 additions and 5 deletions.
29 changes: 26 additions & 3 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,31 @@ jobs:
matrix:
include:
- name: Ubuntu GCC
enabled: true
os: ubuntu-latest
compiler: gcc
cflags: -Wall -Wextra
pkgtgt: package package_source
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: Ubuntu GCC -O3
enabled: true
os: ubuntu-latest
compiler: gcc
cflags: -O3 -Wall -Wextra
pkgtgt: package package_source
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: Ubuntu Clang
enabled: true
os: ubuntu-latest
compiler: clang
cflags: -Wall -Wextra
pkgtgt: package package_source
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: Ubuntu Clang Debug
enabled: true
os: ubuntu-latest
compiler: clang
cflags: -Wall -Wextra
Expand All @@ -38,72 +42,91 @@ jobs:
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: Windows MSVC Win32
enabled: true
os: windows-latest
compiler: cl
cflags: /W3
cmake-args: -A Win32
pkgtgt: PACKAGE

- name: Windows MSVC Win64
enabled: true
os: windows-latest
compiler: cl
cflags: /W3
cmake-args: -A x64 -DMINIZIP_ENABLE_BZIP2=OFF
pkgtgt: PACKAGE

- name: Windows GCC
enabled: true
os: windows-latest
compiler: gcc
cflags: -Wall -Wextra
cmake-args: -G Ninja -DMINIZIP_ENABLE_BZIP2=OFF
pkgtgt: package

- name: macOS Clang
enabled: true
os: macos-latest
compiler: clang
cflags: -Wall -Wextra
pkgtgt: package
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: macOS GCC
enabled: true
os: macos-latest
compiler: gcc-12
cflags: -Wall -Wextra
pkgtgt: package
cmake-args: -DMINIZIP_ENABLE_BZIP2=ON

- name: S390X Native GCC
enabled: ${{ github.repository == 'fneddy/zlib' && 'true' || false }}
os: ${{ github.repository == 'fneddy/zlib' && 'S390X' || 'ubuntu-latest' }}
compiler: gcc
cflags: -Wall -Wextra
cmake-args: -DMINIZIP_ENABLE_BZIP2=OFF
pkgtgt: package

steps:
- name: Checkout repository
if: matrix.enabled
uses: actions/checkout@v4

- name: Install packages (Windows)
if: runner.os == 'Windows'
if: runner.os == 'Windows' && matrix.enabled
run: |
choco install --no-progress ninja
- name: Install packages (Linux)
if: runner.os == 'Linux'
if: runner.os == 'Linux' && matrix.os != 'S390X' && matrix.enabled
run: |
sudo apt install libbz2-dev
- name: Generate project files
if: matrix.enabled
run: cmake -S . -B ../build ${{ matrix.cmake-args }} -D CMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} -DZLIB_BUILD_MINIZIP=ON
env:
CC: ${{ matrix.compiler }}
CFLAGS: ${{ matrix.cflags }}

- name: Compile source code
if: matrix.enabled
run: cmake --build ../build --config ${{ matrix.build-config || 'Release' }}

- name: Run test cases
if: matrix.enabled
run: ctest -C Release --output-on-failure --max-width 120
working-directory: ../build

- name: create packages
if: matrix.enabled
run: cmake --build ../build --config ${{ matrix.build-config || 'Release' }} -t ${{ matrix.pkgtgt }}

- name: Upload build errors
uses: actions/upload-artifact@v4
if: failure()
if: failure() && matrix.enabled == true
with:
name: ${{ matrix.name }} (cmake)
path: |
Expand Down
26 changes: 24 additions & 2 deletions .github/workflows/configure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,22 @@ jobs:
matrix:
include:
- name: Ubuntu GCC
enabled: true
os: ubuntu-latest
compiler: gcc
configure-args: --warn

# Test out of source builds
- name: Ubuntu GCC OSB
enabled: true
os: ubuntu-latest
compiler: gcc
configure-args: --warn
build-dir: ../build
src-dir: ../zlib

- name: Ubuntu GCC ARM SF
enabled: true
os: ubuntu-latest
compiler: arm-linux-gnueabi-gcc
configure-args: --warn
Expand All @@ -30,6 +33,7 @@ jobs:
qemu-run: qemu-arm -L /usr/arm-linux-gnueabi

- name: Ubuntu GCC ARM HF
enabled: true
os: ubuntu-latest
compiler: arm-linux-gnueabihf-gcc
configure-args: --warn
Expand All @@ -38,6 +42,7 @@ jobs:
qemu-run: qemu-arm -L /usr/arm-linux-gnueabihf

- name: Ubuntu GCC AARCH64
enabled: true
os: ubuntu-latest
compiler: aarch64-linux-gnu-gcc
configure-args: --warn
Expand All @@ -46,6 +51,7 @@ jobs:
qemu-run: qemu-aarch64 -L /usr/aarch64-linux-gnu

- name: Ubuntu GCC PPC
enabled: true
os: ubuntu-latest
compiler: powerpc-linux-gnu-gcc
configure-args: --warn --static
Expand All @@ -56,6 +62,7 @@ jobs:
ldflags: -static

- name: Ubuntu GCC PPC64
enabled: true
os: ubuntu-latest
compiler: powerpc64-linux-gnu-gcc
configure-args: --warn --static
Expand All @@ -66,14 +73,17 @@ jobs:
ldflags: -static

- name: Ubuntu GCC PPC64LE
enabled: true
os: ubuntu-latest
compiler: powerpc64le-linux-gnu-gcc
configure-args: --warn
chost: powerpc64le-linux-gnu
packages: qemu-system qemu-user gcc-powerpc64le-linux-gnu libc-dev-ppc64el-cross
qemu-run: qemu-ppc64le -L /usr/powerpc64le-linux-gnu

# if on base repo use the native workflow runner, else QEMU
- name: Ubuntu GCC S390X
enabled: true
os: ubuntu-latest
compiler: s390x-linux-gnu-gcc
configure-args: --warn --static
Expand All @@ -83,27 +93,37 @@ jobs:
cflags: -static
ldflags: -static

- name: Native S390X GCC
enabled: ${{ github.repository == 'fneddy/zlib' && 'true' || false }}
os: ${{ github.repository == 'fneddy/zlib' && 'S390X' || 'ubuntu-latest' }}
compiler: gcc
configure-args: --warn

- name: macOS GCC
enabled: true
os: macos-latest
compiler: gcc-12
configure-args: --warn

- name: macOS Clang
enabled: true
os: macos-latest
compiler: clang
configure-args: --warn

steps:
- name: Checkout repository
if: matrix.enabled
uses: actions/checkout@v4

- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && matrix.packages
if: runner.os == 'Linux' && matrix.packages && matrix.enabled
run: |
sudo apt-get update
sudo apt-get install -y ${{ matrix.packages }}
- name: Generate project files
if: matrix.enabled
run: |
[ -d ${{ matrix.build-dir || '.' }} ] || mkdir ${{ matrix.build-dir || '.' }}
cd ${{ matrix.build-dir || '.' }}
Expand All @@ -115,10 +135,12 @@ jobs:
CHOST: ${{ matrix.chost }}

- name: Compile source code
if: matrix.enabled
run: make -j2
working-directory: ${{ matrix.build-dir }}

- name: Run test cases
if: matrix.enabled
run: |
make test
make cover
Expand All @@ -128,7 +150,7 @@ jobs:

- name: Upload build errors
uses: actions/upload-artifact@v4
if: failure()
if: failure() && matrix.enabled
with:
name: ${{ matrix.name }} (configure)
path: |
Expand Down
3 changes: 3 additions & 0 deletions contrib/README.contrib
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@ untgz/ by Pedro A. Aranda Gutierrez <[email protected]>
vstudio/ by Gilles Vollant <[email protected]>
Building a minizip-enhanced zlib with Microsoft Visual Studio
Includes vc11 from kreuzerkrieg and vc12 from davispuh

s390x/ by Eduard Stefes <[email protected]
Scripts to create S390X github action workers.
64 changes: 64 additions & 0 deletions contrib/s390x/README
Original file line number Diff line number Diff line change
@@ -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
```
59 changes: 59 additions & 0 deletions contrib/s390x/self-hosted-builder/actions-runner
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit b79402d

Please sign in to comment.