* test: ruby no version checks minor version and http connection
* fix: pin ruby to minor version, not specific patch
* fix(ruby): bind to 0.0.0.0 to fix start for non-rails applications
* test: snapshot update
* fix: warn user in build plan when no start command is found
previously this would only happen if error-missing-start is enabled, which is not enabled by default.
* test: warning when start is not found
* build: docker client timeout doesn't do anything anymore
this has been deprecated for years
* Revert "test: correct benchmark workflow permissions (#480)"
This reverts commit d3b14c29ae.
* docs: comment on why py + pipx are needed for java
* test: increase ci timeouts
* test: attempt to add benchmark summary to gha job
* docs: note about rerunning a release
* build: ignore all gemini stuff for now
* build: add workflow for automated mise update PRs
* tmp tweaks to test if the PR workflow operates
* tmp fix to test workflow
* build: don't rely on a specific remote, use hardcoded canonical repo when pushing a mise update
* test: latest tags are automatically added
* test: only install from mise.lock in ci
* build: use golintci backend that has x86 locks
* test: update mise action
* build: remove Dockerfiles/ folder to keep image management consistent
* docs: document purpose of various docker images
* docs: internal documentation on the how the build system works
* build: merge all of the image building workflows into a single release workflow
* build: use the mise installer for installing the mise binary
* docs: document purposes of the various images
* refactor: move builder to where it's used
* feat: pin mise build and runtime image versions to specific mise versions
* refactor: use mise task for starting buildkit runner
* test: build new builder and runtime mise images if needed for integration tests
* build: add mise.lock file
* refactor: rename integration tests
* test: add MISE_ENV=ci to all workflows
* fix: mise upgrade
* build: move the docs build and install process into mise
* test: use mise CI vars for tagged release process
* fix: cpp-meson installation process
something changed with mise pipx backend that requires us to manually install python and pipx
* fix: revert mise version
to separate out the build improvements from mise upgrades
* test: snapshot update
* docs: update ex to use mise reference example
* build: move ci bun logic into mise
* docs: explain how docker images are used in public docs
* build: don't push stable tags on prod so we can test a dry run release
* test: bump checkout actions
* docs: minor LLM rule tweak
* fix: remove yml frontend image reference
* docs: why mise.ci.toml is used
* fix: remove custom bin install step builder
* test: snapshot update
* Revert "fix: remove custom bin install step builder"
This reverts commit eee63373c86360e05ae9b0dc2bc302424bd072fd.
* Revert "test: snapshot update"
This reverts commit fa506b4e959265ed90d8720d5079c768eb19a5ef.
* docs: explain why the bin builder exists
* build: ensure mise versions go first in dev
* test: bad `env` key in node-bun test
* test: fail loudly if unexpected keys are found in test.json
* build: task to build an example project
* test: snapshot update
* Initial plan
* Fix broken pnpm-workspaces-example link in Node.js docs
Replace broken link reference with link to examples folder. Added note about workspace examples for different package managers.
Co-authored-by: iloveitaly <[email protected]>
---------
Co-authored-by: iloveitaly <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
* docs: add note about lockb
ref #386
* test: add bun workspace test
* fix: add bun runtime log when it is selected as the runtime
* test: adding bun with pnpm test
* test: remove stderrAllowed when we can write directly to stdout
* test: update test since we've stopped using console.log
* test: ensure pnpm is used on bun-pnpm example
* test: update snapshots
* test: failing case where a dockerignore negation dne
* fix: allow .dockerignore negations that dne
* test: expand unit tests for negation tests
* test: negation test for a directory that DOES exist
* test: snapshot update
* docs: add monorepo support section to Node.js documentation
Addresses user questions about monorepo support by documenting that
Railpack automatically handles npm/pnpm/yarn workspaces and Turborepo
configurations with links to example projects.
* test: improve monorepo example tests to verify workspace functionality
Enhanced integration tests for monorepo examples to properly test that
workspace package linking and dependencies work correctly:
**node-npm-workspaces:**
- Root now imports and uses functions from pkg-a and pkg-b workspace packages
- pkg-a uses its dependency (abbrev) to demonstrate transitive deps work
- pkg-b exports a simple function
- Updated to ES modules for consistency
- Test now verifies all workspace packages load and execute correctly
**node-pnpm-workspaces:**
- Root now imports and uses functions from pkg-a and pkg-b workspace packages
- pkg-a uses its dependency (abbrev) to demonstrate transitive deps work
- pkg-b exports a simple function
- Updated to ES modules for consistency
- Test now verifies all workspace packages load and execute correctly
**node-turborepo:**
- Changed from justBuild to httpCheck since this is a Next.js web server
- Added start script to root package.json to run the web app
- Test now verifies the built app starts and responds to HTTP requests
- This properly tests that the @repo/ui workspace package is built and linked
These changes ensure that monorepo builds are actually testing workspace
functionality, not just that the root package builds in isolation.
Fixes#332
* feat: add yarn workspaces and full-stack monorepo examples
Added two new monorepo examples to complete coverage:
**node-yarn-workspaces:**
- Demonstrates yarn workspaces with workspace package imports
- Uses the packageManager field for corepack
- Similar structure to npm/pnpm workspace examples for consistency
- Tests that workspace packages load and transitive dependencies work
**node-monorepo-fullstack:**
- Real-world example with Express API + frontend + shared package
- Shows how to share code (@monorepo/shared) between API and web packages
- API uses Express and shared utilities/constants
- Frontend demonstrates importing shared code
- Uses HTTP checks to verify API endpoints work correctly
- Demonstrates common full-stack monorepo pattern
Updated documentation to link to the yarn workspaces example and added
a note about the full-stack example for users looking for a more
realistic monorepo setup.
Addresses #332
* fix: format pkg-b package.json properly
Fixed uglified JSON that was created with echo instead of proper editing.
* fix: add yarn.lock and workspace deps to yarn-workspaces example
- Added yarn.lock file required by yarn 4
- Added workspace package dependencies (pkg-a, pkg-b) to root package.json
- Yarn requires lockfile to exist and won't create one in CI mode
* fix: update yarn.lock with correct workspace references
- Added workspace:* aliases to pkg-a and pkg-b entries
- Removed unused transitive dependencies that aren't in package.json
- Yarn requires both the workspace:* and workspace:packages/* forms
* docs: add lockfile guidelines to CLAUDE.md
Never manually update lockfiles - always use the package manager to
generate them properly with correct checksums.
* fix: add workspace deps to pnpm-workspaces package.json
ES module imports require workspace packages to be listed as dependencies
in the root package.json for Node.js to resolve them correctly.
* fix: generate yarn.lock with proper checksums using yarn
Used yarn install via corepack to generate proper yarn.lock with real
checksums instead of manually creating fake ones. Also includes Yarn PnP
files (.pnp.cjs, .pnp.loader.mjs, .yarn/) generated by yarn 4.
* fix: regenerate lockfiles using package managers
Regenerated pnpm-lock.yaml and yarn install-state.gz using the actual
package managers (pnpm and yarn via corepack) instead of manual edits.
- pnpm-lock.yaml: Updated for new workspace dependencies
- .yarn/install-state.gz: Regenerated by yarn install
* fix: remove Yarn PnP files and add .gitignore
Yarn PnP files (.pnp.cjs, .pnp.loader.mjs, .yarn/install-state.gz) should
not be committed as they contain environment-specific paths. They will be
generated during yarn install at build time.
Added .gitignore matching the pattern used in node-yarn-3 example.
* test: update snapshots
* refactor: merge the more realistic monorepo example into existing npm workspaces example
* build: ignore example claude folders
* test: snapshot update
* test: improve unit tests for node workspaces
* docs: deslop AI documentation
* test: improve turborepo example
* test: update snapshots
* test: update unit test for changed monorepo structure
* test: update snapshot
---------
Co-authored-by: Hanzo Dev <[email protected]>
* docs: misc build process documentation
from exploring how we should do secrets + variables
* test: adding explicit int truthy test case
* refactor: centralize all str => list conversion into a single method
it's a one-liner, but self-documents what we are doing better
* refactor: add helper for parsing env as list
* docs: adding todo for ugly direct getenv access
* test: railpack env var configuration options
* test: check version-less RAILPACK_PACKAGES parsing
* test: snapshot update
* feat: support install phase on shell script provider
allows for more advanced install processes
* docs: note that version-less mise packages are allowed in shell config
* docs: more shell provider examples
* docs: maint task list
* refactor: DRY up yarn detection logic
* fix: handle whitespace in packageManager key
this did not originate from a specific issue, but part of overall debugging of bun multi-workspace
* test: make sure nvmrc and node-version are tested
* fix: remove custom parsers for nvmrc and node-version in favor of mise idiomatic parsing
* test: update snapshots
* test: removing snapshot that it doesn't look like we need anymore?
* test: update snapshot
* test: increase docker pull timeout
* feat: detect psycopg[binary] and skip apt packages
When using psycopg2-binary or psycopg[binary], the PostgreSQL client
libraries (libpq-dev, libpq5) are not needed because these variants
ship with pre-compiled binaries. This change:
- Adds usesBinaryPsycopg() to detect binary variants
- Updates usesPostgres() to return false when binary variants are used
- Skips libpq-dev (build) and libpq5 (runtime) apt package installation
- Adds comprehensive unit tests for binary psycopg detection
This reduces image size and build time for projects using binary variants.
* test: add psycopg[binary] integration test
Adds a dedicated test example for psycopg[binary] to verify that the
bracket syntax for optional dependencies is correctly detected. This
ensures the binary detection works for both psycopg2-binary and
psycopg[binary] variants.
Test coverage now includes:
- psycopg2-binary (existing python-system-deps example)
- psycopg[binary] (new python-psycopg-binary example)
- psycopg non-binary (existing python-latest-psycopg example)
- psycopg2 non-binary (existing python-django example)
* test: snapshot update
* test: add binary pyscogp test
* test: ensure libpq is installed for pyscog operation
* build: add helper for running the current dir tests
* test: check to make sure the libpg library is not installed when a binary postgres connection is requested
* test: update snapshot
---------
Co-authored-by: Hanzo Dev <[email protected]>
* fix: remove custom .ruby-version parsing
* test: assert against specific ruby 2 version
makes sure .ruby-version is properly being parsed
* test: add ruby version output to ruby server tests
* docs: some future ruby TODOs
* feat: add dockerIgnore metadata field when .dockerignore exists
When a .dockerignore file is present and successfully parsed, the build
result metadata now includes "dockerIgnore": "true". This allows
consumers of the build plan to know whether dockerignore filtering was
applied during the build.
Changes:
- Set dockerIgnore metadata field in GenerateContext when .dockerignore exists
- Add tests to verify metadata is set correctly in both context and BuildResult
- Fix pre-existing test that fails when running as root
* refactor: move dockerIgnore metadata setting to dockerignore parsing logic
Move the responsibility of setting the dockerIgnore metadata from the
GenerateContext creation to the dockerignore parsing implementation.
This creates better separation of concerns by keeping dockerignore-
related logic in one place.
Changes:
- Add MetadataSetter interface to core/plan/dockerignore.go
- Update ParseWithLogging to accept metadata parameter and set metadata when dockerignore exists
- Update GenerateContext to pass metadata to ParseWithLogging
- Update tests to verify metadata is set during parsing
- Remove separate metadata setting logic from context creation
* refactor: simplify dockerignore metadata logic
Simplify the implementation to just check the parse results and set
metadata based on that. This removes the MetadataSetter interface and
keeps the logic straightforward - just 2 lines of code after parsing.
Also fix pre-existing tests that fail when running as root by adding
skip logic for permission-based tests.
Changes:
- Remove MetadataSetter interface from dockerignore.go
- Set dockerIgnore metadata after parsing based on parse results
- Add skip logic for permission tests that don't work as root
* refactor: remove unrelated skip logic from tests
---------
Co-authored-by: Hanzo Dev <[email protected]>
* build: ignore local claude settings
* test: add httpCheck expectedOutput assertions
* test: add expectedOutput to httpCheck to assert against http response content
* test: remove expectedOutput for FE rendered content
* fix: use consistent node version resolution when bun is detected
When Bun is detected as the package manager but Node is still needed
for native module compilation (node-gyp), the Node version was always
set to "latest" instead of following the same version resolution logic
used when Node is the primary runtime.
This change extracts the Node version resolution logic into a reusable
helper function `applyNodeVersionResolution` that checks version sources
in this order:
1. NODE_VERSION environment variable
2. package.json > engines > node
3. .nvmrc file
4. .node-version file
The same logic is now consistently applied whether Node is required in
the final image or just needed during the build process for Bun projects.
Resolves the TODO comment at line 332 in the original code.
* chore: add tmp/ to .gitignore for temporary test files
* docs: document node version resolution consistency
Add comprehensive documentation explaining why consistent Node version
resolution is critical and how it works:
1. Added detailed godoc to applyNodeVersionResolution method explaining:
- Why the method exists (to ensure consistency)
- Why consistency matters (Bun projects, user expectations, dev/prod parity)
- The priority order of version sources
2. Updated Node.js language documentation to:
- Clarify the version resolution priority order
- Add .node-version file to the list (was missing)
- Emphasize that version resolution is consistent across all scenarios
- Improve the Bun section to explain when Node is installed
- Add explicit note about version specifications being respected
This documentation ensures users understand that their version
specifications (.nvmrc, package.json engines, etc.) are always
honored, regardless of whether Node is the primary runtime or just
a build-time dependency.
* Revert "chore: add tmp/ to .gitignore for temporary test files"
This reverts commit 45c5e51f57c070740f1afc0e9f391ddf6c3a6b53.
* docs: remove ai slop
* test: specify and assert against specific node version in bun project
---------
Co-authored-by: Hanzo Dev <[email protected]>
* fix: ensure idiomatic version files are detected via explicit environment variables
When mise is run with MISE_CEILING_PATHS to sandbox the environment, it
cannot read the root mise.toml which contains the
idiomatic_version_file_enable_tools setting. This caused .python-version,
.node-version, and .ruby-version files to potentially be ignored.
This fix explicitly sets MISE_IDIOMATIC_VERSION_FILE_ENABLE_TOOLS via
environment variable to ensure these version files are always detected,
regardless of whether the root mise.toml is accessible.
* chore: add tmp/ to gitignore for temporary test files
* refactor: extract idiomatic version file tools to shared constant and add test
- Create IdiomaticVersionFileTools constant in core/mise package
- Update both mise.go and mise_step_builder.go to use shared constant
- Add TestGetPackageVersionsWithIdiomaticVersionFile to test .python-version detection
Why the original tests didn't catch this:
- TestGetPackageVersions uses python-uv-tool-versions which has .tool-versions
- Mise reads .tool-versions by default without idiomatic_version_file setting
- The new test uses python-uv which has .python-version (idiomatic version file)
- This ensures idiomatic version file detection is properly tested going forward
* test: add .python-version integration test to python-pip example
- Remove unit test in favor of integration test coverage
- Add .python-version (3.11) to python-pip example
- Update app.py to print Python version
- Update test.json to assert Python 3.11 is used
This ensures .python-version files (different from default 3.13) are
properly detected and used during builds. The integration test covers
the full build pipeline, catching issues that unit tests alone would miss.
* docs: document why python-pip uses Python 3.11 for testing
Explain that .python-version is set to 3.11 (different from default 3.13)
to ensure idiomatic version file detection is properly tested.
* refactor: use specific patch version and remove unnecessary MISE_EXPERIMENTAL
- Update .python-version to 3.11.14 (specific patch version)
- Update test.json to assert full version 3.11.14
- Remove MISE_EXPERIMENTAL=1 (testing confirms it's not needed)
- Update README to reflect patch version
Using a specific patch version makes the test more precise and better
validates that the exact version from .python-version is being used.
* refactor: improve python-pip test clarity and use 3.11.11
- Change patch version to 3.11.11
- Move documentation to inline comment in .python-version
- Fix output message from "Hello from UV" to "Hello from pip"
- Remove separate README.md file
The inline comment explains why this specific version is used without
needing a separate documentation file.
* Revert "chore: add tmp/ to gitignore for temporary test files"
This reverts commit 2f767deca2ae04ee12f866182bee6c82354dbbce.
* test: remove comment from .python-version
interesting, found a mise idiomatic parsing bug
* test: update snapshots
---------
Co-authored-by: Hanzo Dev <[email protected]>
* fix: support elixir projects with no dependencies
* test: add elixir project with latest otp and elixir versions
* test: update snapshots
* fix: touch mix.lock to avoid error when no dependencies are required
* fix: exclude mkdir -p command from plan on elixir builds