CI: Upload failed screendump tests when run in github actions

It's a bit of a pain to debug failing screendump tests without knowing
exactly what went wrong. Therefore include actions/upload-artifact for
the Github CI runners and have them uploaded those failing screen dump
tests automatically.

Let's add this step to each of the Linux/MacOS/Windows workflows but do
not duplicate the code, factor it out to a single file
.github/actions/screendump/action.yml and reference this one from the
main ci.yml file

Example:
https://github.com/chrisbra/vim/actions/runs/9085493619

closes: #14771

Co-authored-by: dundargoc <gocdundar@gmail.com>
Co-authored-by: Aliaksei Budavei <0x000c70@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/.github/actions/screendump/action.yml b/.github/actions/screendump/action.yml
new file mode 100644
index 0000000..19eb9b6
--- /dev/null
+++ b/.github/actions/screendump/action.yml
@@ -0,0 +1,26 @@
+name: 'screendump'
+description: "Upload failed syntax tests"
+runs:
+  using: "composite"
+  steps:
+    - name: Upload failed syntax tests
+      uses: actions/upload-artifact@v4
+      with:
+        # Name of the artifact to upload.
+        name: ${{ github.workflow }}-${{ github.job }}-${{ join(matrix.*, '-') }}-failed-syntax-tests
+
+        # A file, directory or wildcard pattern that describes what
+        # to upload.
+        path: |
+         ${{ github.workspace }}/runtime/syntax/testdir/failed/*
+         ${{ github.workspace }}/src/testdir/failed/*
+        # The desired behavior if no files are found using the
+        # provided path.
+        if-no-files-found: ignore
+
+        # Duration after which artifact will expire in days. 0 means
+        # using repository settings.
+        retention-days: 0
+
+        # If true, an artifact with a matching name will be deleted
+        overwrite: true
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 74a6674..1110665 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -270,6 +270,9 @@
           do_test() { sg audio "sg $(id -gn) '$*'"; }
           do_test make ${SHADOWOPT} ${TEST}
 
+      - if: ${{ !cancelled() }}
+        uses: ./.github/actions/screendump
+
       - name: Vim tags
         if: contains(matrix.extra, 'vimtags')
         run: |
@@ -396,6 +399,9 @@
         run: |
           make ${TEST}
 
+      - if: ${{ !cancelled() }}
+        uses: ./.github/actions/screendump
+
   windows:
     runs-on: windows-2022
 
@@ -691,6 +697,9 @@
             nmake -nologo -f Make_mvc.mak tiny VIMPROG=..\vim  || exit 1
           )
 
+      - if: ${{ !cancelled() }}
+        uses: ./.github/actions/screendump
+
       - name: Generate gcov files
         if: matrix.coverage
         shell: msys2 {0}
diff --git a/Filelist b/Filelist
index cd787ef..081d164 100644
--- a/Filelist
+++ b/Filelist
@@ -10,6 +10,7 @@
 		.github/ISSUE_TEMPLATE/feature_request.md \
 		.github/workflows/ci.yml \
 		.github/workflows/codeql-analysis.yml \
+		.github/actions/screendump/action.yml \
 		.github/workflows/coverity.yml \
 		.github/dependabot.yml \
 		.gitignore \