Skip to content

feat(lint): add actionlint for GitHub Actions workflow validation #1790

feat(lint): add actionlint for GitHub Actions workflow validation

feat(lint): add actionlint for GitHub Actions workflow validation #1790

Workflow file for this run

name: C# tests
on:
push:
branches:
- main
- release-*
- v*
pull_request:
workflow_dispatch:
inputs:
full-matrix:
description: "Run the full server, host, and language version matrix"
type: boolean
default: false
name:
required: false
type: string
description: "(Optional) Test run name"
schedule:
- cron: "0 3 * * *"
permissions:
contents: read
concurrency:
group: C#-${{ github.head_ref || github.ref }}-${{ toJson(inputs) }}
cancel-in-progress: true
run-name:
# Use a distinct name for full-matrix or scheduled runs; otherwise keep manual-dispatch naming behavior
${{ (github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs['full-matrix'] == 'true')) && 'C# Matrix Tests' || (github.event_name == 'workflow_dispatch' && (inputs.name == '' && format('{0} @ {1} {2}', github.ref_name, github.sha, toJson(inputs)) || inputs.name)) || '' }}
env:
CARGO_TERM_COLOR: always
jobs:
tests:
name: net${{ matrix.dotnet }}, server ${{ matrix.server.version }}, ${{ matrix.host.TARGET }}
timeout-minutes: 100
strategy:
fail-fast: false
matrix:
dotnet: ["8.0"]
server:
- type: "valkey"
version: "9.0"
host:
- OS: "ubuntu"
NAMED_OS: "linux"
RUNNER: "ubuntu-24.04"
ARCH: "x64"
TARGET: "x86_64-unknown-linux-gnu"
runs-on: ${{ matrix.host.RUNNER }}
env:
VALKEY_GLIDE_DNS_TESTS_ENABLED: "1"
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Output Matrix Parameters for this job
run: |
echo "Job running with the following matrix configuration:"
echo "${{ toJson(matrix) }}"
- name: Set up dotnet ${{ matrix.dotnet }}
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
# install latest dotnet too to use language features
dotnet-version: |
9
${{ matrix.dotnet }}
env:
DOTNET_INSTALL_DIR: ~/.dotnet
- name: Install shared software dependencies
uses: ./.github/actions/install-shared-dependencies
with:
os: ${{ matrix.host.OS }}
target: ${{ matrix.host.TARGET }}
server-version: ${{ matrix.server.version }}
- name: Configure DNS for tests
shell: bash
run: |
ENTRIES="127.0.0.1 valkey.glide.test.tls.com
127.0.0.1 valkey.glide.test.no_tls.com
::1 valkey.glide.test.tls.com
::1 valkey.glide.test.no_tls.com"
if [[ "${{ matrix.host.OS }}" == "windows" ]]; then
echo "$ENTRIES" >> /c/Windows/System32/drivers/etc/hosts
else
echo "$ENTRIES" | sudo tee -a /etc/hosts
fi
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: rust/target
key: rust-${{ matrix.host.TARGET }}
- name: Test dotnet ${{ matrix.dotnet }}
env:
AWS_ACCESS_KEY_ID: test_secret_key
AWS_SECRET_ACCESS_KEY: test_access_key
AWS_SESSION_TOKEN: test_session_token
run: dotnet test --configuration Debug --framework net${{ matrix.dotnet }} --logger "html;LogFileName=TestReport.html" --logger "trx;LogFileName=TestResults.trx" --logger "console;verbosity=detailed" --results-directory .
- name: Derive failures.json (from TRX)
if: always()
shell: bash
run: |
set -euo pipefail
SUMMARY_FILE=failures.json
if command -v xmllint >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then
FAILED_COUNT=$(xmllint --xpath "string(//Counters/@failed)" TestResults.trx 2>/dev/null || echo 0)
PASSED_COUNT=$(xmllint --xpath "string(//Counters/@passed)" TestResults.trx 2>/dev/null || echo 0)
TOTAL_COUNT=$(xmllint --xpath "string(//Counters/@total)" TestResults.trx 2>/dev/null || echo 0)
SKIPPED_COUNT=$(xmllint --xpath "string(//Counters/@skipped)" TestResults.trx 2>/dev/null || echo 0)
{
echo "{"
echo " \"workflow\": \"C# tests\","
echo " \"runId\": ${GITHUB_RUN_ID},"
echo " \"jobName\": \"net${{ matrix.dotnet }}, server ${{ matrix.server.version }}, ${{ matrix.host.TARGET }}\","
echo " \"matrix\": {"
echo " \"dotnet\": \"${{ matrix.dotnet }}\","
echo " \"server\": { \"type\": \"${{ matrix.server.type }}\", \"version\": \"${{ matrix.server.version }}\" },"
echo " \"host\": { \"OS\": \"${{ matrix.host.OS }}\", \"ARCH\": \"${{ matrix.host.ARCH }}\", \"RUNNER\": \"${{ matrix.host.RUNNER }}\" }"
echo " },"
echo " \"summary\": { \"total\": $TOTAL_COUNT, \"passed\": $PASSED_COUNT, \"failed\": $FAILED_COUNT, \"skipped\": $SKIPPED_COUNT },"
echo " \"failed\": [],"
echo " \"links\": { \"runUrl\": \"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\" }"
echo "}"
} > "$SUMMARY_FILE"
else
echo '{"workflow":"C# tests","summary":{"note":"Install xmllint+jq for rich failures"}}' > "$SUMMARY_FILE"
fi
- name: Run coverage
if: ${{ matrix.dotnet == '8.0' && contains(matrix.host.RUNNER, 'ubuntu') && matrix.host.ARCH == 'x64' && matrix.server.version == '8.1' }}
uses: ./.github/actions/run-coverage
- name: Upload test reports
if: always()
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: test-reports-dotnet-${{ matrix.dotnet }}-${{ matrix.server.type }}-${{ matrix.server.version }}-${{ matrix.host.OS }}-${{ matrix.host.ARCH }}
path: |
TestReport.html
TestResults.trx
failures.json
valkey-glide/utils/clusters/**
tests-modules:
name: Module tests (Docker, net${{ matrix.dotnet }})
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
dotnet: ["8.0"]
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Set up dotnet ${{ matrix.dotnet }}
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: |
9
${{ matrix.dotnet }}
env:
DOTNET_INSTALL_DIR: ~/.dotnet
- name: Install shared software dependencies
uses: ./.github/actions/install-shared-dependencies
with:
os: ubuntu
target: x86_64-unknown-linux-gnu
server-version: "9.0"
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: rust/target
key: rust-x86_64-unknown-linux-gnu
- name: Run module tests against Docker servers
env:
standalone-endpoints: "localhost:6389"
cluster-endpoints: "localhost:8001,localhost:8002,localhost:8003,localhost:8004,localhost:8005,localhost:8006"
run: |
dotnet test tests/Valkey.Glide.IntegrationTests/ \
--framework net${{ matrix.dotnet }} \
--filter "FullyQualifiedName~ServerModules" \
--logger "html;LogFileName=ModuleTestReport.html" \
--logger "trx;LogFileName=ModuleTestResults.trx" \
--logger "console;verbosity=detailed" \
--results-directory .
- name: Derive failures.json (from TRX)
if: always()
shell: bash
run: |
set -euo pipefail
SUMMARY_FILE=failures.json
FAILED=0; PASSED=0; TOTAL=0; SKIPPED=0
if [ -f "ModuleTestResults.trx" ] && command -v xmllint >/dev/null 2>&1; then
FAILED=$(xmllint --xpath "string(//Counters/@failed)" ModuleTestResults.trx 2>/dev/null || echo 0)
PASSED=$(xmllint --xpath "string(//Counters/@passed)" ModuleTestResults.trx 2>/dev/null || echo 0)
TOTAL=$(xmllint --xpath "string(//Counters/@total)" ModuleTestResults.trx 2>/dev/null || echo 0)
SKIPPED=$(xmllint --xpath "string(//Counters/@skipped)" ModuleTestResults.trx 2>/dev/null || echo 0)
fi
cat > "$SUMMARY_FILE" <<EOF
{
"workflow": "C# tests",
"runId": ${GITHUB_RUN_ID},
"jobName": "Module tests (Docker, net${{ matrix.dotnet }})",
"summary": { "total": $TOTAL, "passed": $PASSED, "failed": $FAILED, "skipped": $SKIPPED },
"failed": [],
"links": { "runUrl": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" }
}
EOF
- name: Upload test reports
if: always()
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: module-test-reports-net${{ matrix.dotnet }}
path: |
ModuleTestReport.html
ModuleTestResults.trx
failures.json