All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v6 0/4] Support for Patchwork CI
@ 2025-04-15 10:00 Andrea Cervesato
  2025-04-15 10:00 ` [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script Andrea Cervesato
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Andrea Cervesato @ 2025-04-15 10:00 UTC (permalink / raw)
  To: ltp

Add support for patch-series validation in the patchwork ML.
We use Github to schedule a trigger every 30 minutes, checking for new
patche-series in parchwork which has not been tested yet.

The way we decide if a patch-series has been tested in patchwork, is
by looking at its status (in particular, if it's "Needs Review / ACK"),
as well as checking if test report has been uploaded to any of the
series patches.

All communication to Patchwrok is done via REST API, using curl and js
tools.

First, we create a script called patchwork-ci.sh that provides all the
commands to read new untested patch-series, set their status and testing
report. Then, we create a scheduled workflow in Gitlab, checking every
30 minutes if there are new untested patch-series. At the end, we
trigger the main build workflow, used to validate LTP commits in our
Github mainline. All the times we trigger the build workflow, we also
provide the patch-series ID, that will be fetched and applied on the
current branch before running the tests.

Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
Changes in v6:
- patchwork.sh: use more "[ $stuff ] || do_something" syntax
- patchwork.sh: remove set -ex
- patchwork.sh: variables default setup
- patchwork.sh: move file creation in tmp folder
- patchwork.sh: check multiple commands exist in once
- trigger workflow now triggers only on linux-test-project/ltp repo
- Link to v5: https://patchwork.ozlabs.org/project/ltp/list/?series=452320

Changes in v5:
- patchwork is now a utility that can be used separately
- Link to v4: https://lore.kernel.org/r/20250411-patchwork_ci-v4-0-7f3c5ba298a1@suse.com

Changes in v4:
- make use of secrets to apply patches in order to set state to
  needs-review-ack
- check for curl failures and eventually exit 1
- use a different format for stored file in 'patchwork-ci.sh verify'
  command
- define PATCHWORK_CI_FILE
- some symbols like . are not supported by patchwork checks, so slurmify
  the string before sending checks context
- Link to v3: https://lore.kernel.org/r/20250411-patchwork_ci-v3-0-c9bb90c6961b@suse.com

Changes in v3:
- secrets are not supported by if: statement, so we remove it
- Link to v2: https://lore.kernel.org/r/20250410-patchwork_ci-v2-0-288f4be835ff@suse.com

Changes in v2:
- check for secrets.PATCHWORK_TOKEN before sending tests results
- v2 to re-trigger lore after missing 3/4 patch
- Link to v1: https://lore.kernel.org/r/20250410-patchwork_ci-v1-0-def85825f46a@suse.com

---
Andrea Cervesato (4):
      ci: install dependences for patchwork-ci script
      ci: add patchwork communication script
      ci: add ci-patchwork-trigger workflow
      ci: apply patchwork series in ci-docker-build workflow

 .github/workflows/ci-docker-build.yml      |  39 ++++++-
 .github/workflows/ci-patchwork-trigger.yml |  65 +++++++++++
 ci/alpine-runtime.sh                       |   2 +
 ci/alpine.sh                               |   2 +
 ci/debian.i386.sh                          |   2 +
 ci/debian.sh                               |   2 +
 ci/fedora.sh                               |   2 +
 ci/tools/patchwork.sh                      | 169 +++++++++++++++++++++++++++++
 ci/tumbleweed.sh                           |   2 +
 9 files changed, 284 insertions(+), 1 deletion(-)
---
base-commit: 40c559787d15b2167ba657b3ba431e3299969d98
change-id: 20250410-patchwork_ci-7dc4ae02c40d

Best regards,
-- 
Andrea Cervesato <andrea.cervesato@suse.com>


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script
  2025-04-15 10:00 [LTP] [PATCH v6 0/4] Support for Patchwork CI Andrea Cervesato
@ 2025-04-15 10:00 ` Andrea Cervesato
  2025-04-15 14:45   ` Cyril Hrubis
  2025-04-15 10:00 ` [LTP] [PATCH v6 2/4] ci: add patchwork communication script Andrea Cervesato
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 14+ messages in thread
From: Andrea Cervesato @ 2025-04-15 10:00 UTC (permalink / raw)
  To: ltp

From: Andrea Cervesato <andrea.cervesato@suse.com>

Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 ci/alpine-runtime.sh | 2 ++
 ci/alpine.sh         | 2 ++
 ci/debian.i386.sh    | 2 ++
 ci/debian.sh         | 2 ++
 ci/fedora.sh         | 2 ++
 ci/tumbleweed.sh     | 2 ++
 6 files changed, 12 insertions(+)

diff --git a/ci/alpine-runtime.sh b/ci/alpine-runtime.sh
index 3bff42770bd8ae7da3e6e571a843e44c7a56181b..d0e1990d2c25c9f300dd47fb979af4d38e3ad3f9 100755
--- a/ci/alpine-runtime.sh
+++ b/ci/alpine-runtime.sh
@@ -4,6 +4,8 @@
 
 apk add \
         acl \
+        curl \
+        jq \
         keyutils \
         libaio \
         libacl \
diff --git a/ci/alpine.sh b/ci/alpine.sh
index 5a44a6687b9eb7743c0fbbb288a133366b17da75..254f4aaece66ef177bc5b4a92cf5160443552378 100755
--- a/ci/alpine.sh
+++ b/ci/alpine.sh
@@ -9,6 +9,8 @@ apk add \
 	autoconf \
 	automake \
 	clang \
+	curl \
+	jq \
 	gcc \
 	git \
 	acl-dev \
diff --git a/ci/debian.i386.sh b/ci/debian.i386.sh
index 2846053098033dd0215aa724738a90baff290430..44c7ddf2ff6f049ab847b374213c6aee74fbc130 100755
--- a/ci/debian.i386.sh
+++ b/ci/debian.i386.sh
@@ -6,6 +6,8 @@ dpkg --add-architecture i386
 apt update
 
 apt install -y --no-install-recommends \
+	curl \
+	jq \
 	linux-libc-dev:i386 \
 	gcc-multilib \
 	libacl1-dev:i386 \
diff --git a/ci/debian.sh b/ci/debian.sh
index f590b4b9a4f910c7e4229f4e2a818cf5b1e818bb..0445c92ec40819e49c0435b1881cf6b202d14087 100755
--- a/ci/debian.sh
+++ b/ci/debian.sh
@@ -23,6 +23,8 @@ pkg_minimal="
 	debhelper
 	devscripts
 	clang
+	curl
+	jq
 	gcc
 	git
 	iproute2
diff --git a/ci/fedora.sh b/ci/fedora.sh
index bef5bcd2b519f4a32533a2d52f182c6dd5e1b7d0..494de928f7434f3310979e595e18162c2042f1e8 100755
--- a/ci/fedora.sh
+++ b/ci/fedora.sh
@@ -9,6 +9,8 @@ $yum \
 	automake \
 	make \
 	clang \
+	curl \
+	jq \
 	gcc \
 	git \
 	findutils \
diff --git a/ci/tumbleweed.sh b/ci/tumbleweed.sh
index 33937ec63a372ed92e8d4f05ecd435ce902fa5bb..d0607eed25f06fec3064ca75ec7875ce833f9d96 100755
--- a/ci/tumbleweed.sh
+++ b/ci/tumbleweed.sh
@@ -8,6 +8,8 @@ $zyp \
 	autoconf \
 	automake \
 	clang \
+	curl \
+	jq \
 	findutils \
 	gcc \
 	git \

-- 
2.43.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [LTP] [PATCH v6 2/4] ci: add patchwork communication script
  2025-04-15 10:00 [LTP] [PATCH v6 0/4] Support for Patchwork CI Andrea Cervesato
  2025-04-15 10:00 ` [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script Andrea Cervesato
@ 2025-04-15 10:00 ` Andrea Cervesato
  2025-04-15 13:48   ` pvorel
  2025-04-15 15:36   ` Cyril Hrubis
  2025-04-15 10:00 ` [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow Andrea Cervesato
  2025-04-15 10:00 ` [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow Andrea Cervesato
  3 siblings, 2 replies; 14+ messages in thread
From: Andrea Cervesato @ 2025-04-15 10:00 UTC (permalink / raw)
  To: ltp

From: Andrea Cervesato <andrea.cervesato@suse.com>

Add a script to communicate with patchwork. Available commands are:

- state: change patch-series state
- check: send a tests report to patchwork
- verify: will print a list of new patch-series which has not been
  tested in the past hour (by default)

The script can be configured defining:

- PATCHWORK_URL: patchwork url to communicate with
- PATCHWORK_TOKEN: patchwork authentication token
- PATCHWORK_SINCE: timespan in seconds where we want to fetch
  patch-series

Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 ci/tools/patchwork.sh | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 169 insertions(+)

diff --git a/ci/tools/patchwork.sh b/ci/tools/patchwork.sh
new file mode 100755
index 0000000000000000000000000000000000000000..bef6998b6168714e0cfaef443a4573017440bb2d
--- /dev/null
+++ b/ci/tools/patchwork.sh
@@ -0,0 +1,169 @@
+#!/bin/sh -x
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Shell script to communicate with Patchwork via REST API.
+# It has been mainly created for CI purposes, but it can be used in the shell
+# by satisfying minimum requirements.
+#
+# Copyright (c) 2025 Andrea Cervesato <andrea.cervesato@suse.com>
+
+PATCHWORK_URL="${PATCHWORK_URL:-https://patchwork.ozlabs.org}"
+PATCHWORK_SINCE="${PATCHWORK_SINCE:-3600}"
+
+command_exists() {
+        for cmd in "$@"; do
+                if ! command -v "$cmd" >/dev/null 2>&1; then
+                        echo "'$1' must be present in the system" >&2
+                        exit 1
+                fi
+        done
+}
+
+command_exists "curl" "jq"
+
+fetch_series() {
+        local current_time=$(date +%s)
+        local since_time=$(expr $current_time - $PATCHWORK_SINCE)
+        local date=$(date -u -d @$since_time +"%Y-%m-%dT%H:%M:%SZ")
+
+        curl -k -G "$PATCHWORK_URL/api/events/" \
+                --data "category=series-completed" \
+                --data "project=ltp" \
+                --data "state=new" \
+                --data "since=$date" \
+                --data "archive=no" |
+                jq -r '.[] | "\(.payload.series.id):\(.payload.series.mbox)"'
+
+        [ $? -eq 0 ] || exit 1
+}
+
+get_patches() {
+        local series_id="$1"
+
+        curl -k -G "$PATCHWORK_URL/api/patches/" \
+                --data "project=ltp" \
+                --data "series=$series_id" |
+                jq -r '.[] | "\(.id)"'
+
+        [ $? -eq 0 ] || exit 1
+}
+
+verify_token_exists() {
+        if [ -z "$PATCHWORK_TOKEN" ]; then
+                echo "For this feature you need \$PATCHWORK_TOKEN"
+                exit 1
+        fi
+}
+
+set_patch_state() {
+        local patch_id="$1"
+        local state="$2"
+
+        verify_token_exists
+
+        curl -k -X PATCH \
+                -H "Authorization: Token $PATCHWORK_TOKEN" \
+                -F "state=$state" \
+                "$PATCHWORK_URL/api/patches/$patch_id/"
+
+        [ $? -eq 0 ] || exit 1
+}
+
+set_series_state() {
+        local series_id="$1"
+        local state="$2"
+
+        get_patches "$series_id" | while IFS= read -r patch_id; do
+                [ "$patch_id" ] && set_patch_state "$patch_id" "$state"
+        done
+}
+
+get_checks() {
+        local patch_id="$1"
+
+        curl -k -G "$PATCHWORK_URL/api/patches/$patch_id/checks/" |
+                jq -r '.[] | "\(.id)"'
+
+        [ $? -eq 0 ] || exit 1
+}
+
+already_tested() {
+        local series_id="$1"
+
+        get_patches "$series_id" | while IFS= read -r patch_id; do
+                [ "$patch_id" ] || continue
+
+                get_checks "$patch_id" | while IFS= read -r check_id; do
+                        if [ -n "$check_id" ]; then
+                                echo "$check_id"
+                                return
+                        fi
+                done
+        done
+}
+
+verify_new_patches() {
+        local tmp=$(mktemp -d)
+        local output="$tmp/series_ids.txt"
+
+        echo -n '' >"$output"
+
+        fetch_series | while IFS=: read -r series_id series_mbox; do
+                [ "$series_id" ] || continue
+
+                tested=$(already_tested "$series_id")
+                [ "$tested" ] && continue
+
+                echo "$series_id|$series_mbox" >>"$output"
+        done
+
+        cat "$output"
+}
+
+send_results() {
+        local series_id="$1"
+        local target_url="$2"
+
+        verify_token_exists
+
+        local context=$(echo "$3" | sed 's/:/_/g; s/\//-/g; s/\./-/g')
+
+        [ "$CC" ] && context="${context}_${CC}"
+        [ "$ARCH" ] && context="${context}_${ARCH}"
+
+        local result="$4"
+        [ "$result" == "cancelled" ] && return
+
+        local state="fail"
+        [ "$result" == "success" ] && state="success"
+
+        get_patches "$series_id" | while IFS= read -r patch_id; do
+                [ "$patch_id" ] || continue
+
+                curl -k -X POST \
+                        -H "Authorization: Token $PATCHWORK_TOKEN" \
+                        -F "state=$state" \
+                        -F "context=$context" \
+                        -F "target_url=$target_url" \
+                        -F "description=$result" \
+                        "$PATCHWORK_URL/api/patches/$patch_id/checks/"
+
+                [ $? -eq 0 ] && exit 1
+        done
+}
+
+case "$1" in
+state)
+        set_series_state "$2" "$3"
+        ;;
+check)
+        send_results "$2" "$3" "$4" "$5"
+        ;;
+verify)
+        verify_new_patches
+        ;;
+*)
+        echo "Available commands: state, check, verify"
+        exit 1
+        ;;
+esac

-- 
2.43.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow
  2025-04-15 10:00 [LTP] [PATCH v6 0/4] Support for Patchwork CI Andrea Cervesato
  2025-04-15 10:00 ` [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script Andrea Cervesato
  2025-04-15 10:00 ` [LTP] [PATCH v6 2/4] ci: add patchwork communication script Andrea Cervesato
@ 2025-04-15 10:00 ` Andrea Cervesato
  2025-04-15 13:53   ` pvorel
  2025-04-15 15:12   ` Cyril Hrubis
  2025-04-15 10:00 ` [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow Andrea Cervesato
  3 siblings, 2 replies; 14+ messages in thread
From: Andrea Cervesato @ 2025-04-15 10:00 UTC (permalink / raw)
  To: ltp

From: Andrea Cervesato <andrea.cervesato@suse.com>

Add ci-patchwork-trigger workflow that is meant to run every 30 minutes,
checking for new untested LTP patches in the Mailing List and running
the ci-docker-build workflow on them.

Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 .github/workflows/ci-patchwork-trigger.yml | 65 ++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/.github/workflows/ci-patchwork-trigger.yml b/.github/workflows/ci-patchwork-trigger.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0938aed5ad0df8af8e2e575283b56475ff219ff3
--- /dev/null
+++ b/.github/workflows/ci-patchwork-trigger.yml
@@ -0,0 +1,65 @@
+# Copyright (c) 2025 Andrea Cervesato <andrea.cervesato@suse.com>
+
+name: "Patchwork checker"
+on:
+  push:
+  schedule:
+    - cron: '*/15 * * * 1-5'
+    - cron: '*/45 * * * 6,0'
+
+env:
+  PATCHWORK_CI_FILE: patchwork-ci-output.txt
+
+jobs:
+  checker:
+    if: ${{ github.repository == 'linux-test-project/ltp' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Git checkout
+        uses: actions/checkout@v1
+
+      - name: Verify new patches
+        id: verify
+        run: |
+          ./ci/tools/patchwork.sh verify > "$PATCHWORK_CI_FILE"
+          cat "$PATCHWORK_CI_FILE"
+
+      - name: Run tests
+        if: success()
+        uses: actions/github-script@v7
+        with:
+          script: |
+            const fs = require('fs');
+
+            const output = fs.readFileSync(process.env.PATCHWORK_CI_FILE, 'utf8');
+            if (output.length === 0) {
+              console.log("'patchwork-ci.sh verify' output is empty");
+              return;
+            }
+
+            const lines = output.split('\n');
+            if (lines.length === 0) {
+              console.log("No new patch-series found");
+              return;
+            }
+
+            for (const data of lines) {
+              const [series_id, series_mbox] = data.split('|');
+              if (series_id.length === 0 || series_mbox.length === 0) {
+                console.log(`Malformed data: ${data}`);
+                continue;
+              }
+
+              const response = await github.rest.actions.createWorkflowDispatch({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                ref: context.ref,
+                workflow_id: 'ci-docker-build.yml',
+                inputs: {
+                  SERIES_ID: series_id,
+                  SERIES_MBOX: series_mbox,
+                }
+              });
+
+              console.log(response);
+            }

-- 
2.43.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow
  2025-04-15 10:00 [LTP] [PATCH v6 0/4] Support for Patchwork CI Andrea Cervesato
                   ` (2 preceding siblings ...)
  2025-04-15 10:00 ` [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow Andrea Cervesato
@ 2025-04-15 10:00 ` Andrea Cervesato
  2025-04-15 13:55   ` pvorel
  2025-04-15 16:34   ` Cyril Hrubis
  3 siblings, 2 replies; 14+ messages in thread
From: Andrea Cervesato @ 2025-04-15 10:00 UTC (permalink / raw)
  To: ltp

From: Andrea Cervesato <andrea.cervesato@suse.com>

Modify ci-docker-build workflow in order to apply untested new
patchwork patch-series inside the current branch and to send back
results in the patchwork instance.

Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 .github/workflows/ci-docker-build.yml | 39 ++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/ci-docker-build.yml b/.github/workflows/ci-docker-build.yml
index 44dcca055018a1fb06541a788e3152239aea2e66..b476d993c50a3369efdaa9a72787a7f006cfe0b9 100644
--- a/.github/workflows/ci-docker-build.yml
+++ b/.github/workflows/ci-docker-build.yml
@@ -1,7 +1,19 @@
 # Copyright (c) 2021-2024 Petr Vorel <pvorel@suse.cz>
 
 name: "Test building in various distros in Docker"
-on: [push, pull_request]
+on:
+  push:
+  pull_request:
+  workflow_dispatch:
+    inputs:
+      SERIES_ID:
+        description: LTP patch series ID
+        required: false
+        default: ''
+      SERIES_MBOX:
+        description: LTP patch series URL
+        required: false
+        default: ''
 
 permissions:
   contents: read # to fetch code (actions/checkout)
@@ -125,6 +137,20 @@ jobs:
     - name: Compiler version
       run: $CC --version
 
+    - name: Apply Patchwork series
+      if: inputs.SERIES_ID != '' && inputs.SERIES_MBOX != ''
+      env:
+        PATCHWORK_TOKEN: ${{ secrets.PATCHWORK_TOKEN }}
+      run: |
+        git config --global user.name 'GitHub CI'
+        git config --global user.email 'github@example.com'
+        git config --global --add safe.directory "$GITHUB_WORKSPACE"
+
+        git checkout -b review_patch_series_"${{ inputs.SERIES_ID }}"
+        curl -k "${{ inputs.SERIES_MBOX }}" | git am
+
+        ./ci/tools/patchwork.sh state "${{ inputs.SERIES_ID }}" "needs-review-ack"
+
     - name: ver_linux
       run: ./ver_linux
 
@@ -158,3 +184,14 @@ jobs:
       run: |
         if [ "$MAKE_INSTALL" = 1 ]; then INSTALL_OPT="-i"; fi
         ./build.sh -r install -o ${TREE:-in} $INSTALL_OPT
+
+    - name: Send results to Patchwork
+      if: always() && inputs.SERIES_ID != '' && inputs.SERIES_MBOX != ''
+      env:
+        PATCHWORK_TOKEN: ${{ secrets.PATCHWORK_TOKEN }}
+      run: |
+        ./ci/tools/patchwork.sh check \
+          "${{ inputs.SERIES_ID }}" \
+          "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
+          "${{ matrix.container }}" \
+          "${{ job.status }}"

-- 
2.43.0


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 2/4] ci: add patchwork communication script
  2025-04-15 10:00 ` [LTP] [PATCH v6 2/4] ci: add patchwork communication script Andrea Cervesato
@ 2025-04-15 13:48   ` pvorel
  2025-04-15 15:36   ` Cyril Hrubis
  1 sibling, 0 replies; 14+ messages in thread
From: pvorel @ 2025-04-15 13:48 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi Andrea,

TL;DR:
With fixed == and curl pipe redirect, you may add:
Reviewed-by: Petr Vorel <pvorel@suse.cz>

More info below.

> ---
>  ci/tools/patchwork.sh | 169 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 169 insertions(+)
> 
> diff --git a/ci/tools/patchwork.sh b/ci/tools/patchwork.sh
> new file mode 100755
> index
> 0000000000000000000000000000000000000000..bef6998b6168714e0cfaef443a4573017440bb2d
> --- /dev/null
> +++ b/ci/tools/patchwork.sh
> @@ -0,0 +1,169 @@
> +#!/bin/sh -x
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Shell script to communicate with Patchwork via REST API.
> +# It has been mainly created for CI purposes, but it can be used in 
> the shell
> +# by satisfying minimum requirements.
> +#
> +# Copyright (c) 2025 Andrea Cervesato <andrea.cervesato@suse.com>
> +
> +PATCHWORK_URL="${PATCHWORK_URL:-https://patchwork.ozlabs.org}"
> +PATCHWORK_SINCE="${PATCHWORK_SINCE:-3600}"
> +
> +command_exists() {
Can you please add before merge?
local cmd

> +        for cmd in "$@"; do
> +                if ! command -v "$cmd" >/dev/null 2>&1; then
> +                        echo "'$1' must be present in the system" >&2
> +                        exit 1
> +                fi
> +        done
> +}
> +
> +command_exists "curl" "jq"
> +
> +fetch_series() {
> +        local current_time=$(date +%s)
> +        local since_time=$(expr $current_time - $PATCHWORK_SINCE)
> +        local date=$(date -u -d @$since_time +"%Y-%m-%dT%H:%M:%SZ")
> +
> +        curl -k -G "$PATCHWORK_URL/api/events/" \
> +                --data "category=series-completed" \
> +                --data "project=ltp" \
> +                --data "state=new" \
> +                --data "since=$date" \
> +                --data "archive=no" |
> +                jq -r '.[] | 
> "\(.payload.series.id):\(.payload.series.mbox)"'
> +
> +        [ $? -eq 0 ] || exit 1

FYI $? holds exit code of the last member of pipe, 'jq -r ...' in this 
case.
I guess you'd prefer to check curl exit code, right?

You have 2 options:
1) Redirect curl with '-o log', and call jq after $? evaluation.
2) Depend on bash and use ${PIPESTATUS[0]} (e.g. $PIPESTATUS array).
NOTE: that really requires /bin/bash shebang (e.g. not working on dash 
and busybox sh, thus CI will depend on bash), also will not work on zsh 
which uses $pipestatus array (lower case) :(. We prefer to avoid bash 
(unlike kernel developers) for a good reason (bash incompatibility 
between versions, need to install bash in container, also if arrays are 
needed it's a question whether use shell scripting), but it's mainly due 
the need tests (LTP shell API and tests) to be portable, it could be 
used in tools (with /bin/bash shebang).

> +}
> +
> +get_patches() {
> +        local series_id="$1"
> +
> +        curl -k -G "$PATCHWORK_URL/api/patches/" \
> +                --data "project=ltp" \
> +                --data "series=$series_id" |
> +                jq -r '.[] | "\(.id)"'
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +verify_token_exists() {
> +        if [ -z "$PATCHWORK_TOKEN" ]; then
> +                echo "For this feature you need \$PATCHWORK_TOKEN"
> +                exit 1
> +        fi
> +}
> +
> +set_patch_state() {
> +        local patch_id="$1"
> +        local state="$2"
> +
> +        verify_token_exists
> +
> +        curl -k -X PATCH \
> +                -H "Authorization: Token $PATCHWORK_TOKEN" \
> +                -F "state=$state" \
> +                "$PATCHWORK_URL/api/patches/$patch_id/"
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +set_series_state() {
> +        local series_id="$1"
> +        local state="$2"
> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] && set_patch_state "$patch_id" 
> "$state"

FYI if you ever wish to use '-e' in a script, construct [ ... ] && ... 
will be broken with it.
It would have to be [ ... ] || ... (or use if  ...; then ...; fi).

> +        done
> +}
> +
> +get_checks() {
> +        local patch_id="$1"
> +
> +        curl -k -G "$PATCHWORK_URL/api/patches/$patch_id/checks/" |
> +                jq -r '.[] | "\(.id)"'
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +already_tested() {
> +        local series_id="$1"
> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] || continue
> +
> +                get_checks "$patch_id" | while IFS= read -r check_id; 
> do
> +                        if [ -n "$check_id" ]; then
> +                                echo "$check_id"
> +                                return
> +                        fi
> +                done
> +        done
> +}
> +
> +verify_new_patches() {
> +        local tmp=$(mktemp -d)
> +        local output="$tmp/series_ids.txt"
> +
> +        echo -n '' >"$output"

FYI echo switches are known to have non-portable edge cases, which 
printf does not have, but this works (ok to use). Using printf would be 
simpler:

printf >"$output"

> +
> +        fetch_series | while IFS=: read -r series_id series_mbox; do
> +                [ "$series_id" ] || continue
> +
> +                tested=$(already_tested "$series_id")
> +                [ "$tested" ] && continue
> +
> +                echo "$series_id|$series_mbox" >>"$output"
> +        done
> +
> +        cat "$output"
> +}
> +
> +send_results() {
> +        local series_id="$1"
> +        local target_url="$2"
> +
> +        verify_token_exists
> +
> +        local context=$(echo "$3" | sed 's/:/_/g; s/\//-/g; s/\./-/g')
> +
> +        [ "$CC" ] && context="${context}_${CC}"
> +        [ "$ARCH" ] && context="${context}_${ARCH}"
> +
> +        local result="$4"
> +        [ "$result" == "cancelled" ] && return
== is a bashism, please use =
> +
> +        local state="fail"
> +        [ "$result" == "success" ] && state="success"
And here as well.

We have checkbashisms part of make check, but that's for our LTP build 
system directories, here you must call it directly:

$ checkbashisms ci/tools/patchwork.sh
possible bashism in ci/tools/patchwork.sh line 135 (should be 'b = a'):
         [ "$result" == "cancelled" ] && return
possible bashism in ci/tools/patchwork.sh line 138 (should be 'b = a'):
         [ "$result" == "success" ] && state="success"


> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] || continue
> +
> +                curl -k -X POST \
> +                        -H "Authorization: Token $PATCHWORK_TOKEN" \
> +                        -F "state=$state" \
> +                        -F "context=$context" \
> +                        -F "target_url=$target_url" \
> +                        -F "description=$result" \
> +                        "$PATCHWORK_URL/api/patches/$patch_id/checks/"
> +
> +                [ $? -eq 0 ] && exit 1
> +        done
> +}
> +
> +case "$1" in
> +state)

I see you don't want to support running whole script in once for 
debugging.

Using '' would allow it (up to you of course, as most of comments):
''|state)

Kind regards,
Petr

> +        set_series_state "$2" "$3"
> +        ;;
> +check)
> +        send_results "$2" "$3" "$4" "$5"
> +        ;;
> +verify)
> +        verify_new_patches
> +        ;;
> +*)
> +        echo "Available commands: state, check, verify"
> +        exit 1
> +        ;;
> +esac
> 
> --
> 2.43.0

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow
  2025-04-15 10:00 ` [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow Andrea Cervesato
@ 2025-04-15 13:53   ` pvorel
  2025-04-15 15:12   ` Cyril Hrubis
  1 sibling, 0 replies; 14+ messages in thread
From: pvorel @ 2025-04-15 13:53 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi Andrea,

3rd patch finally got to the mailing list, great :).

Reviewed-by: Petr Vorel <pvorel@suse.cz>

On 2025-04-15 12:00, Andrea Cervesato wrote:
> From: Andrea Cervesato <andrea.cervesato@suse.com>
> 
> Add ci-patchwork-trigger workflow that is meant to run every 30 
> minutes,
> checking for new untested LTP patches in the Mailing List and running
> the ci-docker-build workflow on them.

I guess that's the original message for some previous version. Now it 
runs every 15 min (4x hour) during working days (Mon-Fri) and at 0 and 
45 every hour (2x hour) on weekends.

Thanks for testing github.repository.

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow
  2025-04-15 10:00 ` [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow Andrea Cervesato
@ 2025-04-15 13:55   ` pvorel
  2025-04-15 16:34   ` Cyril Hrubis
  1 sibling, 0 replies; 14+ messages in thread
From: pvorel @ 2025-04-15 13:55 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi Andrea,

Reviewed-by: Petr Vorel <pvorel@suse.cz>

Thanks for whole patchset.

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script
  2025-04-15 10:00 ` [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script Andrea Cervesato
@ 2025-04-15 14:45   ` Cyril Hrubis
  0 siblings, 0 replies; 14+ messages in thread
From: Cyril Hrubis @ 2025-04-15 14:45 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi!
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow
  2025-04-15 10:00 ` [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow Andrea Cervesato
  2025-04-15 13:53   ` pvorel
@ 2025-04-15 15:12   ` Cyril Hrubis
  2025-04-15 16:10     ` Andrea Cervesato via ltp
  1 sibling, 1 reply; 14+ messages in thread
From: Cyril Hrubis @ 2025-04-15 15:12 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi!
> Add ci-patchwork-trigger workflow that is meant to run every 30 minutes,
> checking for new untested LTP patches in the Mailing List and running
> the ci-docker-build workflow on them.
> 
> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
> ---
>  .github/workflows/ci-patchwork-trigger.yml | 65 ++++++++++++++++++++++++++++++
>  1 file changed, 65 insertions(+)
> 
> diff --git a/.github/workflows/ci-patchwork-trigger.yml b/.github/workflows/ci-patchwork-trigger.yml
> new file mode 100644
> index 0000000000000000000000000000000000000000..0938aed5ad0df8af8e2e575283b56475ff219ff3
> --- /dev/null
> +++ b/.github/workflows/ci-patchwork-trigger.yml
> @@ -0,0 +1,65 @@
> +# Copyright (c) 2025 Andrea Cervesato <andrea.cervesato@suse.com>
> +
> +name: "Patchwork checker"
> +on:
> +  push:

Does it make sense to run the script both on schedulle and push?

> +  schedule:
> +    - cron: '*/15 * * * 1-5'
> +    - cron: '*/45 * * * 6,0'

So we run this less on weekends, I suppose that may make some sense.

> +env:
> +  PATCHWORK_CI_FILE: patchwork-ci-output.txt
> 
> +jobs:
> +  checker:
> +    if: ${{ github.repository == 'linux-test-project/ltp' }}
> +    runs-on: ubuntu-latest
> +    steps:
> +      - name: Git checkout
> +        uses: actions/checkout@v1
> +
> +      - name: Verify new patches
> +        id: verify
> +        run: |
> +          ./ci/tools/patchwork.sh verify > "$PATCHWORK_CI_FILE"
> +          cat "$PATCHWORK_CI_FILE"
> +
> +      - name: Run tests
> +        if: success()
> +        uses: actions/github-script@v7
> +        with:
> +          script: |
> +            const fs = require('fs');
> +
> +            const output = fs.readFileSync(process.env.PATCHWORK_CI_FILE, 'utf8');
> +            if (output.length === 0) {
> +              console.log("'patchwork-ci.sh verify' output is empty");
> +              return;
> +            }
> +
> +            const lines = output.split('\n');
> +            if (lines.length === 0) {
> +              console.log("No new patch-series found");
> +              return;
> +            }
> +
> +            for (const data of lines) {
> +              const [series_id, series_mbox] = data.split('|');
> +              if (series_id.length === 0 || series_mbox.length === 0) {
> +                console.log(`Malformed data: ${data}`);
> +                continue;
> +              }
> +
> +              const response = await github.rest.actions.createWorkflowDispatch({
> +                owner: context.repo.owner,
> +                repo: context.repo.repo,
> +                ref: context.ref,
> +                workflow_id: 'ci-docker-build.yml',
> +                inputs: {
> +                  SERIES_ID: series_id,
> +                  SERIES_MBOX: series_mbox,
> +                }
> +              });
> +
> +              console.log(response);
> +            }

The code looks sane to me, though I'm not expert on github CI.

You can add my:

Acked-by: Cyril Hrubis <chrubis@suse.cz>

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 2/4] ci: add patchwork communication script
  2025-04-15 10:00 ` [LTP] [PATCH v6 2/4] ci: add patchwork communication script Andrea Cervesato
  2025-04-15 13:48   ` pvorel
@ 2025-04-15 15:36   ` Cyril Hrubis
  1 sibling, 0 replies; 14+ messages in thread
From: Cyril Hrubis @ 2025-04-15 15:36 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi!
> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
> ---
>  ci/tools/patchwork.sh | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 169 insertions(+)
> 
> diff --git a/ci/tools/patchwork.sh b/ci/tools/patchwork.sh
> new file mode 100755
> index 0000000000000000000000000000000000000000..bef6998b6168714e0cfaef443a4573017440bb2d
> --- /dev/null
> +++ b/ci/tools/patchwork.sh
> @@ -0,0 +1,169 @@
> +#!/bin/sh -x
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Shell script to communicate with Patchwork via REST API.
> +# It has been mainly created for CI purposes, but it can be used in the shell
> +# by satisfying minimum requirements.
> +#
> +# Copyright (c) 2025 Andrea Cervesato <andrea.cervesato@suse.com>
> +
> +PATCHWORK_URL="${PATCHWORK_URL:-https://patchwork.ozlabs.org}"
> +PATCHWORK_SINCE="${PATCHWORK_SINCE:-3600}"
> +
> +command_exists() {
> +        for cmd in "$@"; do
> +                if ! command -v "$cmd" >/dev/null 2>&1; then
> +                        echo "'$1' must be present in the system" >&2
> +                        exit 1
> +                fi
> +        done
> +}
> +
> +command_exists "curl" "jq"
> +
> +fetch_series() {
> +        local current_time=$(date +%s)
> +        local since_time=$(expr $current_time - $PATCHWORK_SINCE)
> +        local date=$(date -u -d @$since_time +"%Y-%m-%dT%H:%M:%SZ")
> +
> +        curl -k -G "$PATCHWORK_URL/api/events/" \
> +                --data "category=series-completed" \
> +                --data "project=ltp" \
> +                --data "state=new" \
> +                --data "since=$date" \
> +                --data "archive=no" |
> +                jq -r '.[] | "\(.payload.series.id):\(.payload.series.mbox)"'
                                                      ^
We add ':' here and then we have to use IFS=':' to parse these values.
Wouldn't this work without the need to fiddle with IFS if we just added
space here instead?

If that worked we could get rid of all the IFS= assigments in the
script.

> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +get_patches() {
> +        local series_id="$1"
> +
> +        curl -k -G "$PATCHWORK_URL/api/patches/" \
> +                --data "project=ltp" \
> +                --data "series=$series_id" |
> +                jq -r '.[] | "\(.id)"'
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +verify_token_exists() {
> +        if [ -z "$PATCHWORK_TOKEN" ]; then
> +                echo "For this feature you need \$PATCHWORK_TOKEN"
> +                exit 1
> +        fi
> +}
> +
> +set_patch_state() {
> +        local patch_id="$1"
> +        local state="$2"
> +
> +        verify_token_exists
> +
> +        curl -k -X PATCH \
> +                -H "Authorization: Token $PATCHWORK_TOKEN" \
> +                -F "state=$state" \
> +                "$PATCHWORK_URL/api/patches/$patch_id/"
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +set_series_state() {
> +        local series_id="$1"
> +        local state="$2"
> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] && set_patch_state "$patch_id" "$state"
> +        done
> +}
> +
> +get_checks() {
> +        local patch_id="$1"
> +
> +        curl -k -G "$PATCHWORK_URL/api/patches/$patch_id/checks/" |
> +                jq -r '.[] | "\(.id)"'
> +
> +        [ $? -eq 0 ] || exit 1
> +}
> +
> +already_tested() {
> +        local series_id="$1"
> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] || continue
> +
> +                get_checks "$patch_id" | while IFS= read -r check_id; do
> +                        if [ -n "$check_id" ]; then
> +                                echo "$check_id"
> +                                return
> +                        fi
> +                done
> +        done
> +}
> +
> +verify_new_patches() {
> +        local tmp=$(mktemp -d)
> +        local output="$tmp/series_ids.txt"
> +
> +        echo -n '' >"$output"
> +
> +        fetch_series | while IFS=: read -r series_id series_mbox; do
> +                [ "$series_id" ] || continue
> +
> +                tested=$(already_tested "$series_id")
> +                [ "$tested" ] && continue
> +
> +                echo "$series_id|$series_mbox" >>"$output"
> +        done
> +
> +        cat "$output"
> +}
> +
> +send_results() {
> +        local series_id="$1"
> +        local target_url="$2"
> +
> +        verify_token_exists
> +
> +        local context=$(echo "$3" | sed 's/:/_/g; s/\//-/g; s/\./-/g')
> +
> +        [ "$CC" ] && context="${context}_${CC}"
> +        [ "$ARCH" ] && context="${context}_${ARCH}"
> +
> +        local result="$4"
> +        [ "$result" == "cancelled" ] && return
> +
> +        local state="fail"
> +        [ "$result" == "success" ] && state="success"
> +
> +        get_patches "$series_id" | while IFS= read -r patch_id; do
> +                [ "$patch_id" ] || continue
> +
> +                curl -k -X POST \
> +                        -H "Authorization: Token $PATCHWORK_TOKEN" \
> +                        -F "state=$state" \
> +                        -F "context=$context" \
> +                        -F "target_url=$target_url" \
> +                        -F "description=$result" \
> +                        "$PATCHWORK_URL/api/patches/$patch_id/checks/"
> +
> +                [ $? -eq 0 ] && exit 1
> +        done
> +}
> +
> +case "$1" in
> +state)
> +        set_series_state "$2" "$3"
> +        ;;
> +check)
> +        send_results "$2" "$3" "$4" "$5"
> +        ;;
> +verify)
> +        verify_new_patches
> +        ;;
> +*)
> +        echo "Available commands: state, check, verify"

Possibly write this to stderr (&>2)?

> +        exit 1
> +        ;;
> +esac

Other than these:

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow
  2025-04-15 15:12   ` Cyril Hrubis
@ 2025-04-15 16:10     ` Andrea Cervesato via ltp
  0 siblings, 0 replies; 14+ messages in thread
From: Andrea Cervesato via ltp @ 2025-04-15 16:10 UTC (permalink / raw)
  To: Cyril Hrubis, Andrea Cervesato; +Cc: ltp

Hi Cyril,

On 4/15/25 17:12, Cyril Hrubis wrote:
>> +name: "Patchwork checker"
>> +on:
>> +  push:
> Does it make sense to run the script both on schedulle and push?
It makes sense if you develop the pipeline. I can disable it tho, but 
then we need to remember that for each new feature on the pipeline we 
need to add "push:" as well.
>> +  schedule:
>> +    - cron: '*/15 * * * 1-5'
>> +    - cron: '*/45 * * * 6,0'
> So we run this less on weekends, I suppose that may make some sense.

Yes, it makes sense if we receive patches in the weekend. Just in case, 
it will take a few seconds to complete the workflow anyway.

- Andrea

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow
  2025-04-15 10:00 ` [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow Andrea Cervesato
  2025-04-15 13:55   ` pvorel
@ 2025-04-15 16:34   ` Cyril Hrubis
  2025-04-15 16:37     ` Andrea Cervesato via ltp
  1 sibling, 1 reply; 14+ messages in thread
From: Cyril Hrubis @ 2025-04-15 16:34 UTC (permalink / raw)
  To: Andrea Cervesato; +Cc: ltp

Hi!
> +    - name: Apply Patchwork series
> +      if: inputs.SERIES_ID != '' && inputs.SERIES_MBOX != ''
> +      env:
> +        PATCHWORK_TOKEN: ${{ secrets.PATCHWORK_TOKEN }}
> +      run: |
> +        git config --global user.name 'GitHub CI'
> +        git config --global user.email 'github@example.com'
> +        git config --global --add safe.directory "$GITHUB_WORKSPACE"
> +
> +        git checkout -b review_patch_series_"${{ inputs.SERIES_ID }}"

So we create a branch for each CI run but I do not see any place where
we get rid of it. Shouldn't we remove it after the CI run?

> +        curl -k "${{ inputs.SERIES_MBOX }}" | git am
> +
> +        ./ci/tools/patchwork.sh state "${{ inputs.SERIES_ID }}" "needs-review-ack"
> +
>      - name: ver_linux
>        run: ./ver_linux
>  
> @@ -158,3 +184,14 @@ jobs:
>        run: |
>          if [ "$MAKE_INSTALL" = 1 ]; then INSTALL_OPT="-i"; fi
>          ./build.sh -r install -o ${TREE:-in} $INSTALL_OPT
> +
> +    - name: Send results to Patchwork
> +      if: always() && inputs.SERIES_ID != '' && inputs.SERIES_MBOX != ''
> +      env:
> +        PATCHWORK_TOKEN: ${{ secrets.PATCHWORK_TOKEN }}
> +      run: |
> +        ./ci/tools/patchwork.sh check \
> +          "${{ inputs.SERIES_ID }}" \
> +          "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
> +          "${{ matrix.container }}" \
> +          "${{ job.status }}"

The rest looks good, once the branch deletion is clarified or fixed:

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow
  2025-04-15 16:34   ` Cyril Hrubis
@ 2025-04-15 16:37     ` Andrea Cervesato via ltp
  0 siblings, 0 replies; 14+ messages in thread
From: Andrea Cervesato via ltp @ 2025-04-15 16:37 UTC (permalink / raw)
  To: Cyril Hrubis, Andrea Cervesato; +Cc: ltp

Hi Cyril,

On 4/15/25 18:34, Cyril Hrubis wrote:
> So we create a branch for each CI run but I do not see any place where
> we get rid of it. Shouldn't we remove it after the CI run?

We run it inside a container, so there's no need to delete it. One 
container is destroyed, we destroy also the branch.

- Andrea


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-04-15 16:37 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-15 10:00 [LTP] [PATCH v6 0/4] Support for Patchwork CI Andrea Cervesato
2025-04-15 10:00 ` [LTP] [PATCH v6 1/4] ci: install dependences for patchwork-ci script Andrea Cervesato
2025-04-15 14:45   ` Cyril Hrubis
2025-04-15 10:00 ` [LTP] [PATCH v6 2/4] ci: add patchwork communication script Andrea Cervesato
2025-04-15 13:48   ` pvorel
2025-04-15 15:36   ` Cyril Hrubis
2025-04-15 10:00 ` [LTP] [PATCH v6 3/4] ci: add ci-patchwork-trigger workflow Andrea Cervesato
2025-04-15 13:53   ` pvorel
2025-04-15 15:12   ` Cyril Hrubis
2025-04-15 16:10     ` Andrea Cervesato via ltp
2025-04-15 10:00 ` [LTP] [PATCH v6 4/4] ci: apply patchwork series in ci-docker-build workflow Andrea Cervesato
2025-04-15 13:55   ` pvorel
2025-04-15 16:34   ` Cyril Hrubis
2025-04-15 16:37     ` Andrea Cervesato via ltp

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.