e095547142
CI / Build Native (push) Failing after 2m2s
The local native-image (GraalVM on Ubuntu jammy) produces a binary linked against the runner's glibc 2.35. quarkus-micro-image:2.0 ships glibc 2.34, hence the 'GLIBC_2.35 not found' runtime error. binary-type=STATIC alone is not enough without musl on the build host. -Dquarkus.native.container-build=true runs the native build inside the Mandrel builder image, which ships musl and produces a genuinely static binary that has no host-libc dependency. Also adds a verification step that runs file and ldd on the runner binary so the next CI log shows whether we actually shipped static.
121 lines
4.2 KiB
YAML
121 lines
4.2 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
build-native:
|
|
name: Build Native
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: maven:3.9.6-eclipse-temurin-21
|
|
options: --memory=8g
|
|
steps:
|
|
- name: Install git, node, gcc, docker, buildx, and basic tools
|
|
run: |
|
|
apt-get update
|
|
apt-get install -y git curl ca-certificates build-essential zlib1g-dev docker.io docker-buildx
|
|
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
|
|
apt-get install -y nodejs
|
|
rm -rf /var/lib/apt/lists/*
|
|
git --version
|
|
node --version
|
|
gcc --version
|
|
docker --version
|
|
docker buildx version
|
|
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Cache Maven repository
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.m2/repository
|
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
|
restore-keys: ${{ runner.os }}-maven-
|
|
|
|
- name: Set up GraalVM
|
|
uses: graalvm/setup-graalvm@v1
|
|
with:
|
|
distribution: 'graalvm'
|
|
java-version: '21'
|
|
components: 'native-image'
|
|
|
|
- name: Cache Node + npm
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
target/node
|
|
src/frontend/node_modules
|
|
key: ${{ runner.os }}-node-${{ hashFiles('src/frontend/package-lock.json') }}
|
|
restore-keys: ${{ runner.os }}-node-
|
|
|
|
- name: Build (Native)
|
|
run: mvn package -Pnative -B -DskipTests -Dquarkus.native.native-image-xmx=4g -Dquarkus.native.binary-type=STATIC -Dquarkus.native.container-build=true
|
|
|
|
- name: Verify native binary
|
|
run: |
|
|
ls -la target/shot-crafter-calculator-1.0.0-runner
|
|
echo "--- file ---"
|
|
file target/shot-crafter-calculator-1.0.0-runner
|
|
echo "--- ldd ---"
|
|
if ldd target/shot-crafter-calculator-1.0.0-runner >/dev/null 2>&1; then
|
|
echo "WARNING: binary has dynamic dependencies:"
|
|
ldd target/shot-crafter-calculator-1.0.0-runner
|
|
else
|
|
echo "OK: binary is statically linked (no dynamic dependencies)."
|
|
fi
|
|
|
|
- name: Stage binary for Docker
|
|
run: |
|
|
mkdir -p build-output
|
|
cp target/shot-crafter-calculator-1.0.0-runner build-output/
|
|
chmod 775 build-output/shot-crafter-calculator-1.0.0-runner
|
|
echo "securerandom.source=file:/dev/urandom" >> build-output/shot-crafter-calculator-1.0.0-runner
|
|
|
|
- name: Build & Push Docker image
|
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
run: |
|
|
set -e
|
|
echo "=== Build Docker image ==="
|
|
docker buildx build -t shot-crafter-calculator:ci .
|
|
echo "=== Login to Gitea Registry ==="
|
|
echo "${{ secrets.REGISTRY_TOKEN }}" | docker login gitea.danielarroyo.cl -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
|
|
SHORT_SHA=$(echo "$GITHUB_SHA" | cut -c1-7)
|
|
echo "=== Tag ==="
|
|
docker tag shot-crafter-calculator:ci gitea.danielarroyo.cl/proyectos/shot-crafter-calculator:latest
|
|
docker tag shot-crafter-calculator:ci gitea.danielarroyo.cl/proyectos/shot-crafter-calculator:${SHORT_SHA}
|
|
|
|
push_with_retry() {
|
|
local ref="$1"
|
|
local attempt=1
|
|
local max_attempts=5
|
|
while [ $attempt -le $max_attempts ]; do
|
|
echo "=== Push (attempt $attempt/$max_attempts): $ref ==="
|
|
if docker push "$ref"; then
|
|
return 0
|
|
fi
|
|
echo "::warning::Push of $ref failed, retrying in 30s..."
|
|
sleep 30
|
|
attempt=$((attempt + 1))
|
|
done
|
|
echo "::error::Push of $ref failed after $max_attempts attempts"
|
|
return 1
|
|
}
|
|
|
|
push_with_retry "gitea.danielarroyo.cl/proyectos/shot-crafter-calculator:latest"
|
|
push_with_retry "gitea.danielarroyo.cl/proyectos/shot-crafter-calculator:${SHORT_SHA}"
|
|
echo "=== Logout ==="
|
|
docker logout gitea.danielarroyo.cl
|
|
echo "=== Done ==="
|