Skip to content

ART-21309: remove Dockerfile/shell parsing, leverage rpm-lockfile-prototype 0.27.0 - #3191

Draft
fgallott wants to merge 8 commits into
openshift-eng:mainfrom
fgallott:art-21309
Draft

ART-21309: remove Dockerfile/shell parsing, leverage rpm-lockfile-prototype 0.27.0#3191
fgallott wants to merge 8 commits into
openshift-eng:mainfrom
fgallott:art-21309

Conversation

@fgallott

@fgallott fgallott commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

test build ironic

test fallback case (base + children)

test cat /more-pkgs

Summary by CodeRabbit

  • New Features

    • Derive RPM package inputs from containerfiles during lockfile generation, with stage-aware handling.
    • Added a fallback that reconstructs generated content when a base image can’t be pulled.
    • Improved “lenient” RPM resolution to better handle unavailable packages during retries.
  • Bug Fixes

    • Updated the RPM lockfile prototype to v0.27.0.
    • Improved lockfile generation for Dockerfiles with no FROM stages and strengthened retry behavior when packages are missing.
  • Tests

    • Expanded coverage for containerfile-derived inputs, fallback extraction, resolver retry behavior, and stage handling.
    • Removed test suites tied to deprecated Dockerfile/shell parsing logic.

…pm-lockfile-prototype

Remove shell_parser.py (~690 lines) and dockerfile_parser.py (~486 lines)
which duplicated parsing now available in upstream rpm-lockfile-prototype.
Import analyze_containerfile_stages, StagePackages, and shell_commands
directly from the rpm_lockfile package.

- Update rpm-lockfile-prototype to latest main (includes reinstall
  detection from PR openshift-eng#154)
- Replace StageInfo/StageAnalysis with upstream StagePackages dataclass
- Remove ARCH_SUBSHELL_KEYWORDS/ARCH_VAR_NAMES/ARCH_KEYWORDS from
  constants.py (now in upstream shell_commands)
- Thread arches parameter through to upstream parsing calls
- Handle upstream reinstall_targets in generator resolution
- Add doozer/tests/conftest.py to register rpm_lockfile as namespace
  (avoids sys.exit(127) from __init__.py when dnf bindings are missing)
- Update tests to use upstream RunCommandResult dataclass API

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jul 22, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 22, 2026

Copy link
Copy Markdown

@fgallott: This pull request references ART-21309 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci

openshift-ci Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign fgallott for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Updates rpm-lockfile-prototype to v0.27.0, delegates Containerfile package extraction to the upstream resolver, adds generated-file fallback reconstruction, and revises stage retry and reconciliation handling with expanded tests.

Changes

RPM lockfile integration

Layer / File(s) Summary
Tool version and resolver contract
art-cluster/..., pyproject.toml, doozer/doozerlib/lockfile_prototype/{constants,models,resolver}.py, doozer/tests/lockfile_prototype/test_resolver.py
Build references use v0.27.0; resolver input supports Containerfile-derived packages and strict or lenient entry points.
Generated-file fallback reconstruction
doozer/doozerlib/lockfile_prototype/fallback.py, doozer/tests/lockfile_prototype/test_fallback.py
Dockerfile variables are resolved and supported redirected RUN output is reconstructed for unavailable parent-image files.
Stage orchestration and upstream extraction
doozer/doozerlib/lockfile_prototype/generator.py
Stage parsing, $(cat ...) package handling, upstream Containerfile extraction, and reconciliation inputs are updated.
Retry behavior and integration validation
doozer/doozerlib/lockfile_prototype/generator.py, doozer/tests/lockfile_prototype/test_generator.py
Retries filter unavailable packages and use lenient resolution for Containerfile-derived packages; tests cover stage modes, fallback extraction, reconciliation, and empty-stage behavior.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant generate_lockfile
  participant DockerfileParser
  participant FallbackParser
  participant RpmResolver
  participant rpm_lockfile_prototype
  generate_lockfile->>DockerfileParser: parse Containerfile stages
  generate_lockfile->>FallbackParser: reconstruct unavailable generated file
  generate_lockfile->>RpmResolver: resolve stage with Containerfile context
  RpmResolver->>rpm_lockfile_prototype: submit packagesFromContainerfile
  rpm_lockfile_prototype-->>RpmResolver: return resolved lockfile data
  RpmResolver-->>generate_lockfile: return stage result
Loading

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 2 warnings)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error build_sync.py adds a warning that logs raw oc wait stderr, which can leak internal hostnames or other sensitive error details. Log a generic failure or redact/summarize stderr before emitting it.
Docstring Coverage ⚠️ Warning Docstring coverage is 37.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Ai-Attribution ⚠️ Warning HEAD uses Co-Authored-By: Claude, and no Assisted-by/Generated-by trailer appears in the recent commit bodies. Replace the AI co-author line with a Red Hat Assisted-by or Generated-by trailer in each AI-assisted commit; remove Co-Authored-By for AI tools.
✅ Passed checks (8 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: removing local Dockerfile/shell parsing and upgrading to rpm-lockfile-prototype 0.27.0.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Weak-Crypto ✅ Passed Touched files only add rpm-lockfile plumbing; scans found no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret/token comparisons.
Container-Privileges ✅ Passed Changed manifests add no privileged/host* or allowPrivilegeEscalation settings; the Containerfile’s root use is explicitly justified.
No-Hardcoded-Secrets ✅ Passed No hardcoded secrets, embedded-credential URLs, or literal token/password assignments appear in the changed lines; the diff only fixes stage indexing and adds a test.
No-Injection-Vectors ✅ Passed No flagged sinks found; changed code uses argv lists plus yaml.safe_load/safe_dump, not shell=True, eval/exec, pickle.loads, or yaml.load.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
doozer/tests/lockfile_prototype/test_fallback.py (1)

73-99: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider adding a test for malformed/unparseable Dockerfile input.

extract_generated_file_content has no exception handling around DockerfileParser (see companion comment on fallback.py); a test exercising a malformed Dockerfile would help confirm intended behavior once that's addressed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doozer/tests/lockfile_prototype/test_fallback.py` around lines 73 - 99, Add a
test method to TestExtractGeneratedFileContent that writes malformed or
unparseable Dockerfile content and calls extract_generated_file_content,
asserting the intended safe fallback result once DockerfileParser fails. Keep
the existing valid-input and missing-file tests unchanged.
doozer/doozerlib/lockfile_prototype/fallback.py (3)

132-134: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Sed substitution only supports single-character old/new patterns.

re.search(r"sed\s+'s/(.)/(.)/g'", run_body) captures exactly one character per group via (.). The docstring implies general sed 's/.../.../g' support, but any multi-character search/replace pattern silently fails to match, leaving the raw %-delimited content unreplaced and producing an incorrect reconstructed package list.

♻️ Suggested widening
-                    sed_match = re.search(r"sed\s+'s/(.)/(.)/g'", run_body)
+                    sed_match = re.search(r"sed\s+'s/([^/]+)/([^/]*)/g'", run_body)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doozer/doozerlib/lockfile_prototype/fallback.py` around lines 132 - 134,
Update the sed-pattern handling near sed_match so it accepts arbitrary
non-delimiter search and replacement strings, not just single characters, while
preserving the existing global substitution behavior. Ensure multi-character
patterns in sed 's/.../.../g' commands are captured and applied to resolved.

16-16: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

logger is declared but never used for diagnostics.

When a RUN entry matches the redirect regex but neither the heredoc nor echo/printf pattern matches (lines 128-140), the function silently moves on without any log output, making fallback failures hard to diagnose.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doozer/doozerlib/lockfile_prototype/fallback.py` at line 16, Add diagnostic
logging in the RUN-entry parsing flow around the redirect-regex match and
heredoc/echo/printf handling so unmatched commands emit a useful message through
the existing logger symbol. Preserve the current fallback behavior while
reporting the command or relevant context when no supported pattern matches.

111-142: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

No error handling around Dockerfile parsing/regex extraction.

If any of the three candidate Dockerfiles is malformed, DockerfileParser (or the subsequent regex matching) can raise, and since this is explicitly a best-effort fallback for cases where "base images can't be pulled," an unhandled exception here would propagate and break the broader lockfile generation flow rather than degrade gracefully.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doozer/doozerlib/lockfile_prototype/fallback.py` around lines 111 - 142, Wrap
the Dockerfile parsing and extraction logic in the fallback loop around
DockerfileParser, structure access, and regex-based processing with best-effort
exception handling so malformed candidate files do not propagate errors. On any
parsing or extraction failure, skip that candidate and continue checking the
remaining Dockerfile names, ultimately preserving the existing empty-string
fallback when none can be processed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@doozer/doozerlib/lockfile_prototype/fallback.py`:
- Around line 111-122: Update the Dockerfile parsing loop around
DockerfileParser to open each df_path with a context manager, keeping the parser
construction and entry processing inside the with block so the file handle
closes promptly after use.

---

Nitpick comments:
In `@doozer/doozerlib/lockfile_prototype/fallback.py`:
- Around line 132-134: Update the sed-pattern handling near sed_match so it
accepts arbitrary non-delimiter search and replacement strings, not just single
characters, while preserving the existing global substitution behavior. Ensure
multi-character patterns in sed 's/.../.../g' commands are captured and applied
to resolved.
- Line 16: Add diagnostic logging in the RUN-entry parsing flow around the
redirect-regex match and heredoc/echo/printf handling so unmatched commands emit
a useful message through the existing logger symbol. Preserve the current
fallback behavior while reporting the command or relevant context when no
supported pattern matches.
- Around line 111-142: Wrap the Dockerfile parsing and extraction logic in the
fallback loop around DockerfileParser, structure access, and regex-based
processing with best-effort exception handling so malformed candidate files do
not propagate errors. On any parsing or extraction failure, skip that candidate
and continue checking the remaining Dockerfile names, ultimately preserving the
existing empty-string fallback when none can be processed.

In `@doozer/tests/lockfile_prototype/test_fallback.py`:
- Around line 73-99: Add a test method to TestExtractGeneratedFileContent that
writes malformed or unparseable Dockerfile content and calls
extract_generated_file_content, asserting the intended safe fallback result once
DockerfileParser fails. Keep the existing valid-input and missing-file tests
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift-eng/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 97b93594-2243-4c87-96a3-c43ea3193f26

📥 Commits

Reviewing files that changed from the base of the PR and between 18d1470 and e731f0a.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (15)
  • art-cluster/pipelines/config/argocd/project/art-cd/common/image/rpm_lockfile_build.yaml
  • art-cluster/pipelines/data/project/art-cd/image/Containerfile.rpm_lockfile_prototype
  • doozer/doozerlib/lockfile_prototype/constants.py
  • doozer/doozerlib/lockfile_prototype/dockerfile_parser.py
  • doozer/doozerlib/lockfile_prototype/fallback.py
  • doozer/doozerlib/lockfile_prototype/generator.py
  • doozer/doozerlib/lockfile_prototype/models.py
  • doozer/doozerlib/lockfile_prototype/resolver.py
  • doozer/doozerlib/lockfile_prototype/shell_parser.py
  • doozer/tests/lockfile_prototype/test_dockerfile_parser.py
  • doozer/tests/lockfile_prototype/test_fallback.py
  • doozer/tests/lockfile_prototype/test_generator.py
  • doozer/tests/lockfile_prototype/test_resolver.py
  • doozer/tests/lockfile_prototype/test_shell_parser.py
  • pyproject.toml
💤 Files with no reviewable changes (5)
  • doozer/doozerlib/lockfile_prototype/constants.py
  • doozer/tests/lockfile_prototype/test_shell_parser.py
  • doozer/doozerlib/lockfile_prototype/shell_parser.py
  • doozer/tests/lockfile_prototype/test_dockerfile_parser.py
  • doozer/doozerlib/lockfile_prototype/dockerfile_parser.py

Comment thread doozer/doozerlib/lockfile_prototype/fallback.py
…ckage extraction

Align with upstream rpm-lockfile-prototype change that decouples
Containerfile package extraction from rpmdb context. The resolver
now sets packagesFromContainerfile in rpms.in.yaml instead of
context.containerfile, matching the explicit opt-in API.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@fgallott

Copy link
Copy Markdown
Contributor Author

/hold for testing

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Jul 23, 2026
When packages extracted from the Containerfile by rpm-lockfile-prototype
are unavailable in configured repos (e.g. CentOS-only packages in OKD
conditional blocks resolved against RHEL repos), the retry loop could
not strip them because the upstream tool re-discovers them on every
invocation.

Add a lenient entry point that patches dnf.Base to set strict=False,
making DNF skip unavailable packages with a warning instead of failing.
On the first failure with packagesFromContainerfile, the retry switches
to lenient mode — same extraction, same resolution, but unavailable
packages are skipped. All valid packages are still resolved and pinned.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
doozer/doozerlib/lockfile_prototype/generator.py (1)

186-187: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Preserve actual Dockerfile stage indices for $(cat ...) packages.

Line 187 consumes cat_packages as real stage numbers, but _resolve_cat_packages() builds stage_runs by appending only non-empty stages. A Dockerfile with an empty first stage shifts later $(cat ...) extras into an earlier stage, reading the wrong parent and resolving the packages in the wrong lockfile. Append an entry for every FROM stage, including empty ones, and add a regression test.

Proposed fix
             if entry["instruction"] == "FROM":
                 if seen_from:
-                    if current_runs:
-                        stage_runs.append(current_runs)
+                    stage_runs.append(current_runs)
                 seen_from = True
                 current_runs = []
             elif entry["instruction"] == "RUN" and seen_from:
                 current_runs.append(entry["value"])
-        if current_runs:
+        if seen_from:
             stage_runs.append(current_runs)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@doozer/doozerlib/lockfile_prototype/generator.py` around lines 186 - 187,
Update _resolve_cat_packages to preserve Dockerfile stage indices by appending a
stage_runs entry for every FROM stage, including stages with no packages, so
cat_packages continues to reference the correct downstream_parents stage. Add a
regression test covering an empty initial stage followed by a stage using $(cat
...), and verify packages resolve from the corresponding lockfile.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@doozer/doozerlib/lockfile_prototype/generator.py`:
- Around line 186-187: Update _resolve_cat_packages to preserve Dockerfile stage
indices by appending a stage_runs entry for every FROM stage, including stages
with no packages, so cat_packages continues to reference the correct
downstream_parents stage. Add a regression test covering an empty initial stage
followed by a stage using $(cat ...), and verify packages resolve from the
corresponding lockfile.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift-eng/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: c4553018-25a5-4f2c-a3d9-bdddf88e5fa7

📥 Commits

Reviewing files that changed from the base of the PR and between 3e3207a and 4688438.

📒 Files selected for processing (5)
  • doozer/doozerlib/lockfile_prototype/constants.py
  • doozer/doozerlib/lockfile_prototype/generator.py
  • doozer/doozerlib/lockfile_prototype/resolver.py
  • doozer/tests/lockfile_prototype/test_generator.py
  • doozer/tests/lockfile_prototype/test_resolver.py

fgallott added 2 commits July 27, 2026 17:14
_resolve_cat_packages() only appended stages with RUN commands to
stage_runs, so an empty first stage (e.g. COPY-only builder) shifted
all later indices. $(cat ...) packages would resolve against the
wrong parent image.

Always append an entry for every FROM stage, even empty ones.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
packagesFromContainerfile does not extract packages from bare
dnf/yum/microdnf update commands (no named packages). Without
upgrade targets in the lockfile, the bare update remains in the
Dockerfile but cachi2 repos have an inconsistent package set,
causing EVR conflicts at build time (e.g. ose-frr glibc mismatch).

Detect stages with bare update commands, query the base image for
installed packages, and pass them as upgradePackages. On failure,
drop all upgrade packages and set upgrades_dropped=True so the
rebaser strips the bare update from the Dockerfile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@openshift-eng openshift-eng deleted a comment from redhat-chai-bot Jul 28, 2026
…uce log noise

Track actual removals in the retry loop instead of counting all fully_missing
entries—containerfile-extracted packages absent from our lists caused phantom
retries that exhausted the 5-retry limit. Write the lenient entry point script
to a temp file instead of passing via -c to avoid multi-line Python appearing
in Jenkins logs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@openshift-eng openshift-eng deleted a comment from redhat-chai-bot Jul 28, 2026
…st conf.strict

dnf.Base.install_specs() has its own strict=True default parameter that
ignores conf.strict, so patching __init__ alone had no effect. Now also
patches install_specs to force strict=False, which actually makes DNF
skip unavailable packages instead of raising MarkingErrors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@openshift-ci

openshift-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

@fgallott: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/security 4a0686b link false /test security

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@openshift-eng openshift-eng deleted a comment from redhat-chai-bot Jul 28, 2026
…g upgrades

reinstallPackages pins the installed EVR which wins over upgradePackages
for the same package, silently preventing upgrades. This caused lockfile
resolution to succeed without actually upgrading packages, leaving
upgrades_dropped=False and the bare dnf update in the Dockerfile. At
build time, dnf update hit EVR conflicts (e.g. glibc vs
glibc-minimal-langpack) because only partial updates were available.

Also mark upgrades_dropped when a stage has a bare update but no
pullspec (stage alias), so the bare update gets stripped.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

rh-pre-commit.version: 2.4.0
rh-pre-commit.check-secrets: ENABLED
@fgallott
fgallott marked this pull request as draft July 28, 2026 13:23
@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants