mirror of
https://github.com/appleboy/ssh-action.git
synced 2026-01-28 15:03:17 +03:00
refactor: streamline output handling for GITHUB_OUTPUT in workflows (#404)
* refactor: streamline output handling for GITHUB_OUTPUT in workflows - Write the stdout<<EOF and EOF markers directly to GITHUB_OUTPUT instead of using a group command - Simplify the process for capturing and appending command output to GITHUB_OUTPUT fix #403 fix #397 Signed-off-by: appleboy <appleboy.tw@gmail.com> * test: enhance stdout capture and verification in tests - Add a check to ensure captured stdout is not empty - Add steps to capture and verify multiline stdout output - Add verification that specific lines and the username are present in captured output - Add steps to handle and verify stdout containing special characters and file paths Signed-off-by: appleboy <appleboy.tw@gmail.com> * ci: enforce unique occurrence of lines in multiline output validation - Add a step to verify that lines "Line 1", "Line 2", and "Line 3" each appear exactly once in the multiline output - Fail the workflow if any line is missing or duplicated - Confirm successful validation with a message when no duplicates are found Signed-off-by: appleboy <appleboy.tw@gmail.com> --------- Signed-off-by: appleboy <appleboy.tw@gmail.com>
This commit is contained in:
96
.github/workflows/main.yml
vendored
96
.github/workflows/main.yml
vendored
@@ -609,6 +609,102 @@ jobs:
|
|||||||
- name: check stdout
|
- name: check stdout
|
||||||
run: |
|
run: |
|
||||||
echo "stdout: ${{ steps.stdout.outputs.stdout }}"
|
echo "stdout: ${{ steps.stdout.outputs.stdout }}"
|
||||||
|
if [ -z "${{ steps.stdout.outputs.stdout }}" ]; then
|
||||||
|
echo "Error: stdout is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- id: stdout-multiline
|
||||||
|
name: capture multiline output
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
host: ${{ env.REMOTE_HOST }}
|
||||||
|
username: linuxserver.io
|
||||||
|
password: password
|
||||||
|
port: 2222
|
||||||
|
capture_stdout: true
|
||||||
|
script: |
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
echo "Line 1"
|
||||||
|
echo "Line 2"
|
||||||
|
echo "Line 3"
|
||||||
|
whoami
|
||||||
|
pwd
|
||||||
|
|
||||||
|
- name: check multiline output
|
||||||
|
run: |
|
||||||
|
echo "stdout: ${{ steps.stdout-multiline.outputs.stdout }}"
|
||||||
|
# Check if all lines are present
|
||||||
|
if ! echo "${{ steps.stdout-multiline.outputs.stdout }}" | grep -q "Line 1"; then
|
||||||
|
echo "Error: 'Line 1' not found in output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! echo "${{ steps.stdout-multiline.outputs.stdout }}" | grep -q "Line 2"; then
|
||||||
|
echo "Error: 'Line 2' not found in output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! echo "${{ steps.stdout-multiline.outputs.stdout }}" | grep -q "Line 3"; then
|
||||||
|
echo "Error: 'Line 3' not found in output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! echo "${{ steps.stdout-multiline.outputs.stdout }}" | grep -q "linuxserver.io"; then
|
||||||
|
echo "Error: username not found in output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for duplicates - each unique line should appear exactly once
|
||||||
|
OUTPUT="${{ steps.stdout-multiline.outputs.stdout }}"
|
||||||
|
LINE1_COUNT=$(echo "$OUTPUT" | grep -c "^Line 1$" || true)
|
||||||
|
LINE2_COUNT=$(echo "$OUTPUT" | grep -c "^Line 2$" || true)
|
||||||
|
LINE3_COUNT=$(echo "$OUTPUT" | grep -c "^Line 3$" || true)
|
||||||
|
|
||||||
|
echo "Line 1 count: $LINE1_COUNT"
|
||||||
|
echo "Line 2 count: $LINE2_COUNT"
|
||||||
|
echo "Line 3 count: $LINE3_COUNT"
|
||||||
|
|
||||||
|
if [ "$LINE1_COUNT" -ne 1 ]; then
|
||||||
|
echo "Error: 'Line 1' appears $LINE1_COUNT times (expected 1)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$LINE2_COUNT" -ne 1 ]; then
|
||||||
|
echo "Error: 'Line 2' appears $LINE2_COUNT times (expected 1)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$LINE3_COUNT" -ne 1 ]; then
|
||||||
|
echo "Error: 'Line 3' appears $LINE3_COUNT times (expected 1)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✓ No duplicate lines detected"
|
||||||
|
|
||||||
|
- id: stdout-with-special-chars
|
||||||
|
name: capture output with special characters
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
host: ${{ env.REMOTE_HOST }}
|
||||||
|
username: linuxserver.io
|
||||||
|
password: password
|
||||||
|
port: 2222
|
||||||
|
capture_stdout: true
|
||||||
|
script: |
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
echo "Test with special chars: @#$%^&*()"
|
||||||
|
echo "Path: /home/user/test"
|
||||||
|
echo "JSON: {\"key\": \"value\"}"
|
||||||
|
|
||||||
|
- name: check special characters output
|
||||||
|
run: |
|
||||||
|
echo "stdout: ${{ steps.stdout-with-special-chars.outputs.stdout }}"
|
||||||
|
if ! echo "${{ steps.stdout-with-special-chars.outputs.stdout }}" | grep -q "special chars"; then
|
||||||
|
echo "Error: special characters test failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! echo "${{ steps.stdout-with-special-chars.outputs.stdout }}" | grep -q "/home/user/test"; then
|
||||||
|
echo "Error: path not found in output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
testing-script-stop:
|
testing-script-stop:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -71,11 +71,9 @@ if ! "${TARGET}" --version; then
|
|||||||
fi
|
fi
|
||||||
echo "======================================="
|
echo "======================================="
|
||||||
if [[ "${INPUT_CAPTURE_STDOUT}" == 'true' ]]; then
|
if [[ "${INPUT_CAPTURE_STDOUT}" == 'true' ]]; then
|
||||||
{
|
echo 'stdout<<EOF' >> "${GITHUB_OUTPUT}"
|
||||||
echo 'stdout<<EOF'
|
|
||||||
"${TARGET}" "$@" | tee -a "${GITHUB_OUTPUT}"
|
"${TARGET}" "$@" | tee -a "${GITHUB_OUTPUT}"
|
||||||
echo 'EOF'
|
echo 'EOF' >> "${GITHUB_OUTPUT}"
|
||||||
} >>"${GITHUB_OUTPUT}"
|
|
||||||
else
|
else
|
||||||
"${TARGET}" "$@"
|
"${TARGET}" "$@"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user