-
Notifications
You must be signed in to change notification settings - Fork 7
143 lines (126 loc) · 6.13 KB
/
sdk-generation-validation.yml
File metadata and controls
143 lines (126 loc) · 6.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
name: Test SDK Generation Validation
on:
pull_request:
paths:
- 'openapi/v*.yml'
jobs:
# ──────────────────────────────────────────────────
# Discover which versioned OAS files changed in this PR
# ──────────────────────────────────────────────────
discover-changed-files:
name: Discover Changed OAS Files
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.build-matrix.outputs.matrix }}
has_files: ${{ steps.build-matrix.outputs.has_files }}
steps:
- uses: actions/checkout@v3
- name: Get changed versioned OAS files
id: changed-files
uses: tj-actions/changed-files@v41
with:
files: openapi/v*.yml
- name: Build matrix from changed files
id: build-matrix
run: |
CHANGED="${{ steps.changed-files.outputs.all_changed_files }}"
echo "Changed versioned OAS files: $CHANGED"
if [ -z "$CHANGED" ]; then
echo "has_files=false" >> $GITHUB_OUTPUT
echo "matrix=[]" >> $GITHUB_OUTPUT
exit 0
fi
# Build a JSON array of changed OAS files
MATRIX="["
FIRST=true
for file in $CHANGED; do
filename=$(basename "$file" .yml)
if [ "$FIRST" = true ]; then
FIRST=false
else
MATRIX="${MATRIX},"
fi
MATRIX="${MATRIX}{\"openapi_file\":\"${file}\",\"version_name\":\"${filename}\"}"
done
MATRIX="${MATRIX}]"
echo "matrix=${MATRIX}" >> $GITHUB_OUTPUT
echo "has_files=true" >> $GITHUB_OUTPUT
echo "Generated matrix: ${MATRIX}"
# ──────────────────────────────────────────────────
# Run SDK generation validation for each changed OAS file x each language
# ──────────────────────────────────────────────────
validate-sdk-generation:
name: "${{ matrix.lang.display_name }} (${{ matrix.version.version_name }})"
needs: discover-changed-files
if: needs.discover-changed-files.outputs.has_files == 'true'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version: ${{ fromJson(needs.discover-changed-files.outputs.matrix) }}
lang:
- { language: java, generator: java, display_name: Java }
- { language: ruby, generator: ruby, display_name: Ruby }
- { language: python, generator: python, display_name: Python }
- { language: node, generator: "typescript-axios", display_name: Node }
- { language: csharp, generator: csharp, display_name: "C#" }
- { language: go, generator: go, display_name: Go }
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install OpenAPI Generator CLI
run: npm install -g @openapitools/openapi-generator-cli
- name: Create output directory
run: mkdir -p ./sdk-output/${{ matrix.lang.language }}
- name: Generate Test SDK from ${{ matrix.version.version_name }}
run: |
openapi-generator-cli generate \
-i ${{ matrix.version.openapi_file }} \
-g ${{ matrix.lang.generator }} \
-o ./sdk-output/${{ matrix.lang.language }} \
--skip-validate-spec
- name: Verify expected files were generated
run: |
echo "Checking for generated files in ./sdk-output/${{ matrix.lang.language }}"
ls -la ./sdk-output/${{ matrix.lang.language }}
cd ./sdk-output/${{ matrix.lang.language }}
# Check for key files based on language
case "${{ matrix.lang.language }}" in
"java")
find . -name "pom.xml" -quit > /dev/null || (echo "❌ Missing pom.xml" && exit 1)
find . -name "*.java" -quit > /dev/null || (echo "❌ No Java files found" && exit 1)
echo "✅ Java SDK structure validated (${{ matrix.version.version_name }})"
;;
"ruby")
find . -name "*.gemspec" -quit > /dev/null || (echo "❌ Missing gemspec file" && exit 1)
find . -name "*.rb" -quit > /dev/null || (echo "❌ No Ruby files found" && exit 1)
echo "✅ Ruby SDK structure validated (${{ matrix.version.version_name }})"
;;
"python")
find . -name "setup.py" -quit > /dev/null || (echo "❌ Missing setup.py" && exit 1)
find . -name "*.py" -quit > /dev/null || (echo "❌ No Python files found" && exit 1)
echo "✅ Python SDK structure validated (${{ matrix.version.version_name }})"
;;
"node")
find . -name "package.json" -quit > /dev/null || (echo "❌ Missing package.json" && exit 1)
find . \( -name "*.ts" -o -name "*.js" \) -quit > /dev/null || (echo "❌ No TypeScript/JavaScript files found" && exit 1)
echo "✅ Node SDK structure validated (${{ matrix.version.version_name }})"
;;
"csharp")
find . -name "*.csproj" -quit > /dev/null || (echo "❌ Missing csproj file" && exit 1)
find . -name "*.cs" -quit > /dev/null || (echo "❌ No C# files found" && exit 1)
echo "✅ C# SDK structure validated (${{ matrix.version.version_name }})"
;;
"go")
find . -name "go.mod" -quit > /dev/null || (echo "❌ Missing go.mod" && exit 1)
find . -name "*.go" -quit > /dev/null || (echo "❌ No Go files found" && exit 1)
echo "✅ Go SDK structure validated (${{ matrix.version.version_name }})"
;;
esac
- name: Clean up
if: always()
run: rm -rf ./sdk-output/${{ matrix.lang.language }}