28e0afc11d
elb overwrites dist/soul.c with a fresh (non-inlined) compilation before its link step fails, discarding the patched self-contained version. Save the repo copy before elb and restore it after so the compiler always gets the complete translation unit with all patches applied.
150 lines
5.5 KiB
YAML
150 lines
5.5 KiB
YAML
name: Neuron Soul CI
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Checkout foundation/el (ELP source for soul.el imports)
|
|
run: |
|
|
git clone https://git.neuralplatform.ai/neuron-technologies/el.git \
|
|
--depth=1 --branch=main \
|
|
../foundation/el
|
|
|
|
- name: Install build dependencies
|
|
run: |
|
|
apt-get update -qq
|
|
apt-get install -y gcc libcurl4-openssl-dev apt-transport-https ca-certificates
|
|
echo "deb [trusted=yes] https://packages.cloud.google.com/apt cloud-sdk main" \
|
|
> /etc/apt/sources.list.d/google-cloud-sdk.list
|
|
apt-get update -qq && apt-get install -y google-cloud-cli
|
|
|
|
- name: Download El SDK from Artifact Registry
|
|
env:
|
|
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
|
|
run: |
|
|
echo "${GCP_SA_KEY}" > /tmp/gcp-key.json
|
|
gcloud auth activate-service-account --key-file=/tmp/gcp-key.json
|
|
gcloud config set project neuron-785695
|
|
|
|
rm -rf /opt/el/dist /opt/el/runtime
|
|
mkdir -p /opt/el/dist/platform /opt/el/dist/bin /opt/el/runtime
|
|
|
|
# Get latest version of each package
|
|
get_latest() {
|
|
gcloud artifacts versions list \
|
|
--repository=foundation-prod \
|
|
--location=us-central1 \
|
|
--project=neuron-785695 \
|
|
--package="$1" \
|
|
--sort-by="~createTime" \
|
|
--limit=1 \
|
|
--format="value(name)" 2>/dev/null | awk -F/ '{print $NF}'
|
|
}
|
|
|
|
ELC_VER=$(get_latest el-elc)
|
|
ELB_VER=$(get_latest el-elb)
|
|
RC_VER=$(get_latest el-runtime-c)
|
|
RH_VER=$(get_latest el-runtime-h)
|
|
|
|
echo "Downloading elc@${ELC_VER} elb@${ELB_VER} runtime@${RC_VER}"
|
|
|
|
gcloud artifacts generic download \
|
|
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
|
|
--package=el-elc --version="${ELC_VER}" \
|
|
--destination=/opt/el/dist/platform/
|
|
|
|
gcloud artifacts generic download \
|
|
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
|
|
--package=el-elb --version="${ELB_VER}" \
|
|
--destination=/opt/el/dist/bin/
|
|
|
|
gcloud artifacts generic download \
|
|
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
|
|
--package=el-runtime-c --version="${RC_VER}" \
|
|
--destination=/opt/el/runtime/
|
|
|
|
gcloud artifacts generic download \
|
|
--repository=foundation-prod --location=us-central1 --project=neuron-785695 \
|
|
--package=el-runtime-h --version="${RH_VER}" \
|
|
--destination=/opt/el/runtime/
|
|
|
|
# Downloaded files keep original names; rename to canonical paths
|
|
mv /opt/el/dist/platform/elc* /opt/el/dist/platform/elc 2>/dev/null || true
|
|
mv /opt/el/dist/bin/elb* /opt/el/dist/bin/elb 2>/dev/null || true
|
|
mv /opt/el/runtime/el_runtime.c* /opt/el/runtime/el_runtime.c 2>/dev/null || true
|
|
mv /opt/el/runtime/el_runtime.h* /opt/el/runtime/el_runtime.h 2>/dev/null || true
|
|
|
|
chmod +x /opt/el/dist/platform/elc /opt/el/dist/bin/elb
|
|
echo "El SDK ready"
|
|
/opt/el/dist/platform/elc --version || true
|
|
|
|
- name: Build neuron soul binary
|
|
run: |
|
|
ELB=/opt/el/dist/bin/elb
|
|
ELC=/opt/el/dist/platform/elc
|
|
RUNTIME=/opt/el/runtime
|
|
|
|
# Preserve the pre-compiled dist/soul.c from the repo before running elb.
|
|
# elb may overwrite it during compilation; we always want the repo version
|
|
# since it contains the patched self-contained translation unit (all modules
|
|
# inlined, workspace scope fix, agentic dedup fix, etc.).
|
|
cp dist/soul.c /tmp/soul.c.prebuilt
|
|
|
|
# Compile all El modules to C via elb.
|
|
# elb fails at link on Linux (GNU ld rejects duplicate strong symbols that
|
|
# macOS ld accepts silently) — that's expected and captured with || true.
|
|
$ELB --elc=$ELC --runtime=$RUNTIME/el_runtime.c || true
|
|
|
|
# Restore the repo's self-contained soul.c — elb may have overwritten it
|
|
# with a partial (non-inlined) version that lacks module-level definitions.
|
|
cp /tmp/soul.c.prebuilt dist/soul.c
|
|
|
|
# Compile the self-contained translation unit. No --allow-multiple-definition
|
|
# needed since soul.c inlines all modules.
|
|
mkdir -p dist
|
|
cc -O2 -DHAVE_CURL \
|
|
-I$RUNTIME \
|
|
dist/soul.c \
|
|
$RUNTIME/el_runtime.c \
|
|
-lssl -lcrypto -lcurl -lpthread -lm \
|
|
-o dist/neuron
|
|
|
|
ls -lh dist/neuron
|
|
|
|
- name: Smoke test
|
|
run: |
|
|
file dist/neuron
|
|
timeout 3 dist/neuron --help 2>&1 || true
|
|
echo "smoke test complete"
|
|
|
|
- name: Publish neuron binary
|
|
if: github.event_name == 'push'
|
|
env:
|
|
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
|
|
run: |
|
|
VERSION="${GITHUB_SHA:0:8}"
|
|
|
|
gcloud artifacts generic upload \
|
|
--repository=foundation-prod \
|
|
--location=us-central1 \
|
|
--project=neuron-785695 \
|
|
--package=neuron-soul \
|
|
--version="${VERSION}" \
|
|
--source=dist/neuron
|
|
|
|
echo "Published neuron-soul@${VERSION}"
|
|
rm -f /tmp/gcp-key.json
|