Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SDCICD-1358: custom task to get OLM bundle version #1255

Merged
merged 1 commit into from
Aug 9, 2024

Conversation

jbpratt
Copy link
Contributor

@jbpratt jbpratt commented Aug 6, 2024

this is needed to string together the dynamic bundle generation task to
the catalog generation task. The bundle ref is stored as a param in the
catalog pipeline (nudged), we need to fetch the version that was put in
the bundle to add an entry into the catalog with it.

❯ opm render ${BUNDLE_IMAGE}
{
    "schema": "olm.bundle",
    "name": "osd-example-operator.v4.16.0-28f1940",
    "package": "osd-example-operator",
    "image": "quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e",
    "properties": [
        {
            "type": "olm.gvk",
            "value": {
                "group": "managed.openshift.io",
                "kind": "Example",
                "version": "v1alpha1"
            }
        },
        {
            "type": "olm.package",
            "value": {
                "packageName": "osd-example-operator",
                "version": "4.16.0-28f1940"
            }
        },
...
❯ opm render ${BUNDLE_IMAGE} \
          | sed -n '/"type": "olm.package"/,/}/p' \
          | sed -n 's/.*"version": "\(.*\)".*/\1/p'
          | tr -d '\n'
4.16.0-28f1940

https://github.com/openshift/osd-example-operator/blob/971083313e7eb4c7383c04a2067ac80ae535946c/.tekton/catalog-push.yaml#L176-L211

https://issues.redhat.com/browse/SDCICD-1358

Example pipeline
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: catalog-dynamic-build
spec:
  params:
  - name: git-url
    default: https://github.com/openshift/osd-example-operator.git
  - name: revision
    default: 587fc22f55c819208f91d719a40527a8bf913142
  - name: output-image
    default: "quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/catalog:on-pr-test"
  - name: operator-bundle-image
    default: "quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e"
  tasks:
  - name: init
    params:
    - name: image-url
      value: $(params.output-image)
    taskRef:
      params:
      - name: name
        value: init
      - name: bundle
        value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:83b7df553a736def52dd47bca2a3614c8fa2c88d112d691a4834289cf8c2abf5
      - name: kind
        value: task
      resolver: bundles
  - name: clone-repository
    params:
    - name: url
      value: $(params.git-url)
    - name: revision
      value: $(params.revision)
    runAfter:
    - init
    taskRef:
      params:
      - name: name
        value: git-clone
      - name: bundle
        value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:07b21ee2a46298d28edf561451f8550c3ae8024c546316765988d02c602827a4
      - name: kind
        value: task
      resolver: bundles
    workspaces:
    - name: output
      workspace: workspace
  - name: opm-get-bundle-version
    runAfter:
    - clone-repository
    params:
    - name: bundle-image
      value: $(params.operator-bundle-image)
    taskRef:
      kind: Task
      name: opm-get-bundle-version
  - name: generate-catalog
    runAfter:
    - opm-get-bundle-version
    params:
      - name: binary-image
        value: registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4.16
      - name: bundle-images
        value: $(params.operator-bundle-image)
      - name: operator-name
        value: osd-example-operator
      - name: operator-version
        value: "v$(tasks.opm-get-bundle-version.results.bundle-version)"
    taskRef:
      params:
      - name: name
        value: opm-render-bundles
      - name: bundle
        value: quay.io/konflux-ci/tekton-catalog/task-opm-render-bundles:0.1@sha256:5b7863ef326a9ca0c9431b77de44a5485f15950708ebd4e2e5b110b53ef0b2b5
      - name: kind
        value: task
      resolver: bundles
    workspaces:
    - name: source
      workspace: workspace
  - name: build-container
    params:
    - name: IMAGE
      value: $(params.output-image)
    - name: DOCKERFILE
      value: catalog.Dockerfile
    - name: COMMIT_SHA
      value: $(tasks.clone-repository.results.commit)
    runAfter:
    - generate-catalog
    taskRef:
      params:
      - name: name
        value: buildah
      - name: bundle
        value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.1@sha256:942c8b62ad30c614035fc3a6321f3389d0ee4075c2db36923e4a7412c482c8fa
      - name: kind
        value: task
      resolver: bundles
    workspaces:
    - name: source
      workspace: workspace
  workspaces:
  - name: workspace
Pipeline output
❯ opc pipeline start --use-param-defaults --showlog --workspace name=workspace,volumeClaimTemplateFile=tkn/workspace-template.yaml catalog-dynamic-build
PipelineRun started: catalog-dynamic-build-run-zgw2m
Waiting for logs to be available...
[init : init] Build Initialize: quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/catalog:on-pr-test
[init : init]
[init : init] Determine if Image Already Exists

[clone-repository : clone] {"level":"info","ts":1722951837.0637221,"caller":"git/git.go:176","msg":"Successfully cloned https://github.com/openshift/osd-example-operator.git @ 587fc22f55c819208f91d719a40527a8bf913142 (grafted, HEAD) in path /workspace/output/source"}
[clone-repository : clone] {"level":"info","ts":1722951837.0918229,"caller":"git/git.go:215","msg":"Successfully initialized and updated submodules in path /workspace/output/source"}

[clone-repository : symlink-check] Running symlink check

[opm-get-bundle-version : opm-get-bundle-version] 2024/08/06 13:44:01 warning: unsuccessful cred copy: ".docker" from "/tekton/creds" to "/": unable to create destination directory: mkdir /.docker: permission denied
[opm-get-bundle-version : opm-get-bundle-version] + opm render quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e
[opm-get-bundle-version : opm-get-bundle-version] + sed -n '/"type": "olm.package"/,/}/p'
[opm-get-bundle-version : opm-get-bundle-version] + sed -n 's/.*"version": "\(.*\)".*/\1/p'
[opm-get-bundle-version : opm-get-bundle-version] + tr -d '\n'

[generate-catalog : opm-render-bundles] + mkdir -p catalog/
[generate-catalog : opm-render-bundles] + opm generate dockerfile catalog/ --binary-image=registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4.16
[generate-catalog : opm-render-bundles] + opm init osd-example-operator --default-channel=stable --description=./README.md --output=yaml
[generate-catalog : opm-render-bundles] + opm render quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e --output=yaml
[generate-catalog : opm-render-bundles] + cat
[generate-catalog : opm-render-bundles] + cat catalog/operator.yaml
[generate-catalog : opm-render-bundles] ---
[generate-catalog : opm-render-bundles] defaultChannel: stable
[generate-catalog : opm-render-bundles] description: "# osd-example-operator\n\nThis repository serves as a test bed for the
[generate-catalog : opm-render-bundles]   SD-CICD team to build tooling and\nsupport operators with minimal impact on other
[generate-catalog : opm-render-bundles]   teams\n\n## Complete SOP on operator test harness\n\nhttps://github.com/openshift/ops-sop/blob/master/v4/howto/osde2e/operator-test-harnesses.md\n\n##
[generate-catalog : opm-render-bundles]   Locally Running Test Harness\n- Run `make e2e-harness-build`  to make sure harness
[generate-catalog : opm-render-bundles]   builds ok\n- Deploy your new version of operator in a test cluster\n- Ensure e2e
[generate-catalog : opm-render-bundles]   test scenarios run green on a test cluster using one of the methods below\n\n###
[generate-catalog : opm-render-bundles]   Using ginkgo\n1. create stage rosa cluster\n2. install ginkgo executable\n3. get
[generate-catalog : opm-render-bundles]   kubeadmin credentials from your cluster using\n```\nocm get /api/clusters_mgmt/v1/clusters/$CLUSTER_ID/credentials
[generate-catalog : opm-render-bundles]   | jq -r .kubeconfig > /<path-to>/kubeconfig\n```\n4. Run harness using\n```\nOCM_ENVIRONMENT=stage
[generate-catalog : opm-render-bundles]   KUBECONFIG=/<path-to>/kubeconfig  ./<path-to>/bin/ginkgo  --tags=osde2e -v \n```\n5.
[generate-catalog : opm-render-bundles]   This will show test results, but also one execution error due to reporting configs.
[generate-catalog : opm-render-bundles]   You can ignore this, or get rid of this, by temporarily removing the `suiteConfig`
[generate-catalog : opm-render-bundles]   and `reporterConfig` arguments from `RunSpecs()` function in `osde2e/<operator-name_>test_harness_runner_test.go`
[generate-catalog : opm-render-bundles]   file\n\n\n### Using osde2e\n\n1. Publish a docker image for the test harness from
[generate-catalog : opm-render-bundles]   operator repo using\n   ```\n   HARNESS_IMAGE_REPOSITORY=<your quay HARNESS_IMAGE_REPOSITORY>
[generate-catalog : opm-render-bundles]   \ HARNESS_IMAGE_NAME=<your quay HARNESS_IMAGE_NAME> make e2e-image-build-push\n
[generate-catalog : opm-render-bundles]   \  ```\n1. Create a stage rosa cluster\n1. Clone osde2e: `git clone [email protected]:openshift/osde2e.git`\n1.
[generate-catalog : opm-render-bundles]   Build osde2e executable: `make build`\n1. Run osde2e\n\n  ```bash\n  #!/usr/bin/env
[generate-catalog : opm-render-bundles]   bash\n  OCM_TOKEN=\"[OCM token here]\" \\ \n  CLUSTER_ID=\"[cluster id here]\" \\\n
[generate-catalog : opm-render-bundles]   \ AWS_ACCESS_KEY_ID=\"[aws access key here]\" \\\n  AWS_SECRET_ACCESS_KEY=\"[aws
[generate-catalog : opm-render-bundles]   access secret here]\" \\\n  TEST_HARNESSES=\"quay.io/$HARNESS_IMAGE_REPOSITORY/$HARNESS_IMAGE_NAME\"
[generate-catalog : opm-render-bundles]   \\\n#  Save results in specific local dir \n  REPORT_DIR=\"[path to local report
[generate-catalog : opm-render-bundles]   directory]\" \\\n#  OR in s3\n  LOG_BUCKET=\"[name of the s3 bucket to upload log
[generate-catalog : opm-render-bundles]   files to]\" \\\n  ./out/osde2e test \\\n  --configs rosa,stage,sts,test-harness
[generate-catalog : opm-render-bundles]   \\\n  --skip-must-gather \\\n  --skip-destroy-cluster \\\n  --skip-health-check
[generate-catalog : opm-render-bundles]   \n"
[generate-catalog : opm-render-bundles] name: osd-example-operator
[generate-catalog : opm-render-bundles] schema: olm.package
[generate-catalog : opm-render-bundles] ---
[generate-catalog : opm-render-bundles] image: quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e
[generate-catalog : opm-render-bundles] name: osd-example-operator.v4.16.0-28f1940
[generate-catalog : opm-render-bundles] package: osd-example-operator
[generate-catalog : opm-render-bundles] properties:
[generate-catalog : opm-render-bundles] - type: olm.gvk
[generate-catalog : opm-render-bundles]   value:
[generate-catalog : opm-render-bundles]     group: managed.openshift.io
[generate-catalog : opm-render-bundles]     kind: Example
[generate-catalog : opm-render-bundles]     version: v1alpha1
[generate-catalog : opm-render-bundles] - type: olm.package
[generate-catalog : opm-render-bundles]   value:
[generate-catalog : opm-render-bundles]     packageName: osd-example-operator
[generate-catalog : opm-render-bundles]     version: 4.16.0-28f1940
[generate-catalog : opm-render-bundles] - type: olm.csv.metadata
[generate-catalog : opm-render-bundles]   value:
[generate-catalog : opm-render-bundles]     annotations:
[generate-catalog : opm-render-bundles]       alm-examples: '[]'
[generate-catalog : opm-render-bundles]       capabilities: Basic Install
[generate-catalog : opm-render-bundles]       createdAt: "2024-07-31T06:32:30Z"
[generate-catalog : opm-render-bundles]       operators.operatorframework.io/builder: operator-sdk-v1.31.0-ocp
[generate-catalog : opm-render-bundles]       operators.operatorframework.io/project_layout: unknown
[generate-catalog : opm-render-bundles]     apiServiceDefinitions: {}
[generate-catalog : opm-render-bundles]     crdDescriptions:
[generate-catalog : opm-render-bundles]       owned:
[generate-catalog : opm-render-bundles]       - kind: Example
[generate-catalog : opm-render-bundles]         name: examples.managed.openshift.io
[generate-catalog : opm-render-bundles]         version: v1alpha1
[generate-catalog : opm-render-bundles]     description: Osd Example Operator description. TODO.
[generate-catalog : opm-render-bundles]     displayName: Osd Example Operator
[generate-catalog : opm-render-bundles]     installModes:
[generate-catalog : opm-render-bundles]     - supported: false
[generate-catalog : opm-render-bundles]       type: OwnNamespace
[generate-catalog : opm-render-bundles]     - supported: false
[generate-catalog : opm-render-bundles]       type: SingleNamespace
[generate-catalog : opm-render-bundles]     - supported: false
[generate-catalog : opm-render-bundles]       type: MultiNamespace
[generate-catalog : opm-render-bundles]     - supported: true
[generate-catalog : opm-render-bundles]       type: AllNamespaces
[generate-catalog : opm-render-bundles]     keywords:
[generate-catalog : opm-render-bundles]     - osd-example-operator
[generate-catalog : opm-render-bundles]     links:
[generate-catalog : opm-render-bundles]     - name: Osd Example Operator
[generate-catalog : opm-render-bundles]       url: https://osd-example-operator.domain
[generate-catalog : opm-render-bundles]     maintainers:
[generate-catalog : opm-render-bundles]     - email: [email protected]
[generate-catalog : opm-render-bundles]       name: Maintainer Name
[generate-catalog : opm-render-bundles]     maturity: alpha
[generate-catalog : opm-render-bundles]     provider:
[generate-catalog : opm-render-bundles]       name: Provider Name
[generate-catalog : opm-render-bundles]       url: https://your.domain
[generate-catalog : opm-render-bundles] relatedImages:
[generate-catalog : opm-render-bundles] - image: quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e
[generate-catalog : opm-render-bundles]   name: ""
[generate-catalog : opm-render-bundles] - image: quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/operator@sha256:634d3f82cfcfeba3259294af10a02df1007519f68dc4c1e539048c12d5bdfad4
[generate-catalog : opm-render-bundles]   name: ""
[generate-catalog : opm-render-bundles] schema: olm.bundle
[generate-catalog : opm-render-bundles] ---
[generate-catalog : opm-render-bundles] schema: olm.channel
[generate-catalog : opm-render-bundles] package: "osd-example-operator"
[generate-catalog : opm-render-bundles] name: "stable"
[generate-catalog : opm-render-bundles] entries:
[generate-catalog : opm-render-bundles]   - name: osd-example-operator.v4.16.0-28f1940
[generate-catalog : opm-render-bundles]     skipRange: ">=0.0.1 <v4.16.0-28f1940"
[generate-catalog : opm-render-bundles] + opm validate catalog

[build-container : build] Adding the entitlement to the build
[build-container : build] STEP 1/7: FROM registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4.16
[build-container : build] Trying to pull registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4.16...
[build-container : build] Getting image source signatures
[build-container : build] Checking if image destination supports signatures
[build-container : build] Copying blob sha256:39d9a96621314b3b3df6af2de462fd1abd3f6d675639886f2f42469e44fabdf2
[build-container : build] Copying blob sha256:b958cf13e572cbd92209b5c01a8e65203cf88c4b017258ec8ff9bfd5d722b715
[build-container : build] Copying blob sha256:ca1636478fe5b8e2a56600e24d6759147feb15020824334f4a798c1cb6ed58e2
[build-container : build] Copying blob sha256:9a0e86afac7b17960e2411a55e234d639aead65defac982719003eaa242da807
[build-container : build] Copying config sha256:652b9e464ee9d90d5be247da73f0e5818f6ed208f8026523e9ea1377715ca620
[build-container : build] Writing manifest to image destination
[build-container : build] Storing signatures
[build-container : build] STEP 2/7: ENTRYPOINT ["/bin/opm"]
[build-container : build] STEP 3/7: CMD ["serve", "/configs", "--cache-dir=/tmp/cache"]
[build-container : build] STEP 4/7: ADD catalog /configs
[build-container : build] STEP 5/7: RUN ["/bin/opm", "serve", "/configs", "--cache-dir=/tmp/cache", "--cache-only"]
[build-container : build] time="2024-08-06T13:44:32Z" level=warning msg="unable to set termination log path" error="open /dev/termination-log: read-only file system"
[build-container : build] time="2024-08-06T13:44:32Z" level=info msg="starting pprof endpoint" address="localhost:6060"
[build-container : build] STEP 6/7: LABEL operators.operatorframework.io.index.configs.v1=/configs
[build-container : build] STEP 7/7: LABEL "build-date"="2024-08-06T13:44:17" "architecture"="x86_64" "vcs-type"="git" "vcs-ref"="587fc22f55c819208f91d719a40527a8bf913142"
[build-container : build] COMMIT quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/catalog:on-pr-test
[build-container : build] --> d9d657a7661a
[build-container : build] Successfully tagged quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/catalog:on-pr-test
[build-container : build] d9d657a7661afbb111238a71c8c69323dcc3ee70a68e0a9678cfc1ba0616e612
[build-container : build] /var/lib/containers/storage/vfs/dir/888fa3e80b7db9d45ef4239652518c8e7d0448673f8bbc73391ccdc31fcd8508
...

Signed-off-by: Brady Pratt [email protected]

@jbpratt jbpratt force-pushed the SDCICD-1358 branch 2 times, most recently from 328bc5e to b01072e Compare August 6, 2024 13:49
@jbpratt
Copy link
Contributor Author

jbpratt commented Aug 6, 2024

/cc @arewm @chmeliik @tkdchen @gurnben PTAL!

This should be the last custom task needed to get our operator pipelines building! 🤞

@chmeliik
Copy link
Contributor

chmeliik commented Aug 6, 2024

/ok-to-test

| sed -n '/"type": "olm.package"/,/}/p' \
| sed -n 's/.*"version": "\(.*\)".*/\1/p' \
| tr -d '\n' \
> "$(results.bundle-version.path)"
Copy link
Contributor

Choose a reason for hiding this comment

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

That seems rather fragile, e.g. it wouldn't work if the JSON was printed compactly or if the order of the keys was different

        {
            "value": {
                "packageName": "osd-example-operator",
                "version": "4.16.0-28f1940"
            },
            "type": "olm.package"
        }

Is there reason to believe that opm would always format the output in a way that will work with this sed command?

Copy link
Contributor Author

@jbpratt jbpratt Aug 6, 2024

Choose a reason for hiding this comment

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

We control the way opm is ran (with json output), and we aren't receiving arbitrarily formatted JSON, I would assume this to be pretty stable. I don't think there is a way to print the json compactly through opm render, the only other output option being YAML through the --output=yaml flag. I would have preferred to use JQ but I can't find an image with both opm and jq in it. Your suggestion below for using JQ is a great improvement I can follow up with.

The order of the keys shouldn't matter, we search for the olm.package object, then the value inside of that.

This also shouldn't really be used outside of our specific use case which is stringing together the custom tasks/pipelines so far which we control the inputs to.

Copy link
Contributor

@chmeliik chmeliik Aug 6, 2024

Choose a reason for hiding this comment

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

The order of the keys shouldn't matter

Would only matter if value came before type as in my example. That does seem unlikely though

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Updated to use your two step recommendation! PTAL when you have a minute, thank you!!

Copy link
Contributor

@chmeliik chmeliik left a comment

Choose a reason for hiding this comment

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

LGTM if the potential shortcomings work for you. Alternatively, could save the output of opm render in a shared directory and extract the version in the next step with jq (using an image that has jq installed, e.g. quay.io/konflux-ci/appstudio-utils:ab6b0b8e40e440158e7288c73aff1cf83a2cc8a9@sha256:24179f0efd06c65d16868c2d7eb82573cce8e43533de6cea14fec3b7446e0b14)

this is needed to string together the dynamic bundle generation task to
the catalog generation task. The bundle ref is stored as a param in the
catalog pipeline (nudged), we need to fetch the version that was put in
the bundle to add an entry into the catalog with it.

```
❯ opm render ${BUNDLE_IMAGE}
{
    "schema": "olm.bundle",
    "name": "osd-example-operator.v4.16.0-28f1940",
    "package": "osd-example-operator",
    "image": "quay.io/redhat-user-workloads/oeo-cicada-tenant/osd-example-operator/bundle@sha256:5485652c17ab8ac5cf44452f67e15ed06dc9d2d7d67a7f079e76248878d5370e",
    "properties": [
        {
            "type": "olm.gvk",
            "value": {
                "group": "managed.openshift.io",
                "kind": "Example",
                "version": "v1alpha1"
            }
        },
        {
            "type": "olm.package",
            "value": {
                "packageName": "osd-example-operator",
                "version": "4.16.0-28f1940"
            }
        },
...
❯ opm render ${BUNDLE_IMAGE} \
          | sed -n '/"type": "olm.package"/,/}/p' \
          | sed -n 's/.*"version": "\(.*\)".*/\1/p'
          | tr -d '\n'
4.16.0-28f1940
```

https://github.com/openshift/osd-example-operator/blob/971083313e7eb4c7383c04a2067ac80ae535946c/.tekton/catalog-push.yaml#L176-L211

https://issues.redhat.com/browse/SDCICD-1358

Signed-off-by: Brady Pratt <[email protected]>
@jbpratt
Copy link
Contributor Author

jbpratt commented Aug 7, 2024

I think the build-definitions-pull-request failure is unrelated?

@MartinBasti
Copy link
Contributor

/retest

@jbpratt
Copy link
Contributor Author

jbpratt commented Aug 8, 2024

/retest

@MartinBasti 👀 do you understand the CI failure? I'm not able to see the pipeline logs

@jbpratt
Copy link
Contributor Author

jbpratt commented Aug 8, 2024

/retest

@jbpratt
Copy link
Contributor Author

jbpratt commented Aug 9, 2024

Hey @MartinBasti, are you able to add this to the merge queue?

@MartinBasti MartinBasti added this pull request to the merge queue Aug 9, 2024
Merged via the queue into konflux-ci:main with commit 2680275 Aug 9, 2024
9 checks passed
@jbpratt jbpratt deleted the SDCICD-1358 branch August 9, 2024 13:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants