mirror of
https://github.com/mudler/LocalAI.git
synced 2026-08-02 11:30:44 -04:00
The GitHub-hosted runner pool is shared per ACCOUNT, not per repo, so a burst in one repo starves every other. On 2026-07-31 it reached zero scheduled jobs for 35 consecutive minutes with 39 jobs queued, while arc-runner-set completed 12 jobs without interruption across the same window. Actions was healthy globally (other public repos were scheduling normally), so this is an account-level throttle we cannot fix from inside the workflows, only route around. Site publishing and lint are small, run on nearly every commit, and gain nothing from waiting behind a saturated hosted queue, so both move to arc-runner-set, the label already proven in generate_intel_image.yaml. lint.yml is routed for PUSH ONLY, and this is the important part: that workflow also triggers on pull_request, and a fork PR executes untrusted contributor code. Running that on a persistent self-hosted runner would be a real compromise vector, so anything that is not a push to mudler/LocalAI stays on the ephemeral hosted pool. gh-pages.yml needs no such clause: it triggers only on push-to-master and workflow_dispatch, so it never runs pull-request code. Both carry a repository guard so forks, which have no such runner label, fall back to hosted instead of queueing forever. Neither workflow uses sudo or apt, and both fetch their own toolchains via setup-go / actions-hugo. A self-hosted image can still be leaner than the hosted one, so each lint job opens with a preflight that names the missing tool (curl/unzip/make for protoc and lint; gcc/ldd/python3 for the packaging-script tests) rather than failing opaquely mid-build. Reverting is one runs-on expression per job. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
112 lines
3.7 KiB
YAML
112 lines
3.7 KiB
YAML
name: Deploy site to GitHub Pages
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
paths:
|
|
- 'docs/**'
|
|
- 'website/**'
|
|
- 'gallery/**'
|
|
- 'images/**'
|
|
- '.github/ci/modelslist.go'
|
|
- '.github/ci/gen-redirects.sh'
|
|
- '.github/workflows/gh-pages.yml'
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
pages: write
|
|
id-token: write
|
|
|
|
concurrency:
|
|
group: pages
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
build:
|
|
# Self-hosted. This workflow is push-to-master + workflow_dispatch only, so
|
|
# it never executes pull-request code and a fork cannot reach the runner
|
|
# with untrusted changes. The repository guard keeps forks (whose own master
|
|
# pushes would otherwise queue forever against a label they do not have) on
|
|
# the hosted pool.
|
|
#
|
|
# Why: the GitHub-hosted pool is shared account-wide and has repeatedly
|
|
# starved (2026-07-31: 35 consecutive minutes at zero scheduled jobs, while
|
|
# arc-runner-set kept completing work throughout). Publishing the site is
|
|
# small, frequent, and must not sit behind a saturated hosted queue.
|
|
#
|
|
# Needs only git, tar and curl on the runner: setup-go and actions-hugo
|
|
# fetch their own toolchains, and no step uses sudo, apt, make or unzip.
|
|
runs-on: ${{ github.repository == 'mudler/LocalAI' && 'arc-runner-set' || 'ubuntu-latest' }}
|
|
env:
|
|
HUGO_VERSION: "0.146.3"
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
with:
|
|
fetch-depth: 0 # needed for enableGitInfo
|
|
submodules: true
|
|
|
|
- name: Setup Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.22'
|
|
cache: false
|
|
|
|
- name: Setup Hugo
|
|
uses: peaceiris/actions-hugo@v3
|
|
with:
|
|
hugo-version: ${{ env.HUGO_VERSION }}
|
|
extended: true
|
|
|
|
- name: Setup Pages
|
|
id: pages
|
|
uses: actions/configure-pages@v6
|
|
|
|
# The gallery page is generated from the model index and shipped as a
|
|
# static asset of the docs site, so it has to exist before Hugo runs.
|
|
- name: Generate gallery
|
|
run: go run ./.github/ci/modelslist.go ./gallery/index.yaml > docs/static/gallery.html
|
|
|
|
# Two Hugo sites, one Pages artifact: the main site owns the root,
|
|
# the docs site is nested under /docs/.
|
|
- name: Build the main site
|
|
working-directory: website
|
|
run: hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/"
|
|
|
|
- name: Build documentation site
|
|
working-directory: docs
|
|
run: |
|
|
mkdir -p layouts/_default
|
|
hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/docs/"
|
|
|
|
- name: Merge documentation into the main site
|
|
run: |
|
|
mkdir -p website/public/docs
|
|
cp -R docs/public/. website/public/docs/
|
|
|
|
# Keeps the pre-split URLs alive; see the script header.
|
|
- name: Generate legacy URL redirects
|
|
run: .github/ci/gen-redirects.sh website/public "${{ steps.pages.outputs.base_url }}/"
|
|
|
|
- name: Upload artifact
|
|
uses: actions/upload-pages-artifact@v5
|
|
with:
|
|
path: website/public
|
|
|
|
deploy:
|
|
environment:
|
|
name: github-pages
|
|
url: ${{ steps.deployment.outputs.page_url }}
|
|
# Same routing as build: a hosted slot for a ~10s deploy is exactly the kind
|
|
# of job that should not block on a starved pool. deploy-pages authenticates
|
|
# with the job's OIDC token (id-token: write above), which self-hosted
|
|
# runners issue the same way hosted ones do.
|
|
runs-on: ${{ github.repository == 'mudler/LocalAI' && 'arc-runner-set' || 'ubuntu-latest' }}
|
|
needs: build
|
|
steps:
|
|
- name: Deploy to GitHub Pages
|
|
id: deployment
|
|
uses: actions/deploy-pages@v5
|