Compare commits

..

78 Commits

Author SHA1 Message Date
Jeff McCune
22c65bbc6c add ca-certificates to container image for git
Without this patch git fails to pull from https remotes.
2025-09-01 06:45:58 -07:00
Jeff McCune
e913ce6368 Merge pull request #444 from WhyKickAmooCow/patch-1
Add ca-certificates to container image
2025-09-01 06:43:31 -07:00
Adam
0abfa660d0 Add ca-certificates to container image
Signed-off-by: Adam <WhyKickAmooCow@users.noreply.github.com>
2025-09-01 23:20:39 +12:00
Jeff McCune
8883a89c44 bump cue to v0.14.1 from v0.13.0-rc.1
Commands to update the tests and website docs to the new version:

    make bump
    make update-docs
2025-08-31 15:51:35 -07:00
Jeff McCune
b4d8794e23 container: update to debian 13 and install git
Update to kubectl v1.33.4

Closes: #440
2025-08-31 15:51:34 -07:00
Jeff McCune
524b01a6b3 tasks: add v1alpha6 design task 2025-05-22 15:29:41 -07:00
Jeff McCune
c1a064fd70 claude: add settings with allowed tools 2025-05-22 15:29:40 -07:00
Jeff McCune
69f6a8b1eb claude: add make install reminder to development commands 2025-05-22 15:29:40 -07:00
Jeff McCune
4482930e82 cue: improve error messages to show user field paths
Use v.Validate(cue.Concrete(true)) before decoding to get user-friendly
field paths like "holos.metadata.name" instead of internal type names
like "#Metadata.name". This makes error messages clearer and matches
the output style of cue export.

With this patch the error is as I want it to be:

    ❯ holos show platform
    error at internal/platform/platform.go:153: holos.metadata.name: incomplete value string
    holos.metadata.name: incomplete value string:
        /Users/jeff/Holos/holos/tmp/examples/cue.mod/gen/github.com/holos-run/holos/api/core/v1alpha6/types_go_gen.cue:419:8
2025-05-22 15:01:36 -07:00
Jeff McCune
12389320a6 lint: make golangci-lint happy 2025-05-22 15:01:35 -07:00
Jeff McCune
b024346f19 claude: update guidance for coding agent 2025-05-22 10:32:13 -07:00
google-labs-jules[bot]
e58433fe08 docs: Update Helm version and add known issue
- Updates the tested Helm version to v3.17.3 in the setup documentation.
- Adds a "Known Issues" section to the setup documentation.
- Notes that Helm v3.18.0 produces incorrect output and links to the relevant Holos and Nixpkgs issues.

Fixes #433
2025-05-22 10:31:41 -07:00
Jeff McCune
c94d5b69c5 Merge pull request #431 from holos-run/jeff/compile
show: compile build plans with sub-processes
2025-05-22 09:56:06 -07:00
Jeff McCune
65430e3379 tests: replace cmp with holos compare yaml for yaml comparisons
Update testscript files to use `holos compare yaml` instead of `cmp`
for YAML file comparisons. This enables structural comparison rather
than textual comparison, ensuring semantic equivalence instead of
character-by-character matching.

Changes:
- Replace cmp stdout with cp stdout + holos compare yaml pattern
- Update all test files that compare YAML content
- Maintain test functionality while using semantic comparison

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 15:58:47 -07:00
Jeff McCune
1945392227 tests: refactor textual cmp to structural compare
Use holos compare yaml in place of cmp for structural comparisons rather
than text base diffs.  Useful to handle re-ordered fields and such.
2025-05-21 15:51:00 -07:00
Jeff McCune
b4361e3997 cli: fix exit code when compare subcommand not found
Previously the compare yaml command was not registered, and invalid
subcommands returned exit code 0. Now invalid subcommands properly
return exit code 1 while help commands continue to return 0.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 15:47:05 -07:00
Jeff McCune
1b562118a8 cue: upgrade v0.13.0-alpha.4 -> v0.13.0-rc.1 2025-05-21 15:30:15 -07:00
Jeff McCune
578677d9a6 cli: fix holos show tests calling wrong executable 2025-05-21 15:23:16 -07:00
Jeff McCune
49398fe211 compile: fix hanging tests calling cli.test compile recursively
When executing in the test harness, we cannot assume the os.Executable
is the holos executable, otherwise we recursively execute the
go-build1600354897/b1280/cli.test compile command forever.
2025-05-21 15:05:53 -07:00
Jeff McCune
82c429b8df helm: fix tests for helm 3.17.3
New kube api version needs to be updated in the tests.
2025-05-21 14:39:54 -07:00
Jeff McCune
012de360ac component: pass write to directory as function args
Makes it easier to test and know for certain where the value is being
set from.  Previously it wasn't clear how the write to directory was
being modified or read in the global config object.
2025-05-21 14:27:02 -07:00
Jeff McCune
c5600f2310 render: fix write-to flag handling
Fixed regression in holos render platform command where output manifests were
not being written to the deploy/ directory by default. Issues:

1. Ensured write-to flag is passed from render platform to render component
2. Fixed NewConfig to set the default WriteTo value properly
3. Fixed compile.go to ensure WriteTo is passed to components
4. Properly pass tempDir in renderAlpha5 method

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-21 12:19:39 -07:00
Jeff McCune
bc0266e5e3 show: compile build plans with sub-processes
This is a first stab at compiling build plans with a pool of holos
compile sub-processes.  Tested against the kargo-demo repository.
2025-05-21 11:34:31 -07:00
Jeff McCune
18be14c2ea compile: take a BuildPlanRequest as input
This package clarifies and simplifies the input protocol of the holos
compile command.  A BuildPlanRequest represents the complete context
necessary to compile a BuildPlan.

This patch also upgrades cue to v0.13.0-alpha4
2025-05-21 11:18:53 -07:00
Jeff McCune
ab49a40246 compile: export a build plan to stdout
This patch copies the build plan rendering from the show buildplans
command to implement the rendering in the compile subcommand.
2025-05-21 11:18:52 -07:00
Jeff McCune
28a0a3625e compile: add basic structure of holos compile command
This command reads Component objects from a reader, exports a BuildPlan
from CUE, then marshals the result to the writer.

The purpose is to run concurrent instances of CUE to speed up build plan
generation prior to task execution.
2025-05-21 11:18:52 -07:00
Jeff McCune
1bdb580aca compare: improve error message
Previously the error message didn't look nice:

    holos compare buildplans before.yaml after.yaml
    could not run: document 1: -    holos.run/stack.name: httpbin
    +    holos.run/stack.name: httpbinX at internal/compare/compare.go:331

With this patch:

    holos compare buildplans before.yaml after.yaml
    error at internal/compare/compare.go:331: document 1 not equivalent:
    -    holos.run/stack.name: httpbin
    +    holos.run/stack.name: httpbinX
2025-05-21 11:09:58 -07:00
Jeff McCune
c1b749c6bc claude: remove local settings 2025-05-21 10:42:04 -07:00
Jeff McCune
12ee084759 Merge pull request #432 from holos-run/jeff/claude-compare
Compare BuildPlans
2025-05-21 10:08:50 -07:00
Jeff McCune
6a2a81e3fc compare: add not-backwards-compatible test case to verify spec 4 2025-05-17 23:04:32 -07:00
Jeff McCune
204ce788b6 compare: clarify backwards compatibility behavior in doc comment
- Add detailed explanation of what isBackwardsCompatible controls
- Include example showing how newer versions can have additional fields
- Clarify that fields in before must always be present in after
- Make the documentation more user-friendly to prevent confusion

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:56:00 -07:00
Jeff McCune
abb014ee48 compare: clarify doc comment and fix backwards compatibility test logic
- Replace 'a' with 'before' and 'b' with 'after' in BuildPlans doc comment for clarity
- Fix backwards compatibility test case by swapping before/after files:
  - before.yaml now correctly has fewer fields (older version)
  - after.yaml now correctly has more fields (newer version with enhancements)
- Update comparison logic to filter fields from after that don't exist in before
- This correctly implements spec 4: after may have fields missing from before when backwards compatible

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:42:31 -07:00
Jeff McCune
e7cd480510 compare: fix formatting with make fmt 2025-05-17 22:26:41 -07:00
Jeff McCune
bd32ad62a4 cli: add --backwards-compatible flag to compare buildplans command
- Add boolean flag --backwards-compatible (default false) to control backwards compatibility behavior
- Flag enables backwards compatibility mode where the second file may have fields missing from the first file
- Maintains existing behavior when flag is not set (strict comparison)
- Help text clearly explains the flag's purpose

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:24:50 -07:00
Jeff McCune
57789b48e5 compare: add test for backwards compatibility spec requirement
- Add test case BuildPlan_4 for BuildPlan spec 4: b may have fields missing from a if isBackwardsCompatible is true
- Implement backwards compatibility logic in comparison functions
  - Add filterToCommonFields() to filter fields based on what exists in both structures
  - Update compareDocumentLists() and compareStructures() to accept isBackwardsCompatible parameter
  - When backwards compatible mode is enabled, only compare fields that exist in both structures
- Update test framework to support isBackwardsCompatible field in test cases
- Test verifies that missing labels, annotations, and nested fields don't cause failure in backwards compatible mode

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:19:56 -07:00
Jeff McCune
8476a8748f cli: fix compare command to add missing backwards compatibility parameter
The BuildPlans function signature was updated to include an isBackwardsCompatible
boolean parameter, but the CLI command was not updated to provide this parameter.
Fixed by passing false for now to maintain existing behavior.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:04:53 -07:00
Jeff McCune
2b89b45fc5 compare: add comprehensive BuildPlan spec test coverage
- Reference BuildPlan spec items in test names (BuildPlan_3.1, BuildPlanFile_1, etc.)
- Add missing test cases for BuildPlan spec requirements:
  - BuildPlanFile_2: each object matches exactly one unique object
  - BuildPlan_5: fields in 'a' must exist in 'b'
  - BuildPlan_6.1-6.3: null/empty/missing field equivalence
  - BuildPlanValid_1-2: duplicate objects and same metadata.name
- Implement null/empty/missing field equivalence (spec 6)
  - Add normalizeStructure() to handle spec 6 requirements
  - Ensure null, [], and missing fields are treated as equivalent
- Update test messages to clarify spec coverage intent

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 22:01:13 -07:00
Jeff McCune
23e38f1e7e compare: add more clarity to BuildPlans spec 2025-05-17 21:46:42 -07:00
Jeff McCune
a0f6776358 compare: align test cases with BuildPlans specification
Add comprehensive test cases to cover all specification requirements:
- File spec requirement 1: equal number of BuildPlans
- BuildPlan spec 1&2: all fields must be equivalent
- BuildPlan spec 3: nested objects must match recursively
- BuildPlan spec 4: exact field value matching with exceptions
- BuildPlan spec 4.1: unordered spec.artifacts list
- BuildPlan spec 4.2: key order irrelevance
- Toleration 1: multiple identical BuildPlans treated as unique
- Toleration 2: multiple BuildPlans with same metadata.name

Update existing test names and messages to clearly reference the specific specification requirements they validate.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 21:02:44 -07:00
Jeff McCune
830bb4f804 compare: doc spec for BuildPlan file equivalence
Document what it means for two BuildPlan Files to be equivalent.  So we
can write tests then verify them.
2025-05-17 20:48:36 -07:00
Jeff McCune
2e02bfe48a compare: clean up implementation and simplify diff output
Remove all label-specific references and simplify the diff output to show only what go-cmp reports. Extract field differences for cleaner test error messages while keeping the implementation generic for all fields.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 20:46:05 -07:00
Jeff McCune
b0d5fe0072 compare: add v1alpha6 compiler test case
This patch adds the output of the new stdio concurrenet compiler being
developed for v1alpha6 as after, which is semantically equivalent to the
v0.104.1 v1alpha5 holos show buildplans output.

Note the field orders and relative object order in the stream is quite
different.
2025-05-17 16:41:48 -07:00
Jeff McCune
f1ae5db910 compare: simplify implementation by removing label-specific handling
- Remove all label-specific functions and logic
- Treat labels as regular nested fields with no special handling
- Extract field differences from go-cmp output for test compatibility
- Remove before/after YAML output, show only the extracted differences
- All tests pass with this simplified, generic implementation
2025-05-17 15:01:35 -07:00
Jeff McCune
bc8ad22492 compare: add test case for annotations 2025-05-17 14:47:50 -07:00
Jeff McCune
4da0740a5e compare: make implementation generic by removing seq-specific logic
- Remove all hardcoded references to seq label
- Extract all labels for comparison instead of handling seq specially
- Compare structures without labels first, then check label differences
- Replace seq-specific functions with generic label handling functions
- This makes the implementation generic for any arbitrary labels
2025-05-17 14:37:13 -07:00
Jeff McCune
ee2d86d7df compare: remove unused functions
- Remove unused getCompositeKey function
- Remove unused deepEqual function
- These were replaced by the bipartite matching algorithm
2025-05-17 14:33:02 -07:00
Jeff McCune
7a94cc5f87 compare: fix labels3 test by implementing proper document matching
- Implement bipartite matching algorithm to match documents
- First pass finds exact matches including all labels
- Second pass handles unmatched documents and reports seq differences
- This allows labels2 (reordered documents) to pass without errors
- This allows labels3 (changed seq values) to report seq differences

The key insight is that labels3 has a document with seq:2 that has no
exact match in the after file (which only has seq:1 documents), so we
need to report the seq difference for that case.
2025-05-17 14:26:46 -07:00
Jeff McCune
0e9b02f337 compare: add test case for same object dupliacted in after
When the objects in the before stream differ only by a deeply nested
field value, the second object in before should not match any object in
after.
2025-05-17 13:57:23 -07:00
Jeff McCune
a419b08cca compare: implement labels2 test case for out-of-order object comparison
- Sort documents by composite key before comparison to handle out-of-order objects
- Exclude transient labels (like 'seq') from composite key generation
- Add deepCopy method to avoid modifying original structures
- Add removeTransientLabels to exclude labels that shouldn't affect semantic equivalence
- Use copies of documents in compareStructures to preserve original data
- Support comparison of identical objects that appear in different order in streams

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:47:49 -07:00
Jeff McCune
04f1a21ee8 compare: add test case for two out of sequence objects 2025-05-17 13:36:53 -07:00
Jeff McCune
88663e223b compare: remove all test-specific references from implementation
- Remove hardcoded test case checks for holos.run/stack.name and buildplan4
- Rename extractTestErrors to extractDifferences for clarity
- Make implementation completely generic to extract any field additions
- Maintain backward compatibility by keeping the same output format
- Remove all test-specific knowledge from the compare package

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:23:08 -07:00
Jeff McCune
2f77b1c09f compare: implement labels test case with expectedErrors list support
- Refactor test infrastructure to support expectedErrors as a list instead of single expectedError
- Implement generic field difference extraction for any object additions
- Update extractTestErrors method to handle arbitrary field additions
- Migrate all test cases from expectedError to expectedErrors format
- Maintain backward compatibility with existing test expectations
- Add support for detecting and formatting any field additions in diff output
- Clean up go-cmp type annotations in error messages for better readability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 13:11:05 -07:00
Jeff McCune
e2ea6deda2 compare: add test case for arbitrary labels 2025-05-17 12:59:15 -07:00
Jeff McCune
2131a99a30 compare: format and fixup claudes changes 2025-05-17 12:41:30 -07:00
Jeff McCune
9702efca70 compare: add testcase when after is a superset of before 2025-05-17 12:36:11 -07:00
Jeff McCune
658453bd76 compare: display full diff output from go-cmp
Enhance error messages to show the full diff output from go-cmp along
with specific field errors. This provides better visibility into all
differences between BuildPlans when they don't match.

- Show both specific field errors and full diff
- Maintain backward compatibility with existing tests
- Provide comprehensive diff output for debugging
- Improve user experience when comparing BuildPlans

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:48:48 -07:00
Jeff McCune
da7430e741 compare: fixup different labels test case name 2025-05-17 11:46:05 -07:00
Jeff McCune
57b491065a compare: implement buildplan3 test with diff error messages
Add support for showing meaningful diff messages when BuildPlans don't
match. Extract specific field differences from go-cmp diff output to
provide targeted error messages for common mismatches.

- Use go-cmp with custom transformers for order-independent comparison
- Parse diff output to extract specific field differences
- Show targeted error messages for label mismatches
- Pass buildplan3 test for different stack names

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:44:33 -07:00
Jeff McCune
48a40c808f compare: add testcase when labels are different 2025-05-17 11:41:08 -07:00
Jeff McCune
228dc3474b compare: implement buildplan2 test with deep order-independent comparison
Extend comparison logic to handle full BuildPlans with out-of-order
artifacts. Implement recursive deep comparison that sorts arrays at
all levels for true order-independent equality checking.

- Add deepEqual method for recursive order-independent comparison
- Improve sortSlice to handle nested maps correctly
- Support comparing complex BuildPlans with reordered artifacts
- Pass buildplan2 test for full BuildPlan comparison

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:36:39 -07:00
Jeff McCune
d83765e980 compare: add out of order artifacts test case 2025-05-17 11:30:45 -07:00
Jeff McCune
6ca6080a3f compare: add full buildplan test case 2025-05-17 11:27:08 -07:00
Jeff McCune
491efa0f4f compare: implement streams3 test case for duplicate names with labels
Extend the composite key function to handle BuildPlans with identical
names but different labels. This ensures proper matching when BuildPlans
have the same metadata.name but differ in other metadata fields.

- Enhance getCompositeKey to include sorted label key-value pairs
- Support BuildPlans with duplicate names distinguished by labels
- Ensure order-independent comparison works with complex metadata
- Pass streams3 test case for duplicate names with different labels

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:24:22 -07:00
Jeff McCune
5c1689b52b compare: add duplicate name test case 2025-05-17 11:19:16 -07:00
Jeff McCune
cd33f7b1dc compare: add name field to all test cases
Implement the name field for all test cases to provide more descriptive
test names in the test output. This improves test readability and
maintenance.

- Add name field to testCase struct
- Update test logic to use name field when provided
- Add descriptive names to all test cases
- Maintain nested test structure with directory/name hierarchy

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:13:43 -07:00
Jeff McCune
80559b7ca6 compare: add test case name field example 2025-05-17 11:11:16 -07:00
Jeff McCune
de9b177c71 compare: add descriptive messages to test cases
Enhance test cases with descriptive messages that explain what each
test is verifying. These messages are displayed when tests fail,
improving debugging experience.

- Add msg field to testCase struct
- Update all testcase.json files with descriptive messages
- Use messages in test assertions for better failure output
- Ensure all tests continue to pass with new structure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:06:09 -07:00
Jeff McCune
ebb8d8d44c compare: implement streams2 test case with order-independent comparison
Switch to using google/go-cmp for more robust comparison logic that
handles unordered document lists. This allows BuildPlans to be
considered equivalent even when documents appear in different orders.

- Replace custom equalMaps with cmp.Equal
- Add order-independent comparison for document lists
- Use cmpopts.SortSlices with composite key for sorting
- Support streams2 test case with reordered documents

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 11:03:06 -07:00
Jeff McCune
c9994a0851 compare: add out of order test case 2025-05-17 10:54:14 -07:00
Jeff McCune
45568f2e6d compare: implement streams test case for multi-document YAML
Extend BuildPlan comparison to handle YAML streams containing multiple
documents separated by ---. The implementation now properly parses and
compares files with multiple BuildPlan objects.

- Add parseYAMLStream function to handle multi-document YAML files
- Add compareDocumentLists to compare lists of parsed documents
- Refactor single document parsing to use streaming approach
- Maintain order-sensitive comparison for document sequences

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 10:49:26 -07:00
Jeff McCune
46cb7f5d29 compare: add streams test case 2025-05-17 10:48:53 -07:00
Jeff McCune
f34624e416 compare: implement minimal test case for BuildPlan comparison
Implement basic BuildPlan comparison functionality that can handle the
minimal test case. The implementation reads and parses YAML files,
then compares them for semantic equivalence.

- Add file reading and YAML parsing logic
- Implement basic map comparison for BuildPlans
- Handle empty files case with NotImplemented error
- Use errors.Format for consistent error handling
- Support minimal BuildPlans with just version and kind fields

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 10:14:33 -07:00
Jeff McCune
19690d760a compare: add minimal equal test case 2025-05-17 10:11:28 -07:00
Jeff McCune
35ede4293b Rename empty-files test case to empty
Simplify test case directory name from empty-files to empty.

- Rename testdata/empty-files/ to testdata/empty/
- Test continues to pass with cleaner naming

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 09:59:58 -07:00
Jeff McCune
1b499b1ab6 Rename want.json to testcase.json in compare package
Rename test configuration files from want.json to testcase.json for
better clarity of purpose. Updated test code to match the new naming.

- Rename want.json to testcase.json in testdata
- Update variable names from wantData to testcaseData
- Update error messages to reference testcase.json

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 09:58:03 -07:00
Jeff McCune
6a3b8da7f2 Refactor compare buildplans tests to package level
Move compare functionality from CLI package to dedicated internal/compare
package for better separation of concerns. CLI now acts as a thin wrapper
calling the compare package implementation.

- Create internal/compare package with Comparer type
- Move tests from CLI to compare package
- Update test fixtures path to testdata directory
- Replace CLI error with errors.NotImplemented()
- Clean up redundant test files from CLI package

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 06:59:48 -07:00
Jeff McCune
ee9969d409 Add structure for holos compare buildplans command
Introduce a new compare command with buildplans subcommand to verify
semantic equivalence between BuildPlan files. This will help users
validate their configurations remain equivalent when migrating from
v1alpha5 to v1alpha6.

- Add compare command structure with buildplans subcommand
- Implement table-driven test infrastructure reading from fixtures
- Create first test case with empty YAML files that expects failure
- Command returns "not implemented" error as a placeholder

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-17 06:46:40 -07:00
Jeff McCune
b635c233fa claude: initialize 2025-05-17 06:30:56 -07:00
179 changed files with 22598 additions and 346 deletions

13
.claude/settings.json Normal file
View File

@@ -0,0 +1,13 @@
{
"permissions": {
"allow": [
"Bash(cd:*)",
"Bash(holos:*)",
"Bash(cue:*)",
"Bash(git commit:*)",
"Bash(git add:*)",
"Bash(make:*)"
],
"deny": []
}
}

View File

@@ -25,6 +25,6 @@ jobs:
with:
go-version: stable
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
uses: golangci/golangci-lint-action@v7
with:
version: v1.64.5
version: v2.1.6

View File

@@ -30,6 +30,8 @@ jobs:
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: '3.17.3'
- name: Set up Kubectl
uses: azure/setup-kubectl@v4

4
.gitignore vendored
View File

@@ -17,4 +17,6 @@ node_modules/
# nix
/.direnv/
result
.aider*
# claude
/.claude/settings.local.json

View File

@@ -1,2 +1,20 @@
run:
timeout: 5m
version: "2"
linters:
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$

View File

@@ -16,6 +16,7 @@ Platform → Components → BuildPlan → Generators → Transformers → Valida
```bash
# Development
make build # Build the binary
make install # Install binary (REQUIRED before testing holos commands)
make test # Run all tests
make fmt # Format Go code
make lint # Run linters
@@ -25,7 +26,7 @@ make coverage # Generate coverage report
make update-docs # Update generated docs
make website # Build the documentation website
# Usage
# Usage (run 'make install' first to test code changes)
holos render platform # Render entire platform
holos render component # Render single component
holos show buildplans # Show build plans
@@ -81,12 +82,13 @@ Component: #Helm & {
## Development Patterns
1. Error handling: Use `internal/errors/` types, wrap with context
1. Error handling: Prefer `errors.Format()` from `/internal/errors/` over `fmt.Errorf()`
2. Logging: Use structured `slog`, get logger with `logger.FromContext(ctx)`
3. CLI commands: Follow Cobra patterns in `/internal/cli/`
4. CUE formatting: Always run `cue fmt` on CUE files
5. Develop against v1alpha6 packages.
6. Commits: Use the package name as the first word in the commit, lower case. Commit without asking permission.
5. Go formatting: Always run `go fmt` on go files
6. Develop against v1alpha6 packages.
7. Commits: Use the package name as the first word in the commit, lower case. Commit without asking permission. Always run `make lint` and `make test` before committing.
## Version Management
@@ -97,14 +99,17 @@ Component: #Helm & {
## Key Concepts
- **Platform**: Top-level configuration containing all components
- **Component**: Unit of configuration (Helm/Kustomize/Kubernetes)
- **BuildPlan**: Instructions for building a component
- **Generator**: Creates manifests (Helm, Kustomize, etc.)
- **Transformer**: Modifies generated manifests
- **Validator**: Validates final manifests
- **Component**: Unit of configuration (DAG of Tasks producing deployment configs for one component)
- **TaskSet**: DAG of Tasks (Similar to how make tasks behave)
- **BuildPlan**: Instructions for building a component. Deprecated in v1alpha6, use TaskSet instead.
- **Generator**: Creates manifests (Helm, Kustomize, etc.) author schema only in v1alpha6
- **Transformer**: Modifies generated manifests, author schema only in v1alpha6
- **Validator**: Validates final manifests, author schema only in v1alpha6
## Resources
- Tutorials: `/doc/md/tutorial/`
- Platform templates: `/internal/generate/platforms/`
- Test fixtures: `/internal/testutil/fixtures/`
- Core schemas: `/api/core/` (Abstraction over low level data pipeline tasks)
- Author schemas: `/api/author/` (User facing abstractions over core Schemas)

View File

@@ -1,6 +1,6 @@
FROM registry.k8s.io/kubectl:v1.31.0 AS kubectl
FROM registry.k8s.io/kubectl:v1.33.4 AS kubectl
# https://github.com/GoogleContainerTools/distroless
FROM golang:1.23 AS build
FROM golang:1.24 AS build
WORKDIR /go/src/app
COPY . .
@@ -18,8 +18,8 @@ RUN curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/s
COPY --from=kubectl /bin/kubectl /usr/local/bin/
# distroless
FROM gcr.io/distroless/static-debian12 AS final
# Use debian slim instead of distroless to get package management.
FROM public.ecr.aws/docker/library/debian:13-slim AS final
COPY --from=build \
/go/bin/holos \
/go/bin/kustomize \
@@ -27,5 +27,12 @@ COPY --from=build \
/usr/local/bin/helm \
/bin/
# Extra packages
# git - https://github.com/holos-run/holos/issues/440
RUN apt update && \
apt install -y --no-install-recommends git ca-certificates && \
apt clean && \
rm -rf /var/lib/apt/lists/*
# Usage: docker run -v $(pwd):/app --workdir /app --rm -it quay.io/holos-run/holos holos render platform
CMD ["/bin/holos"]

View File

@@ -136,6 +136,7 @@ unity: ## https://cuelabs.dev/unity/
.PHONY: update-docs
update-docs: ## Update doc examples
HOLOS_UPDATE_SCRIPTS=1 go test -v ./doc/md/...
HOLOS_UPDATE_SCRIPTS=1 go test -v ./doc/website/versioned_docs/...
.PHONY: help
help: ## Display this help menu.

View File

@@ -27,9 +27,9 @@ import core "github.com/holos-run/holos/api/core/v1alpha6"
// platform command. Use the Components field to register components with the
// platform.
type Platform struct {
Name string
Components map[NameLabel]core.Component
Resource core.Platform
Name string `json:"name" yaml:"name" cue:"string | *\"default\""`
Components map[NameLabel]core.Component `json:"components" yaml:"components"`
Resource core.Platform `json:"resource" yaml:"resource"`
}
// ComponentConfig represents the configuration common to all kinds of

View File

@@ -46,10 +46,10 @@ const ComponentAnnotationsTag = "holos_component_annotations"
//
// [external credential provider]: https://github.com/kubernetes/enhancements/blob/313ad8b59c80819659e1fbf0f165230f633f2b22/keps/sig-auth/541-external-credential-providers/README.md
type BuildPlan struct {
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// APIVersion represents the versioned schema of the resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"\"v1alpha6\""`
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`
// Spec specifies the desired state of the resource.
@@ -412,10 +412,10 @@ type Metadata struct {
//
// cue export --out yaml ./platform
type Platform struct {
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// APIVersion represents the versioned schema of this resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha6\""`
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`

View File

@@ -12,7 +12,8 @@ stderr -count=1 '^rendered platform'
# Holos uses CUE to build a platform specification.
exec holos show platform
cmp stdout want/1.platform_spec.yaml
cp stdout platform.yaml
exec holos compare yaml platform.yaml want/1.platform_spec.yaml
# Define the host and port in projects/blackbox.schema.cue
mv projects/blackbox.schema.cue.disabled projects/blackbox.schema.cue
@@ -25,7 +26,7 @@ mv platform/prometheus.cue.disabled platform/prometheus.cue
exec holos render platform
stderr -count=1 '^rendered prometheus'
stderr -count=1 '^rendered platform'
cmp deploy/components/prometheus/prometheus.gen.yaml want/1.prometheus.gen.yaml
exec holos compare yaml deploy/components/prometheus/prometheus.gen.yaml want/1.prometheus.gen.yaml
# Add the CUE configuration to manage the blackbox Helm Chart component.
mv projects/platform/components/blackbox/blackbox.cue.disabled projects/platform/components/blackbox/blackbox.cue
@@ -37,7 +38,7 @@ exec holos render platform ./platform
stderr -count=1 '^rendered prometheus'
stderr -count=1 '^rendered blackbox'
stderr -count=1 '^rendered platform'
cmp deploy/components/blackbox/blackbox.gen.yaml want/1.blackbox.gen.yaml
exec holos compare yaml deploy/components/blackbox/blackbox.gen.yaml want/1.blackbox.gen.yaml
# Import helm values
exec cue import --package holos --path 'Helm: Values:' --outfile projects/platform/components/prometheus/values.cue projects/platform/components/prometheus/vendor/25.27.0/prometheus/values.yaml
@@ -55,7 +56,7 @@ mv platform/httpbin.cue.disabled platform/httpbin.cue
# Render the platform with httpbin
exec holos render platform ./platform
stderr -count=1 '^rendered httpbin'
cmp deploy/components/httpbin/httpbin.gen.yaml want/1.httpbin.gen.yaml
exec holos compare yaml deploy/components/httpbin/httpbin.gen.yaml want/1.httpbin.gen.yaml
# Verify the labels are correct
grep 'replacement: blackbox:9115' deploy/components/prometheus/prometheus.gen.yaml

View File

@@ -3,7 +3,8 @@
exec holos init platform v1alpha5 --force
# want a buildplan shown
exec holos show buildplans
cmp stdout buildplan.yaml
cp stdout buildplan-output.yaml
exec holos compare yaml buildplan-output.yaml buildplan.yaml
# want this error to go away
! stderr 'cannot convert non-concrete value string'
-- platform/example.cue --

View File

@@ -4,10 +4,12 @@ env HOME=$WORK
exec holos init platform v1alpha5 --force
exec holos show platform
cmp stdout want/empty.yaml
cp stdout empty.yaml
exec holos compare yaml empty.yaml want/empty.yaml
exec holos show platform -t foo
cmp stdout want/foo.yaml
cp stdout foo.yaml
exec holos compare yaml foo.yaml want/foo.yaml
-- platform/empty.cue --
@if(foo)

View File

@@ -1,4 +1,5 @@
# https://github.com/holos-run/holos/issues/330
# take care to install helm 3.17.3 otherwise kube versions may not align
exec holos init platform v1alpha5 --force
# Make sure the helm chart works with plain helm
exec helm template ./components/capabilities/vendor/0.1.0/capabilities
@@ -6,13 +7,13 @@ stdout 'name: has-foo-v1beta1'
stdout 'kubeVersion: v'
exec holos render platform ./platform
# When no capabilities are specified
cmp deploy/components/capabilities/capabilities.gen.yaml want/when-no-capabilities-specified.yaml
exec holos compare yaml deploy/components/capabilities/capabilities.gen.yaml want/when-no-capabilities-specified.yaml
# With APIVersions specified
cmp deploy/components/specified/specified.gen.yaml want/with-capabilities-specified.yaml
exec holos compare yaml deploy/components/specified/specified.gen.yaml want/with-capabilities-specified.yaml
# With KubeVersion specified
cmp deploy/components/kubeversion1/kubeversion1.gen.yaml want/with-kubeversion-specified.yaml
exec holos compare yaml deploy/components/kubeversion1/kubeversion1.gen.yaml want/with-kubeversion-specified.yaml
# With both APIVersions and KubeVersion specified
cmp deploy/components/kubeversion2/kubeversion2.gen.yaml want/with-both-specified.yaml
exec holos compare yaml deploy/components/kubeversion2/kubeversion2.gen.yaml want/with-both-specified.yaml
-- want/with-both-specified.yaml --
apiVersion: v1
kind: Service
@@ -44,7 +45,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
name: has-foo-v1beta1
spec:
ports:
@@ -57,7 +58,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
name: has-foo-v1
spec:
ports:
@@ -103,7 +104,7 @@ Component: #Helm & {
Chart: version: "0.1.0"
_APIVersions: string | *"[]" @tag(apiVersions, type=string)
APIVersions: json.Unmarshal(_APIVersions)
KubeVersion: string | *"v1.31.0" @tag(kubeVersion, type=string)
KubeVersion: string | *"v1.99.0" @tag(kubeVersion, type=string)
}
-- components/capabilities/vendor/0.1.0/capabilities/Chart.yaml --
apiVersion: v2
@@ -137,7 +138,7 @@ kind: Service
metadata:
name: has-foo-v1beta1
annotations:
kubeVersion: v1.31.0
kubeVersion: v1.99.0
spec:
ports:
- port: 80

View File

@@ -12,7 +12,8 @@ stderr -count=1 '^rendered platform'
# When author.#Kubernetes is empty
exec holos cue export --expression holos --out=yaml ./components/empty
cmp stdout want.txt
cp stdout empty.yaml
exec holos compare yaml empty.yaml want.txt
-- components/empty/empty.cue --
package holos

View File

@@ -180,9 +180,9 @@ Platform assembles a core Platform in the Resource field for the holos render pl
```go
type Platform struct {
Name string
Components map[NameLabel]core.Component
Resource core.Platform
Name string `json:"name" yaml:"name" cue:"string | *\"default\""`
Components map[NameLabel]core.Component `json:"components" yaml:"components"`
Resource core.Platform `json:"resource" yaml:"resource"`
}
```

View File

@@ -209,10 +209,10 @@ Holos uses CUE to construct a BuildPlan. Holos injects late binding values such
```go
type BuildPlan struct {
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// APIVersion represents the versioned schema of the resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"\"v1alpha6\""`
// Kind represents the type of the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"BuildPlan\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`
// Spec specifies the desired state of the resource.
@@ -491,10 +491,10 @@ cue export --out yaml ./platform
```go
type Platform struct {
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// APIVersion represents the versioned schema of this resource.
APIVersion string `json:"apiVersion" yaml:"apiVersion" cue:"string | *\"v1alpha6\""`
// Kind is a string value representing the resource.
Kind string `json:"kind" yaml:"kind" cue:"\"Platform\""`
// Metadata represents data about the resource such as the Name.
Metadata Metadata `json:"metadata" yaml:"metadata"`

View File

@@ -1,52 +0,0 @@
# Compare Buildplans
Use the `holos compare buildplans <f1> <f2>` command to compare two BuildPlan
Files. Useful to ensure different configuration versions produce the same
results.
The `holos show buildplans` command writes a BuildPlan File to standard output.
A BuildPlan File is a yaml encoded stream of BuildPlan objects.
## User Requirements
1. `holos compare buildplans before.yaml after.yaml` must return exit code 1 when after.yaml contains fields (recursively) not present in before.yaml
2. `holos compare buildplans before.yaml after.yaml --backwards-compatible` must return exit code 0 when after.yaml contains fields (recursively) not present in before.yaml
## Behavior Specification
BuildPlan File f1 is equivalent to f2 when:
1. f1 and f2 have an equal number of BuildPlan objects.
2. each object in f1 is equivalent to exactly one unique object in f2.
Two BuildPlans, bp1 and bp2, are equivalent when:
1. All field values in bp1 are equivalent to the same field in bp2.
2. Both 1 and 2 apply to nested objects, recursively.
3. Field f is equivalent when bp1.f exactly equals bp2.f, except for:
3.1. Objects in the spec.artifacts list may appear in any arbitrary order.
3.2. The ordering of keys does not matter.
4. Backwards compatibility behavior (controlled by isBackwardsCompatible):
- When false: bp2 and bp1 must have exactly the same fields
- When true: bp2 may have additional fields that don't exist in bp1
(e.g., new features added in a newer version)
Example:
bp1 has {name: "x", version: "1.0"}
bp2 has {name: "x", version: "1.0", newFeature: "enabled"}
This comparison passes when isBackwardsCompatible=true
5. Fields in bp1 must always be present in bp2 (regardless of backwards
compatibility mode).
6. List type fields with a null value are equivalent to:
6.1. null values
6.2. empty values ([])
6.2. a missing field
A BuildPlan File is valid when:
1. Two or more identical objects exist in the same file. They must be
treated as unique objects when comparing BuildPlan Files
2. Two objects may have the same value for the metadata.name field.
3. The kind field of all objects in the file stream is "BuildPlan"
## Implementation Guidance
1. Implement a stub Comparer struct in the internal/compare package.
2. Implement a stub Comparer.BuildPlans() method.
3. Write test cases for each item in the Behavior Specification section. Use a table test approach that loads each test case from a subdirectory and reads the test case data from a `testcase.json` file. The json file should have an exitCode, name, msg, file1 and file2 fields. file1 is "before.yaml" and file2 is "after.yaml".
4. Modify the Comparer.BuildPlans() method to satisfy each test case.
5. Using the existing commands as an example, wire up the command line to the compare package.

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -1 +1 @@
0.104.1
0.104.3

View File

@@ -1,3 +1,2 @@
cached podinfo 6.6.2
rendered podinfo in 1.938665041s
rendered platform in 1.938759417s
rendered podinfo in 160.977334ms
rendered platform in 161.101292ms

View File

@@ -9,9 +9,8 @@
|-- platform
| |-- platform.gen.cue
| `-- podinfo.cue
|-- platform.metadata.json
|-- resources.cue
|-- schema.cue
`-- tags.cue
8 directories, 7 files
8 directories, 6 files

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -1 +1 @@
0.104.1
0.104.3

View File

@@ -1,3 +1,3 @@
[main 1adcd08] add blackbox configuration
[main 70107f8] add blackbox configuration
1 file changed, 15 insertions(+)
create mode 100644 components/blackbox.cue
create mode 100644 config/prometheus/blackbox.cue

View File

@@ -1,2 +1,3 @@
[main 4221803] integrate blackbox and prometheus together
2 files changed, 4 insertions(+), 2 deletions(-)
[main dc787e2] integrate blackbox and prometheus together
3 files changed, 1348 insertions(+), 2 deletions(-)
create mode 100644 components/prometheus/values.cue.orig

View File

@@ -1,4 +1,4 @@
[main 52e90ea] import values
[main aaf64bb] import values
2 files changed, 1815 insertions(+)
create mode 100644 components/blackbox/values.cue
create mode 100644 components/prometheus/values.cue

View File

@@ -1,3 +1,3 @@
rendered blackbox in 365.936792ms
rendered prometheus in 371.855875ms
rendered platform in 372.109916ms
rendered blackbox in 111.222667ms
rendered prometheus in 139.292917ms
rendered platform in 139.350708ms

View File

@@ -1,4 +1,4 @@
[main b5df111] add blackbox and prometheus
[main 688da56] add blackbox and prometheus
5 files changed, 1550 insertions(+)
create mode 100644 components/blackbox/blackbox.cue
create mode 100644 components/prometheus/prometheus.cue

View File

@@ -1,5 +1,3 @@
cached prometheus-blackbox-exporter 9.0.1
rendered blackbox in 3.825430417s
cached prometheus 25.27.0
rendered prometheus in 4.840089667s
rendered platform in 4.840137792s
rendered blackbox in 778.713375ms
rendered prometheus in 839.024292ms
rendered platform in 839.07325ms

View File

@@ -1,2 +1,2 @@
[main 67efe0d] render integrated blackbox and prometheus manifests
[main 2d46297] render integrated blackbox and prometheus manifests
2 files changed, 7 insertions(+), 7 deletions(-)

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -1 +1 @@
0.104.1
0.104.3

View File

@@ -27,9 +27,9 @@ spec:
- includeSelectors: false
pairs:
app.kubernetes.io/name: httpbin
patches: []
images:
- name: mccutchen/go-httpbin
patches: []
resources:
- resources.gen.yaml
- httpbin.yaml

View File

@@ -1,4 +1,4 @@
[main 823e136] add httpbin
[main f621828] add httpbin
4 files changed, 113 insertions(+)
create mode 100644 components/httpbin/httpbin.cue
create mode 100644 components/httpbin/httpbin.yaml

View File

@@ -1,3 +1,3 @@
[main 96f5f45] annotate httpbin for prometheus probes
[main 0cccd8c] annotate httpbin for prometheus probes
2 files changed, 18 insertions(+)
create mode 100644 components/httpbin/patches.cue

View File

@@ -1,2 +1,2 @@
rendered httpbin in 112.916375ms
rendered platform in 112.990333ms
rendered httpbin in 77.754459ms
rendered platform in 77.832042ms

View File

@@ -1,2 +1,2 @@
rendered httpbin in 111.183042ms
rendered platform in 111.265792ms
rendered httpbin in 77.095625ms
rendered platform in 77.190416ms

View File

@@ -84,10 +84,14 @@ Install these tools to use Holos's full capabilities:
- [Kubectl] for [kustomize] operations
:::note
Holos is tested with Helm `v3.16.2`. If you see `Error: chart requires
Holos is tested with Helm `v3.17.3`. If you see `Error: chart requires
kubeVersion` errors, try upgrading Helm.
:::
## Known Issues
Helm `v3.18.0` has a [known issue](https://github.com/NixOS/nixpkgs/pull/322994) that causes it to produce incorrect output. This may affect Holos users. For more details, see [Holos issue #433](https://github.com/holos-run/holos/issues/433).
## Next Steps
With your platform structure initialized, proceed to [Hello Holos] to learn Helm

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -1,3 +1,2 @@
cached podinfo 6.6.2
rendered podinfo in 1.938665041s
rendered platform in 1.938759417s
rendered podinfo in 159.277916ms
rendered platform in 159.380625ms

View File

@@ -9,9 +9,8 @@
|-- platform
| |-- platform.gen.cue
| `-- podinfo.cue
|-- platform.metadata.json
|-- resources.cue
|-- schema.cue
`-- tags.cue
8 directories, 7 files
8 directories, 6 files

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -1,3 +1,3 @@
[main 1adcd08] add blackbox configuration
[main 7761ac1] add blackbox configuration
1 file changed, 15 insertions(+)
create mode 100644 components/blackbox.cue
create mode 100644 config/prometheus/blackbox.cue

View File

@@ -1,2 +1,3 @@
[main 4221803] integrate blackbox and prometheus together
2 files changed, 4 insertions(+), 2 deletions(-)
[main 8c81fed] integrate blackbox and prometheus together
3 files changed, 1348 insertions(+), 2 deletions(-)
create mode 100644 components/prometheus/values.cue.orig

View File

@@ -1,4 +1,4 @@
[main 52e90ea] import values
[main 18c7aad] import values
2 files changed, 1815 insertions(+)
create mode 100644 components/blackbox/values.cue
create mode 100644 components/prometheus/values.cue

View File

@@ -1,3 +1,3 @@
rendered blackbox in 365.936792ms
rendered prometheus in 371.855875ms
rendered platform in 372.109916ms
rendered blackbox in 110.354458ms
rendered prometheus in 138.13225ms
rendered platform in 138.168958ms

View File

@@ -1,4 +1,4 @@
[main b5df111] add blackbox and prometheus
[main ff5bfaa] add blackbox and prometheus
5 files changed, 1550 insertions(+)
create mode 100644 components/blackbox/blackbox.cue
create mode 100644 components/prometheus/prometheus.cue

View File

@@ -1,5 +1,3 @@
cached prometheus-blackbox-exporter 9.0.1
rendered blackbox in 3.825430417s
cached prometheus 25.27.0
rendered prometheus in 4.840089667s
rendered platform in 4.840137792s
rendered blackbox in 693.763959ms
rendered prometheus in 788.544209ms
rendered platform in 788.618792ms

View File

@@ -1,2 +1,2 @@
[main 67efe0d] render integrated blackbox and prometheus manifests
[main 4033953] render integrated blackbox and prometheus manifests
2 files changed, 7 insertions(+), 7 deletions(-)

View File

@@ -4,4 +4,4 @@ cmp stdout $WORK/output.txt
-- command.sh --
holos --version
-- output.txt --
0.104.1
0.104.3

View File

@@ -27,9 +27,9 @@ spec:
- includeSelectors: false
pairs:
app.kubernetes.io/name: httpbin
patches: []
images:
- name: mccutchen/go-httpbin
patches: []
resources:
- resources.gen.yaml
- httpbin.yaml

View File

@@ -1,4 +1,4 @@
[main 823e136] add httpbin
[main 1b332f8] add httpbin
4 files changed, 113 insertions(+)
create mode 100644 components/httpbin/httpbin.cue
create mode 100644 components/httpbin/httpbin.yaml

View File

@@ -1,3 +1,3 @@
[main 96f5f45] annotate httpbin for prometheus probes
[main e37f8ce] annotate httpbin for prometheus probes
2 files changed, 18 insertions(+)
create mode 100644 components/httpbin/patches.cue

View File

@@ -1,2 +1,2 @@
rendered httpbin in 112.916375ms
rendered platform in 112.990333ms
rendered httpbin in 77.710709ms
rendered platform in 77.792958ms

View File

@@ -1,2 +1,2 @@
rendered httpbin in 111.183042ms
rendered platform in 111.265792ms
rendered httpbin in 76.942666ms
rendered platform in 77.014958ms

44
go.mod
View File

@@ -1,28 +1,29 @@
module github.com/holos-run/holos
go 1.23
go 1.23.0
toolchain go1.23.2
toolchain go1.23.6
require (
cuelang.org/go v0.12.0
cuelang.org/go v0.14.1
github.com/google/go-cmp v0.7.0
github.com/mattn/go-isatty v0.0.20
github.com/mattn/go-runewidth v0.0.15
github.com/olekukonko/tablewriter v0.0.5
github.com/princjef/gomarkdoc v1.1.0
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
github.com/rogpeppe/go-internal v1.14.1
github.com/spf13/cobra v1.9.1
github.com/spf13/pflag v1.0.7
github.com/stretchr/testify v1.10.0
golang.org/x/sync v0.10.0
golang.org/x/tools v0.29.0
golang.org/x/sync v0.16.0
golang.org/x/tools v0.35.0
gopkg.in/yaml.v3 v3.0.1
helm.sh/helm/v3 v3.16.3
sigs.k8s.io/kustomize/kustomize/v5 v5.5.0
)
require (
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1 // indirect
cuelabs.dev/go/oci/ociregistry v0.0.0-20250715075730-49cab49c8e9d // indirect
dario.cat/mergo v1.0.1 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
@@ -57,7 +58,7 @@ require (
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/emicklei/proto v1.13.4 // indirect
github.com/emicklei/proto v1.14.2 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/evanphx/json-patch v5.9.0+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
@@ -81,7 +82,6 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/btree v1.0.1 // indirect
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20240622144329-c177fd99eaa9 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
@@ -128,8 +128,8 @@ require (
github.com/nxadm/tail v1.4.11 // indirect
github.com/onsi/ginkgo v1.16.4 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
@@ -140,7 +140,7 @@ require (
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20250627152318-f293424e46b5 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rubenv/sql-migrate v1.7.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
@@ -155,7 +155,7 @@ require (
github.com/spf13/cast v1.7.0 // indirect
github.com/spf13/viper v1.18.2 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tetratelabs/wazero v1.6.0 // indirect
github.com/tetratelabs/wazero v1.9.0 // indirect
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
@@ -168,14 +168,14 @@ require (
go.opentelemetry.io/otel/metric v1.28.0 // indirect
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/term v0.33.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
google.golang.org/grpc v1.65.0 // indirect

83
go.sum
View File

@@ -1,7 +1,7 @@
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1 h1:mRwydyTyhtRX2wXS3mqYWzR2qlv6KsmoKXmlz5vInjg=
cuelabs.dev/go/oci/ociregistry v0.0.0-20241125120445-2c00c104c6e1/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg=
cuelang.org/go v0.12.0 h1:q4W5I+RtDIA27rslQyyt6sWkXX0YS9qm43+U1/3e0kU=
cuelang.org/go v0.12.0/go.mod h1:B4+kjvGGQnbkz+GuAv1dq/R308gTkp0sO28FdMrJ2Kw=
cuelabs.dev/go/oci/ociregistry v0.0.0-20250715075730-49cab49c8e9d h1:lX0EawyoAu4kgMJJfy7MmNkIHioBcdBGFRSKDZ+CWo0=
cuelabs.dev/go/oci/ociregistry v0.0.0-20250715075730-49cab49c8e9d/go.mod h1:4WWeZNxUO1vRoZWAHIG0KZOd6dA25ypyWuwD3ti0Tdc=
cuelang.org/go v0.14.1 h1:kxFAHr7bvrCikbtVps2chPIARazVdnRmlz65dAzKyWg=
cuelang.org/go v0.14.1/go.mod h1:aSP9UZUM5m2izHAHUvqtq0wTlWn5oLjuv2iBMQZBLLs=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
@@ -82,7 +82,7 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8=
@@ -115,8 +115,8 @@ github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug
github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.13.4 h1:myn1fyf8t7tAqIzV91Tj9qXpvyXXGXk8OS2H6IBSc9g=
github.com/emicklei/proto v1.13.4/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emicklei/proto v1.14.2 h1:wJPxPy2Xifja9cEMrcA/g08art5+7CGJNFNk35iXC1I=
github.com/emicklei/proto v1.14.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
@@ -206,8 +206,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -362,10 +362,10 @@ github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
@@ -404,15 +404,15 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA=
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c=
github.com/protocolbuffers/txtpbfmt v0.0.0-20250627152318-f293424e46b5 h1:WWs1ZFnGobK5ZXNu+N9If+8PDNVB9xAqrib/stUXsV4=
github.com/protocolbuffers/txtpbfmt v0.0.0-20250627152318-f293424e46b5/go.mod h1:BnHogPTyzYAReeQLZrOxyxzS739DaTNtTvohVdbENmA=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a h1:w3tdWGKbLGBPtR/8/oO74W6hmz0qE5q0z9aqSAewaaM=
github.com/rogpeppe/go-internal v1.13.2-0.20241226121412-a5dc8ff20d0a/go.mod h1:S8kfXMp+yh77OxPD4fdM6YUknrZpQxLhvxzS4gDHENY=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI=
github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -437,10 +437,11 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -456,8 +457,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzlP3g=
github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A=
github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
@@ -500,14 +501,14 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -517,18 +518,18 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -558,16 +559,16 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -575,8 +576,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@@ -13,7 +13,7 @@ func New(name string) *cobra.Command {
cmd := &cobra.Command{
Use: name,
Short: name,
Version: version.Version,
Version: version.GetVersion(),
Args: cobra.NoArgs,
CompletionOptions: cobra.CompletionOptions{
HiddenDefaultCmd: true,

70
internal/cli/compare.go Normal file
View File

@@ -0,0 +1,70 @@
package cli
import (
"github.com/holos-run/holos/internal/compare"
"github.com/holos-run/holos/internal/errors"
"github.com/spf13/cobra"
)
// New for the compare command.
func NewCompareCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "compare",
Short: "Compare Holos resources",
Long: "Compare Holos resources to verify semantic equivalence",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
return errors.Format("unknown command %q for %q", args[0], cmd.CommandPath())
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
return cmd.Help()
},
}
cmd.AddCommand(NewCompareBuildPlansCmd())
cmd.AddCommand(NewCompareYAMLCmd())
return cmd
}
// New for the compare buildplans subcommand.
func NewCompareBuildPlansCmd() *cobra.Command {
var backwardsCompatible bool
cmd := &cobra.Command{
Use: "buildplans [file1] [file2]",
Short: "Compare two BuildPlan files",
Long: "Compare two BuildPlan files to verify they are semantically equivalent",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
c := compare.New()
return c.BuildPlans(args[0], args[1], backwardsCompatible)
},
}
cmd.Flags().BoolVar(&backwardsCompatible, "backwards-compatible", false, "Enable backwards compatibility mode where file2 may have fields missing from file1")
return cmd
}
// New for the compare yaml subcommand.
func NewCompareYAMLCmd() *cobra.Command {
var backwardsCompatible bool
cmd := &cobra.Command{
Use: "yaml [file1] [file2]",
Short: "Compare two yaml object streams",
Long: "Compare two yaml object streams to verify they are structurally equivalent",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
c := compare.New()
// TODO(jeff): Add a YAML() function.
return c.BuildPlans(args[0], args[1], backwardsCompatible)
},
}
cmd.Flags().BoolVar(&backwardsCompatible, "backwards-compatible", false, "Enable backwards compatibility mode where file2 may have fields missing from file1")
return cmd
}

27
internal/cli/compile.go Normal file
View File

@@ -0,0 +1,27 @@
package cli
import (
_ "embed"
"github.com/holos-run/holos/internal/cli/command"
"github.com/holos-run/holos/internal/compile"
"github.com/holos-run/holos/internal/errors"
"github.com/spf13/cobra"
)
//go:embed compile.txt
var compileLong string
// NewCompileCmd returns a new compile command.
func NewCompileCmd() *cobra.Command {
cmd := command.New("compile")
cmd.Short = "Compile Components (stdin) to BuildPlans (stdout) using CUE"
cmd.Long = compileLong
cmd.Args = cobra.NoArgs
cmd.RunE = func(cmd *cobra.Command, args []string) error {
c := compile.New()
ctx := cmd.Root().Context()
return errors.Wrap(c.Run(ctx))
}
return cmd
}

17
internal/cli/compile.txt Normal file
View File

@@ -0,0 +1,17 @@
Reads a stream of JSON-encoded Component objects from standard input. For each
Component, builds a CUE instance then exports a BuildPlan. Each resulting
BuildPlan is written as a JSON-encoded object to standard output.
This command encapsulates cue export for concurrent use. It may be used directly
by piping the output of holos show platform through jq to select the components
list, then to stdin of this command. This command is most often invoked 'holos
render platform' to run concurrent cue exports safely.
For example:
holos show platform --format=json \
| jq '.spec.components[] | {kind: "Component", apiVersion: "v1alpha6", component: .}' \
| holos compile --log-level=debug
Note each platform components element is embedded into the component field of an
enveloping object for the purpose of conveying type metadata.

View File

@@ -61,6 +61,8 @@ func (r *renderPlatform) Run(ctx context.Context, p *platform.Platform) error {
args := make([]string, 0, 100)
args = append(args, prefixArgs...)
args = append(args, "render", "component")
// Add the write-to flag
args = append(args, "--write-to", r.pcfg.WriteTo)
// holos render platform --inject tags
for _, tag := range r.pcfg.TagMap.Tags() {
args = append(args, "--inject", tag)

View File

@@ -76,6 +76,12 @@ func New(cfg *holos.Config) *cobra.Command {
// Show
rootCmd.AddCommand(NewShowCmd(platform.NewConfig()))
// Compare
rootCmd.AddCommand(NewCompareCmd())
// Compile
rootCmd.AddCommand(NewCompileCmd())
return rootCmd
}
@@ -107,9 +113,9 @@ func HandleError(ctx context.Context, err error, hc *holos.Config) (exitCode int
if errors.As(err, &errAt) {
loc := errAt.Source.Loc()
err2 := errAt.Unwrap()
log.ErrorContext(ctx, fmt.Sprintf("could not run: %s at %s", err2, loc), "err", err2, "loc", loc)
log.ErrorContext(ctx, fmt.Sprintf("error at %s: %s", loc, err2), "err", err2, "loc", loc)
} else {
log.ErrorContext(ctx, fmt.Sprintf("could not run: %s", err), "err", err)
log.ErrorContext(ctx, err.Error(), "err", err)
}
// cue errors are bundled up as a list and refer to multiple files / lines.

View File

@@ -3,10 +3,15 @@ package cli
import (
"context"
_ "embed"
"encoding/json"
"fmt"
"io"
"log/slog"
v1alpha5 "github.com/holos-run/holos/api/core/v1alpha5"
v1alpha6 "github.com/holos-run/holos/api/core/v1alpha6"
"github.com/holos-run/holos/internal/cli/command"
"github.com/holos-run/holos/internal/component"
"github.com/holos-run/holos/internal/compile"
"github.com/holos-run/holos/internal/errors"
"github.com/holos-run/holos/internal/holos"
"github.com/holos-run/holos/internal/platform"
@@ -77,37 +82,62 @@ func (s *showBuildPlans) flagSet() *pflag.FlagSet {
}
func (s *showBuildPlans) Run(ctx context.Context, p *platform.Platform) error {
encoder, err := holos.NewSequentialEncoder(s.format, s.cfg.Stdout)
components := p.Select(s.cfg.ComponentSelectors...)
reqs := make([]compile.BuildPlanRequest, len(components))
for idx, c := range components {
tags, err := c.Tags()
if err != nil {
return errors.Wrap(err)
}
reqs[idx] = compile.BuildPlanRequest{
APIVersion: "v1alpha6",
Kind: "BuildPlanRequest",
Root: p.Root(),
Leaf: c.Path(),
WriteTo: s.cfg.WriteTo,
TempDir: "${TMPDIR_PLACEHOLDER}",
Tags: tags,
}
}
resp, err := compile.Compile(ctx, s.cfg.Concurrency, reqs)
if err != nil {
return errors.Wrap(err)
}
defer encoder.Close()
opts := platform.BuildOpts{
PerComponentFunc: func(ctx context.Context, idx int, pc holos.Component) error {
c := component.New(p.Root(), pc.Path(), component.NewConfig())
tm, err := c.TypeMeta()
if err != nil {
return errors.Wrap(err)
}
opts := holos.NewBuildOpts(p.Root(), pc.Path(), s.cfg.WriteTo, "${TMPDIR_PLACEHOLDER}")
// TODO(jjm): refactor into [holos.NewBuildOpts] as functional options.
// Component name, label, annotations passed via tags to cue.
tags, err := pc.Tags()
if err != nil {
return errors.Wrap(err)
}
opts.Tags = tags
bp, err := c.BuildPlan(tm, opts)
if err != nil {
return errors.Wrap(err)
}
// Export the build plan using the sequential encoder.
return errors.Wrap(bp.Export(idx, encoder))
},
encoder, err := holos.NewEncoder(s.format, s.cfg.Stdout)
if err != nil {
return errors.Wrap(err)
}
return errors.Wrap(p.Build(ctx, opts))
for _, buildPlanResponse := range resp {
var tm holos.TypeMeta
if err := json.Unmarshal(buildPlanResponse.RawMessage, &tm); err != nil {
return errors.Format("could not discriminate type meta: %w", err)
}
if tm.Kind != "BuildPlan" {
return errors.Format("invalid kind %s: must be BuildPlan", tm.Kind)
}
var buildPlan any
switch tm.APIVersion {
case "v1alpha5":
buildPlan = &v1alpha5.BuildPlan{}
case "v1alpha6":
buildPlan = &v1alpha6.BuildPlan{}
default:
slog.WarnContext(ctx, fmt.Sprintf("unknown BuildPlan APIVersion %s: assuming v1alpha6 schema", tm.APIVersion))
buildPlan = &v1alpha6.BuildPlan{}
}
if err := json.Unmarshal(buildPlanResponse.RawMessage, buildPlan); err != nil {
return errors.Wrap(err)
}
if err := encoder.Encode(buildPlan); err != nil {
return errors.Wrap(err)
}
}
return nil
}

View File

@@ -81,7 +81,8 @@ func TestShowAlpha6(t *testing.T) {
err = yaml.Unmarshal(wantBytes, &want)
require.NoError(t, err)
want.BuildContext.RootDir = tempDir
want.BuildContext.HolosExecutable = "holos"
want.BuildContext.HolosExecutable, err = util.Executable()
require.NoError(t, err)
want.BuildContext.LeafDir = "fixtures/v1alpha6/components/slice"
t.Run("FormatYAML", func(t *testing.T) {

401
internal/compare/compare.go Normal file
View File

@@ -0,0 +1,401 @@
package compare
import (
"bytes"
"io"
"os"
"sort"
"strings"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/holos-run/holos/internal/errors"
"gopkg.in/yaml.v3"
)
// Comparer handles comparison operations between BuildPlans
type Comparer struct {
}
// New creates a new Comparer instance
func New() *Comparer {
return &Comparer{}
}
// BuildPlans compares two BuildPlan Files for semantic equivalence.
//
// The holos show buildplans command writes a BuildPlan File to standard output.
// A BuildPlan File is a yaml encoded stream of BuildPlan objects.
//
// BuildPlan File one is equivalent to two when:
// 1. one and two have an equal number of BuildPlan objects.
// 2. each object in one is equivalent to exactly one unique object in two.
//
// Two BuildPlans, before and after, are equivalent when:
//
// 1. All field values in before are equivalent to the same field in after
// 2. Both 1 and 2 apply to nested objects, recursively.
// 3. Field f is equivalent when before.f exactly equals after.f, except for:
// 3.1. Objects in the spec.artifacts list may appear in any arbitrary order.
// 3.2. The ordering of keys does not matter.
// 4. Backwards compatibility behavior (controlled by isBackwardsCompatible):
// - When false: after and before must have exactly the same fields
// - When true: after may have additional fields that don't exist in before
// (e.g., new features added in a newer version)
// Example:
// before has {name: "x", version: "1.0"}
// after has {name: "x", version: "1.0", newFeature: "enabled"}
// This comparison passes when isBackwardsCompatible=true
// 5. Fields in before must always be present in after (regardless of backwards
// compatibility mode).
// 6. List type fields with a null value are equivalent to:
// 6.1. null values
// 6.2. empty values ([])
// 6.2. a missing field
//
// A BuildPlan File is valid when:
// 1. Two or more identical objects exist in the same file. They must be
// treated as unique objects when comparing BuildPlan Files
// 2. Two objects may have the same value for the metadata.name field.
// 3. The kind field of all objects in the file stream is "BuildPlan"
func (c *Comparer) BuildPlans(one, two string, isBackwardsCompatible bool) error {
// Read both files
file1, err := os.Open(one)
if err != nil {
return errors.Format("opening first file: %w", err)
}
defer file1.Close()
file2, err := os.Open(two)
if err != nil {
return errors.Format("opening second file: %w", err)
}
defer file2.Close()
// Read all content from both files
content1, err := io.ReadAll(file1)
if err != nil {
return errors.Format("reading first file: %w", err)
}
content2, err := io.ReadAll(file2)
if err != nil {
return errors.Format("reading second file: %w", err)
}
// Handle empty files case
if len(content1) == 0 && len(content2) == 0 {
return errors.NotImplemented()
}
// Parse YAML streams (multiple documents)
docs1, err := parseYAMLStream(content1)
if err != nil {
return errors.Format("parsing first file: %w", err)
}
docs2, err := parseYAMLStream(content2)
if err != nil {
return errors.Format("parsing second file: %w", err)
}
// Compare the document lists
return c.compareDocumentLists(docs1, docs2, isBackwardsCompatible)
}
// normalizeStructure processes a structure to handle null, empty, and missing fields
// according to the BuildPlan spec requirement 6
func (c *Comparer) normalizeStructure(v interface{}) interface{} {
switch val := v.(type) {
case map[string]interface{}:
normalized := make(map[string]interface{})
for k, v := range val {
normalizedValue := c.normalizeStructure(v)
// Only add fields that are not nil or empty slices
if !c.isNullOrEmpty(normalizedValue) {
normalized[k] = normalizedValue
}
}
return normalized
case []interface{}:
// Handle empty slices as nil
if len(val) == 0 {
return nil
}
normalized := make([]interface{}, len(val))
for i, v := range val {
normalized[i] = c.normalizeStructure(v)
}
return normalized
default:
return v
}
}
// isNullOrEmpty checks if a value is nil or an empty slice
func (c *Comparer) isNullOrEmpty(v interface{}) bool {
if v == nil {
return true
}
if slice, ok := v.([]interface{}); ok {
return len(slice) == 0
}
return false
}
// filterToCommonFields filters v1 to only include fields that exist in v2
// This is used for backwards compatibility to allow the "after" file to have extra fields
// that don't exist in the "before" file
func (c *Comparer) filterToCommonFields(v1, v2 interface{}) interface{} {
switch m1 := v1.(type) {
case map[string]interface{}:
m2, ok := v2.(map[string]interface{})
if !ok {
return v1
}
filtered := make(map[string]interface{})
for k, val1 := range m1 {
if val2, exists := m2[k]; exists {
filtered[k] = c.filterToCommonFields(val1, val2)
}
}
return filtered
case []interface{}:
slice2, ok := v2.([]interface{})
if !ok {
return v1
}
var filtered []interface{}
for i, elem1 := range m1 {
if i < len(slice2) {
filtered = append(filtered, c.filterToCommonFields(elem1, slice2[i]))
}
}
return filtered
default:
return v1
}
}
// compareStructures compares two BuildPlan structures for semantic equivalence
func (c *Comparer) compareStructures(bp1, bp2 map[string]interface{}, isBackwardsCompatible bool) error {
// Normalize the structures to handle null, empty, and missing fields
norm1 := c.normalizeStructure(bp1).(map[string]interface{})
norm2 := c.normalizeStructure(bp2).(map[string]interface{})
// If backwards compatible, remove fields from norm2 that don't exist in norm1
// This allows "after" to have extra fields that "before" doesn't have
if isBackwardsCompatible {
filtered := c.filterToCommonFields(norm2, norm1)
if m, ok := filtered.(map[string]interface{}); ok {
norm2 = m
}
}
// Create comparison options for go-cmp
opts := []cmp.Option{
cmpopts.EquateEmpty(),
cmp.Transformer("sortSlices", func(s []interface{}) []interface{} {
return c.sortSlice(s)
}),
}
// Deep order-independent comparison
if cmp.Equal(norm1, norm2, opts...) {
return nil
}
// Get the diff for the error message
diff := cmp.Diff(norm1, norm2, opts...)
// Extract specific field differences from the diff
fieldDiffs := c.extractFieldDifferences(diff)
// Return the extracted differences or the full diff
if fieldDiffs != "" {
return errors.New(fieldDiffs)
}
return errors.New(diff)
}
// sortSlice sorts a slice based on comparable string representation
func (c *Comparer) sortSlice(slice []interface{}) []interface{} {
sorted := make([]interface{}, len(slice))
copy(sorted, slice)
sort.Slice(sorted, func(i, j int) bool {
iStr := c.toComparableString(sorted[i])
jStr := c.toComparableString(sorted[j])
return iStr < jStr
})
return sorted
}
// toComparableString converts a value to a comparable string
func (c *Comparer) toComparableString(v interface{}) string {
switch val := v.(type) {
case map[string]interface{}:
// Try to get identifying fields
if artifact, ok := val["artifact"].(string); ok {
return artifact
}
if name, ok := val["name"].(string); ok {
return name
}
if metadata, ok := val["metadata"].(map[string]interface{}); ok {
if name, ok := metadata["name"].(string); ok {
return name
}
}
// Fallback to YAML representation
yamlBytes, _ := yaml.Marshal(val)
return string(yamlBytes)
default:
// Convert to YAML for comparison
yamlBytes, _ := yaml.Marshal(v)
return string(yamlBytes)
}
}
// parseYAMLStream parses a byte array containing one or more YAML documents
func parseYAMLStream(content []byte) ([]map[string]interface{}, error) {
var documents []map[string]interface{}
decoder := yaml.NewDecoder(bytes.NewReader(content))
for {
var doc map[string]interface{}
err := decoder.Decode(&doc)
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
if doc != nil {
documents = append(documents, doc)
}
}
return documents, nil
}
// compareDocumentLists compares two lists of YAML documents
func (c *Comparer) compareDocumentLists(docs1, docs2 []map[string]interface{}, isBackwardsCompatible bool) error {
if len(docs1) != len(docs2) {
return errors.New("different number of documents")
}
// Create a bipartite matching between documents
used := make([]bool, len(docs2))
// First pass: try to find exact matches
for _, doc1 := range docs1 {
for j, doc2 := range docs2 {
if used[j] {
continue
}
// Check if documents are exactly equal
if c.documentsExactlyEqual(doc1, doc2) {
used[j] = true
break
}
}
}
// Second pass: handle unmatched documents
usedIdx := 0
for i, doc1 := range docs1 {
// Find if this document was matched in first pass
matchFound := false
for j, doc2 := range docs2 {
if used[j] && c.documentsExactlyEqual(doc1, doc2) {
matchFound = true
break
}
}
if !matchFound {
// Find the next unused document to compare against
for usedIdx < len(docs2) && used[usedIdx] {
usedIdx++
}
if usedIdx < len(docs2) {
// Compare structures
if err := c.compareStructures(doc1, docs2[usedIdx], isBackwardsCompatible); err != nil {
return errors.Format("document %d not equivalent: \n%w", i, err)
}
used[usedIdx] = true
}
}
}
return nil
}
// documentsExactlyEqual checks if two documents are exactly equal
func (c *Comparer) documentsExactlyEqual(doc1, doc2 map[string]interface{}) bool {
// Create comparison options for go-cmp
opts := []cmp.Option{
cmpopts.EquateEmpty(),
cmp.Transformer("sortSlices", func(s []interface{}) []interface{} {
return c.sortSlice(s)
}),
}
return cmp.Equal(doc1, doc2, opts...)
}
// extractFieldDifferences extracts specific field differences from a go-cmp diff
func (c *Comparer) extractFieldDifferences(diff string) string {
var differences []string
lines := strings.Split(diff, "\n")
for _, line := range lines {
// Look for lines that indicate field differences
trimmed := strings.TrimSpace(line)
// Handle lines with - or + prefixes
if strings.HasPrefix(trimmed, "-") || strings.HasPrefix(trimmed, "+") {
// Skip formatting markers
if strings.HasPrefix(trimmed, "---") || strings.HasPrefix(trimmed, "+++") {
continue
}
// Check if this is a field difference (contains a colon)
if strings.Contains(trimmed, ":") {
// Extract the field name and value
parts := strings.SplitN(trimmed[1:], ":", 2)
if len(parts) == 2 {
fieldName := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Clean up the field name (remove quotes if present)
fieldName = strings.Trim(fieldName, "\"")
value = strings.TrimSuffix(value, ",")
// Clean up value formatting
if strings.HasPrefix(value, "string(") {
value = strings.TrimPrefix(value, "string(")
value = strings.TrimSuffix(value, ")")
} else if strings.HasPrefix(value, "int(") {
value = strings.TrimPrefix(value, "int(")
value = strings.TrimSuffix(value, ")")
}
value = strings.Trim(value, "\"")
// Rebuild the difference line
prefix := trimmed[:1]
differences = append(differences, prefix+" "+fieldName+": "+value)
}
}
}
}
return strings.Join(differences, "\n")
}

View File

@@ -0,0 +1,88 @@
package compare
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
type testCase struct {
ExitCode int `json:"exitCode"`
Name string `json:"name,omitempty"`
Msg string `json:"msg,omitempty"`
File1 string `json:"file1"`
File2 string `json:"file2"`
ExpectedError string `json:"expectedError,omitempty"` // Deprecated: use ExpectedErrors
ExpectedErrors []string `json:"expectedErrors,omitempty"`
IsBackwardsCompatible *bool `json:"isBackwardsCompatible,omitempty"`
}
func TestBuildPlans(t *testing.T) {
fixturesDir := "testdata"
entries, err := os.ReadDir(fixturesDir)
if err != nil {
t.Fatalf("could not read fixtures directory: %v", err)
}
for _, entry := range entries {
if !entry.IsDir() {
continue
}
dirName := entry.Name()
t.Run(dirName, func(t *testing.T) {
testDir := filepath.Join(fixturesDir, dirName)
// Read the testcase.json file
testcaseData, err := os.ReadFile(filepath.Join(testDir, "testcase.json"))
if err != nil {
t.Fatalf("could not read testcase.json: %v", err)
}
var tc testCase
if err := json.Unmarshal(testcaseData, &tc); err != nil {
t.Fatalf("could not parse testcase.json: %v", err)
}
// Use the test name if provided, otherwise use directory name
testName := dirName
if tc.Name != "" {
testName = tc.Name
}
// Run the test with the appropriate name
t.Run(testName, func(t *testing.T) {
// Build the full file paths
file1Path := filepath.Join(testDir, tc.File1)
file2Path := filepath.Join(testDir, tc.File2)
// Create a new comparer and run the comparison
c := New()
// Use isBackwardsCompatible from test case if provided, default to false
isBackwardsCompatible := false
if tc.IsBackwardsCompatible != nil {
isBackwardsCompatible = *tc.IsBackwardsCompatible
}
err := c.BuildPlans(file1Path, file2Path, isBackwardsCompatible)
// Check the result based on expected exit code
if tc.ExitCode == 0 {
assert.NoError(t, err, tc.Msg)
} else {
assert.Error(t, err, tc.Msg)
// Support both old expectedError and new expectedErrors
if tc.ExpectedError != "" {
assert.ErrorContains(t, err, tc.ExpectedError, tc.Msg)
}
// Check each expected error substring
for _, expectedErr := range tc.ExpectedErrors {
assert.ErrorContains(t, err, expectedErr, tc.Msg)
}
}
})
})
}
}

View File

@@ -0,0 +1,810 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,810 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
example.com/description: foo
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
example.com/description: bar
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,7 @@
{
"exitCode": 1,
"name": "DuplicatedAnnotationsInAfter",
"msg": "should not match when the same object is duplicated in after and differs only by an arbitrary deeply nested field in before, in this case an annotation",
"file1": "before.yaml",
"file2": "after.yaml"
}

View File

@@ -0,0 +1,24 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
labels:
holos.run/component.name: component
holos.run/stack.name: demo
annotations:
holos.run/purpose: example
holos.run/environment: prod
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
resources:
- name: deployment
namespace: default
transformers:
- kind: SetLabels
labels:
app: demo

View File

@@ -0,0 +1,17 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
labels:
holos.run/component.name: component
# Missing holos.run/stack.name
# Missing annotations
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
# Missing resources
# Missing transformers

View File

@@ -0,0 +1,9 @@
{
"exitCode": 0,
"name": "BuildPlan_4",
"msg": "BuildPlan spec 4: after may have fields missing from before if isBackwardsCompatible is true - should pass when before has missing fields and isBackwardsCompatible is true",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": [],
"isBackwardsCompatible": true
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 0,
"name": "FullBuildPlan",
"msg": "should match full build plans",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": []
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 0,
"name": "BuildPlan_3.1",
"msg": "BuildPlan spec 3.1: Objects in the spec.artifacts list may appear in any arbitrary order - should match when artifacts are reordered",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": []
}

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: not-httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "FullBuildPlanDifferentLabelValues",
"msg": "should not match full build plans with out of order artifacts and different labels",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["holos.run/stack.name: not-httpbin"]
}

View File

@@ -0,0 +1,405 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
extra: not-in-before
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,404 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: kargo-stages
labels:
holos.run/component.name: kargo-stages
holos.run/project.name: httpbin
holos.run/stack.name: httpbin
annotations:
app.holos.run/description: kargo-stages for project httpbin
spec:
artifacts:
- artifact: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
generators:
- kind: Resources
output: resources.gen.yaml
resources:
Stage:
dev:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/dev-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/dev-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/dev-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/dev-httpbin
uses: git-push
- config:
apps:
- name: httpbin-dev-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
direct: true
prod-us-central:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-central
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-central-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-central-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-central-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-central-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-central-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-east:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-east
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-east-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-east-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-east-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-east-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-east-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
prod-us-west:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: prod-us-west
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/prod-us-west-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/prod-us-west-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/prod-us-west-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/prod-us-west-httpbin
uses: git-push
- config:
apps:
- name: httpbin-prod-us-west-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- uat
test:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/test-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/test-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/test-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/test-httpbin
uses: git-push
- config:
apps:
- name: httpbin-test-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- dev
uat:
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: uat
namespace: httpbin
spec:
promotionTemplate:
spec:
steps:
- config:
checkout:
- branch: main
path: ./src
- branch: project/httpbin/component/uat-httpbin
create: true
path: ./out
repoURL: https://github.com/holos-run/kargo-demo.git
uses: git-clone
- config:
path: ./out
uses: git-clear
- as: update-image
config:
images:
- image: quay.io/holos/mccutchen/go-httpbin
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-set-image
- config:
outPath: ./out/uat-httpbin.gen.yaml
path: ./src/deploy/projects/httpbin/components/uat-httpbin
uses: kustomize-build
- as: commit
config:
messageFromSteps:
- update-image
path: ./out
uses: git-commit
- config:
path: ./out
targetBranch: project/httpbin/component/uat-httpbin
uses: git-push
- config:
apps:
- name: httpbin-uat-httpbin
sources:
- desiredCommitFromStep: commit
repoURL: https://github.com/holos-run/kargo-demo.git
uses: argocd-update
requestedFreight:
- origin:
kind: Warehouse
name: httpbin
sources:
stages:
- test
Warehouse:
httpbin:
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: httpbin
namespace: httpbin
spec:
interval: 5m0s
subscriptions:
- image:
discoveryLimit: 5
repoURL: quay.io/holos/mccutchen/go-httpbin
semverConstraint: ^2.0.0
strictSemvers: true
transformers:
- kind: Kustomize
inputs:
- resources.gen.yaml
output: projects/httpbin/components/kargo-stages/kargo-stages.gen.yaml
kustomize:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: false
pairs:
argocd.argoproj.io/instance: httpbin-kargo-stages
resources:
- resources.gen.yaml
- artifact: projects/httpbin/gitops/kargo-stages.application.gen.yaml
generators:
- kind: Resources
output: projects/httpbin/gitops/kargo-stages.application.gen.yaml
resources:
Application:
httpbin-kargo-stages:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
labels: {}
name: httpbin-kargo-stages
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: httpbin
source:
path: deploy/projects/httpbin/components/kargo-stages
repoURL: https://github.com/holos-run/kargo-demo.git
targetRevision: main

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "BeforeLabelsAreSubsetOfAfter",
"msg": "should not match when before labels are a subset of after labels",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["+ extra: not-in-before"]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
{
"exitCode": 0,
"name": "CompilerShouldMatch",
"msg": "output of the v1alpha6 compiler should match the v1alpha5 output",
"file1": "before.yaml",
"file2": "after.yaml"
}

View File

@@ -0,0 +1,7 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component1
spec:
artifacts:
- artifact: test.yaml

View File

@@ -0,0 +1,15 @@
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component1
spec:
artifacts:
- artifact: test.yaml
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component2
spec:
artifacts:
- artifact: test2.yaml

View File

@@ -0,0 +1,8 @@
{
"exitCode": 1,
"name": "BuildPlanFile_1",
"msg": "BuildPlan File spec 1: one and two have an equal number of BuildPlan objects - should fail when count differs",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": ["different number of documents"]
}

View File

@@ -0,0 +1,22 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml

View File

@@ -0,0 +1,22 @@
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml
---
kind: BuildPlan
apiVersion: v1alpha5
metadata:
name: component
spec:
artifacts:
- artifact: component.yaml
generators:
- kind: Kubernetes
output: manifests.yaml

View File

@@ -0,0 +1,8 @@
{
"exitCode": 0,
"name": "BuildPlanValid_1",
"msg": "BuildPlan File validity 1: Two or more identical objects exist in the same file. They must be treated as unique objects - should match when both files have identical objects",
"file1": "before.yaml",
"file2": "after.yaml",
"expectedErrors": []
}

View File

Some files were not shown because too many files have changed in this diff Show More