fix: Build inside system container to match glibc 2.36

The CI runner host has glibc 2.41 but the system container has glibc 2.36.
Build on the host produces binaries that fail with GLIBC_2.38/2.39 not found.

This workflow transfers source from host to container via tar+ssh, then
builds inside the container where the binary will run, ensuring compatibility.
This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2026-04-02 14:33:11 -03:00
parent 3b8acde6fb
commit a8a7951b19

View file

@ -9,6 +9,7 @@ on:
env:
CARGO_BUILD_JOBS: 4
CARGO_NET_RETRY: 10
PATH: /root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
jobs:
build:
@ -20,39 +21,39 @@ jobs:
git config --global http.sslVerify false
git config --global --add safe.directory "*"
- name: Setup Workspace inside container
- name: Setup Workspace on host
run: |
echo "=== Setting up workspace inside container ==="
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "incus exec system -- bash -c '
mkdir -p /opt/gbo/ci/botserver
cd /opt/gbo/ci/botserver
# Clone botlib
if [ -d botlib/.git ]; then
git -C botlib fetch --depth 1 origin main && git -C botlib checkout FETCH_HEAD
else
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/botlib.git botlib
fi
# Clone botserver
if [ -d botserver/.git ]; then
git -C botserver fetch --depth 1 origin main && git -C botserver checkout FETCH_HEAD
else
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/BotServer.git botserver
fi
# Clone gb workspace and get Cargo.toml
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/gb.git /tmp/gb-ws
cp /tmp/gb-ws/Cargo.toml Cargo.toml
for m in botapp botdevice bottest botui botbook botmodels botplugin bottemplates; do
grep -v \"\\\"$m\\\"\" Cargo.toml > /tmp/c.toml && mv /tmp/c.toml Cargo.toml
done
rm -rf /tmp/gb-ws
echo \"Workspace setup complete\"
'"
mkdir -p /opt/gbo/ci/botserver
cd /opt/gbo/ci/botserver
if [ -d botlib/.git ]; then
git -C botlib fetch --depth 1 origin main && git -C botlib checkout FETCH_HEAD
else
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/botlib.git botlib
fi
if [ -d botserver/.git ]; then
git -C botserver fetch --depth 1 origin main && git -C botserver checkout FETCH_HEAD
else
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/BotServer.git botserver
fi
git clone --depth 1 --branch main https://alm.pragmatismo.com.br/GeneralBots/gb.git /tmp/gb-ws
cp /tmp/gb-ws/Cargo.toml Cargo.toml
for m in botapp botdevice bottest botui botbook botmodels botplugin bottemplates; do
grep -v "\"$m\"" Cargo.toml > /tmp/c.toml && mv /tmp/c.toml Cargo.toml
done
rm -rf /tmp/gb-ws
- name: Transfer source to system container
run: |
echo "=== Transferring source to container ==="
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "mkdir -p /opt/gbo/ci/botserver"
tar cf - -C /opt/gbo/ci/botserver botlib botserver Cargo.toml | \
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=120 -o ServerAliveInterval=10 system "tar xf - -C /opt/gbo/ci/botserver && echo 'Transfer complete'"
- name: Install system dependencies in container
run: |
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "incus exec system -- bash -c '
PKGS=\"libpq-dev libssl-dev liblzma-dev pkg-config\"
MISSING=\"\"
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "
PKGS='libpq-dev libssl-dev liblzma-dev pkg-config'
MISSING=''
for pkg in \$PKGS; do
dpkg -s \"\$pkg\" >/dev/null 2>&1 || MISSING=\"\$MISSING \$pkg\"
done
@ -60,46 +61,54 @@ jobs:
apt-get update -qq -o Acquire::Retries=3 -o Acquire::http::Timeout=30
apt-get install -y --no-install-recommends \$MISSING
else
echo \"All system dependencies already installed\"
echo 'All system dependencies already installed'
fi
'"
"
- name: Install Rust in container
run: |
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "
export PATH=/root/.cargo/bin:\$PATH
if ! command -v rustup &>/dev/null || [ \$(rustc --version | grep -oP '\d+\.\d+' | head -1 | cut -d. -f1) -lt 1 ]; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
fi
rustc --version
cargo --version
"
- name: Build BotServer inside container
run: |
echo "=== Building BotServer inside container ==="
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=60 system "incus exec system -- bash -c '
cd /opt/gbo/ci/botserver
echo "=== Building inside container ==="
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "
export PATH=/root/.cargo/bin:\$PATH
export CARGO_BUILD_JOBS=4
cd /opt/gbo/ci/botserver
cargo build -p botserver --features chat 2>&1 | tee /tmp/build.log
ls -lh target/debug/botserver
'"
"
- name: Save build log
if: always()
run: |
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "incus exec system -- cat /tmp/build.log > /tmp/botserver-build.log" || true
cat /tmp/botserver-build.log 2>/dev/null | tail -30 || echo "Build log not available"
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "cat /tmp/build.log" > /tmp/build.log 2>/dev/null || true
sudo cp /tmp/build.log /tmp/botserver-$(date +%Y%m%d-%H%M%S).log || true
- name: Deploy BotServer
run: |
set -e
echo "=== Deploy started ==="
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "incus exec system -- bash -c '
echo \"Step 1: Killing old botserver...\"
pgrep -f botserver && killall botserver 2>/dev/null || echo \"No running botserver\"
sleep 2
echo \"Step 2: Removing old binary...\"
rm -f /opt/gbo/bin/botserver
echo \"Step 3: Copying new binary...\"
echo "Step 1: Killing old botserver..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "pgrep -f botserver && killall botserver 2>/dev/null || echo 'No running botserver'"
echo "Step 2: Copying binary inside container..."
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "
cp /opt/gbo/ci/botserver/target/debug/botserver /opt/gbo/bin/botserver
chmod +x /opt/gbo/bin/botserver
echo \"Step 4: Setting permissions...\"
chown gbuser:gbuser /opt/gbo/bin/botserver
ls -lh /opt/gbo/bin/botserver
echo \"=== Deploy completed ===\"
'"
"
echo "=== Deploy completed ==="
- name: Verify botserver started
run: |
sleep 10
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 system "incus exec system -- bash -c '
pgrep -f botserver && echo \"OK: botserver is running\" || (echo \"ERROR: botserver not running\" && cat /opt/gbo/logs/error.log | tail -20 && exit 1)
'"
ssh -o StrictHostKeyChecking=no system "pgrep -f botserver && echo 'OK: botserver is running' || (echo 'ERROR: botserver not running' && cat /opt/gbo/logs/error.log | tail -20 && exit 1)"