# Spec for gitlab-ci-local # # The upstream project is a TypeScript application built with bun. # bun is not available in Fedora, so the RPM builds the equivalent # Node.js bundle with esbuild (the same artifact shape that upstream # publishes to npm as dist/index.js): # # - dependencies are vendored in Source1 (node_modules), created with # upstream's own bun.lock and pruned to the packages actually # compiled into the bundle; regenerate it with: # ./generate-vendor-tarball.sh # - the bundle is an ES module, installed under _datadir with a # "type": "module" package.json stub, and symlinked from _bindir # (same layout as an "npm install -g" would produce) Name: gitlab-ci-local Version: 4.76.1 # Note: %%autorelease is NOT used deliberately - it requires the rpmautospec # macros to be resolvable at rebuild time (dist-git, or mock --buildsrpm with # the rpmautospec plugin), which is not the case when e.g. COPR rebuilds an # uploaded SRPM with mock --rebuild. Switch back once the package is imported # into Fedora dist-git. Release: 1%{?dist} Summary: Run GitLab CI pipelines locally, without pushing License: MIT AND ISC AND BSD-2-Clause AND BSD-3-Clause AND Apache-2.0 URL: https://github.com/firecow/gitlab-ci-local Source0: %{url}/archive/%{version}/gitlab-ci-local-%{version}.tar.gz Source1: gitlab-ci-local-%{version}-vendor.tar.xz # Man page written for Fedora; upstream does not ship one Source2: gitlab-ci-local.1 # License inventory of the bundled npm modules (Node.js guidelines) Source3: gitlab-ci-local-%{version}-bundled-licenses.txt BuildArch: noarch BuildRequires: esbuild BuildRequires: git-core BuildRequires: nodejs >= 20.19 # node runtime for the bundled application Requires: nodejs >= 20.19 # jobs with an image: run in a container runtime (shell jobs run on the host) Suggests: moby-engine # The application is a single-file bundle; the npm dependencies listed below # are compiled into it (see bundled-deps.txt in Source1 for details). Provides: bundled(nodejs-@nodelib-fs.scandir) = 2.1.5 Provides: bundled(nodejs-@nodelib-fs.stat) = 2.0.5 Provides: bundled(nodejs-@nodelib-fs.walk) = 1.2.8 Provides: bundled(nodejs-@sec-ant-readable-stream) = 0.4.1 Provides: bundled(nodejs-@sindresorhus-merge-streams) = 4.0.0 Provides: bundled(nodejs-agent-base) = 6.0.2 Provides: bundled(nodejs-ajv) = 8.20.0 Provides: bundled(nodejs-ansi-escapes) = 7.3.0 Provides: bundled(nodejs-ansi-regex) = 6.3.0 Provides: bundled(nodejs-ansi-styles) = 6.2.3 Provides: bundled(nodejs-asynckit) = 0.4.0 Provides: bundled(nodejs-axios) = 1.20.0 Provides: bundled(nodejs-base64url) = 3.0.1 Provides: bundled(nodejs-braces) = 3.0.3 Provides: bundled(nodejs-call-bind-apply-helpers) = 1.0.2 Provides: bundled(nodejs-camelcase) = 9.0.0 Provides: bundled(nodejs-chalk) = 6.0.0 Provides: bundled(nodejs-chalk-template) = 1.1.2 Provides: bundled(nodejs-checksum) = 1.0.0 Provides: bundled(nodejs-cliui) = 9.0.1 Provides: bundled(nodejs-string-width) = 7.2.0 Provides: bundled(nodejs-emoji-regex) = 10.6.0 Provides: bundled(nodejs-combined-stream) = 1.0.8 Provides: bundled(nodejs-debug) = 4.4.3 Provides: bundled(nodejs-deep-extend) = 0.6.0 Provides: bundled(nodejs-delayed-stream) = 1.0.0 Provides: bundled(nodejs-dotenv) = 18.0.4 Provides: bundled(nodejs-dunder-proto) = 1.0.1 Provides: bundled(nodejs-environment) = 1.1.0 Provides: bundled(nodejs-es-define-property) = 1.0.1 Provides: bundled(nodejs-es-errors) = 1.3.0 Provides: bundled(nodejs-es-object-atoms) = 1.1.2 Provides: bundled(nodejs-es-set-tostringtag) = 2.1.0 Provides: bundled(nodejs-escalade) = 3.2.0 Provides: bundled(nodejs-execa) = 10.0.1 Provides: bundled(nodejs-fast-deep-equal) = 3.1.3 Provides: bundled(nodejs-fast-glob) = 3.3.3 Provides: bundled(nodejs-glob-parent) = 5.1.2 Provides: bundled(nodejs-fast-uri) = 3.1.8 Provides: bundled(nodejs-fastq) = 1.20.3 Provides: bundled(nodejs-figures) = 6.1.0 Provides: bundled(nodejs-fill-range) = 7.1.1 Provides: bundled(nodejs-follow-redirects) = 1.16.0 Provides: bundled(nodejs-form-data) = 4.0.6 Provides: bundled(nodejs-fs-extra) = 11.4.1 Provides: bundled(nodejs-function-bind) = 1.1.2 Provides: bundled(nodejs-get-caller-file) = 2.0.5 Provides: bundled(nodejs-get-east-asian-width) = 1.7.0 Provides: bundled(nodejs-get-intrinsic) = 1.3.0 Provides: bundled(nodejs-get-proto) = 1.0.1 Provides: bundled(nodejs-get-stream) = 9.0.1 Provides: bundled(nodejs-globby) = 16.2.4 Provides: bundled(nodejs-ignore) = 7.0.10 Provides: bundled(nodejs-gopd) = 1.2.0 Provides: bundled(nodejs-graceful-fs) = 4.2.11 Provides: bundled(nodejs-has-flag) = 5.0.1 Provides: bundled(nodejs-has-symbols) = 1.1.0 Provides: bundled(nodejs-has-tostringtag) = 1.0.2 Provides: bundled(nodejs-hasown) = 2.0.4 Provides: bundled(nodejs-https-proxy-agent) = 5.0.1 Provides: bundled(nodejs-human-signals) = 8.0.1 Provides: bundled(nodejs-is-extglob) = 2.1.1 Provides: bundled(nodejs-is-glob) = 4.0.3 Provides: bundled(nodejs-is-number) = 7.0.0 Provides: bundled(nodejs-is-path-inside) = 4.0.0 Provides: bundled(nodejs-is-plain-obj) = 4.1.0 Provides: bundled(nodejs-is-stream) = 4.0.1 Provides: bundled(nodejs-is-unicode-supported) = 2.1.0 Provides: bundled(nodejs-js-yaml) = 5.4.2 Provides: bundled(nodejs-json-schema-traverse) = 1.0.0 Provides: bundled(nodejs-jsonfile) = 6.2.1 Provides: bundled(nodejs-jsonpointer) = 5.0.1 Provides: bundled(nodejs-math-intrinsics) = 1.1.0 Provides: bundled(nodejs-merge2) = 1.4.1 Provides: bundled(nodejs-micromatch) = 4.0.8 Provides: bundled(nodejs-picomatch) = 2.3.2 Provides: bundled(nodejs-mime-db) = 1.52.0 Provides: bundled(nodejs-mime-types) = 2.1.35 Provides: bundled(nodejs-ms) = 2.1.3 Provides: bundled(nodejs-npm-run-path) = 6.0.0 Provides: bundled(nodejs-path-key) = 4.0.0 Provides: bundled(nodejs-unicorn-magic) = 0.3.0 Provides: bundled(nodejs-object-traversal) = 1.0.1 Provides: bundled(nodejs-p-map) = 7.0.8 Provides: bundled(nodejs-parse-ms) = 4.0.0 Provides: bundled(nodejs-pretty-hrtime) = 1.0.3 Provides: bundled(nodejs-pretty-ms) = 9.3.1 Provides: bundled(nodejs-proxy-from-env) = 2.1.0 Provides: bundled(nodejs-queue-microtask) = 1.2.3 Provides: bundled(nodejs-re2js) = 2.8.6 Provides: bundled(nodejs-reusify) = 1.1.0 Provides: bundled(nodejs-run-parallel) = 1.2.0 Provides: bundled(nodejs-semver) = 7.8.5 Provides: bundled(nodejs-signal-exit) = 4.1.0 Provides: bundled(nodejs-slash) = 5.1.0 Provides: bundled(nodejs-split2) = 4.2.0 Provides: bundled(nodejs-string-width) = 8.3.0 Provides: bundled(nodejs-strip-ansi) = 7.2.0 Provides: bundled(nodejs-strip-final-newline) = 4.0.0 Provides: bundled(nodejs-supports-color) = 10.2.2 Provides: bundled(nodejs-supports-hyperlinks) = 4.5.0 Provides: bundled(nodejs-terminal-link) = 5.0.0 Provides: bundled(nodejs-to-regex-range) = 5.0.1 Provides: bundled(nodejs-unicorn-magic) = 0.4.1 Provides: bundled(nodejs-universalify) = 2.0.1 Provides: bundled(nodejs-which-command) = 0.1.0 Provides: bundled(nodejs-wrap-ansi) = 9.0.2 Provides: bundled(nodejs-string-width) = 7.2.0 Provides: bundled(nodejs-emoji-regex) = 10.6.0 Provides: bundled(nodejs-y18n) = 5.0.8 Provides: bundled(nodejs-yargs) = 18.2.0 Provides: bundled(nodejs-yargs-parser) = 22.0.0 Provides: bundled(nodejs-yoctocolors) = 2.2.0 %description gitlab-ci-local runs .gitlab-ci.yml pipelines locally, directly on your machine or in local containers, the same way a GitLab Runner would. It parses the pipeline configuration, expands includes, variables and rules, executes jobs (shell or docker executor), and supports artifacts, needs, caches and much more - without pushing a single commit. %prep %setup -q -a1 %build # Upstream stamps the release version into package.json during its release # process (see .github/workflows/release.yml); the git tag archive ships 0.0.0. sed -i 's/"version": "0.0.0"/"version": "%{version}"/' package.json esbuild src/index.ts \ --bundle \ --platform=node \ --target=node20 \ --format=esm \ --minify \ --sourcemap \ --legal-comments=eof \ --banner:js="import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);" \ --outfile=dist/index.js %check node dist/index.js --version | grep -F '%{version}' node dist/index.js --help > /dev/null # Smoke test: parse a minimal pipeline inside a git repository. mkdir smoke && cd smoke git init -q -b main . git config user.email builder@localhost git config user.name builder printf 'test-job:\n script: echo hello\n' > .gitlab-ci.yml git add .gitlab-ci.yml git commit -qm init node ../dist/index.js --list | grep test-job %install # bundled modules license inventory (see Node.js packaging guidelines) cp -a %{SOURCE3} . # ESM bundle + package.json stub, mirroring an npm global install layout install -Dpm 0755 dist/index.js %{buildroot}%{_datadir}/%{name}/index.js install -Dpm 0644 dist/index.js.map %{buildroot}%{_datadir}/%{name}/index.js.map cat > package.stub.json <<'STUB' {"type": "module", "private": true} STUB install -Dpm 0644 package.stub.json %{buildroot}%{_datadir}/%{name}/package.json install -d %{buildroot}%{_bindir} ln -s ../share/%{name}/index.js %{buildroot}%{_bindir}/%{name} # zsh completion, generated by the application itself node dist/index.js --completion > _%{name} install -Dpm 0644 _%{name} %{buildroot}%{zsh_completions_dir}/_%{name} # man page install -Dpm 0644 %{SOURCE2} %{buildroot}%{_mandir}/man1/%{name}.1 %files %license LICENSE %{name}-%{version}-bundled-licenses.txt %doc README.md %{_bindir}/%{name} %{_datadir}/%{name}/ %{zsh_completions_dir}/_%{name} %{_mandir}/man1/%{name}.1* %changelog * Wed Oct 21 2026 Marc-André Lureau - 4.76.1-1 - Initial package