@@ -112,3 +112,99 @@ jobs:
112112 - name : Generate OpenAPI docs
113113 run : php artisan l5-swagger:generate
114114
115+ - name : Build Swagger UI preview
116+ run : |
117+ mkdir -p swagger-ui
118+ cp storage/api-docs/api-docs.json swagger-ui/api-docs.json
119+ cat > swagger-ui/index.html << 'HTMLEOF'
120+ <!doctype html>
121+ <html lang="en">
122+ <head>
123+ <meta charset="utf-8" />
124+ <title>OpenStackID API - Swagger UI</title>
125+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css" />
126+ </head>
127+ <body>
128+ <div id="swagger-ui"></div>
129+ <script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script>
130+ <script>
131+ window.onload = () => {
132+ window.ui = SwaggerUIBundle({
133+ url: 'api-docs.json',
134+ dom_id: '#swagger-ui'
135+ });
136+ };
137+ </script>
138+ </body>
139+ </html>
140+ HTMLEOF
141+
142+ - name : Upload Swagger UI artifact
143+ uses : actions/upload-artifact@v4
144+ with :
145+ name : swagger-ui
146+ path : swagger-ui/
147+ if-no-files-found : error
148+
149+ pages-preview :
150+ name : Publish Swagger UI to GitHub Pages
151+ needs : openapi-generate
152+ if : github.event_name == 'pull_request'
153+ runs-on : ubuntu-latest
154+
155+ permissions :
156+ contents : write
157+ issues : write
158+ pull-requests : write
159+
160+ steps :
161+ - name : Checkout repository
162+ uses : actions/checkout@v4
163+
164+ - name : Download Swagger UI artifact
165+ uses : actions/download-artifact@v4
166+ with :
167+ name : swagger-ui
168+ path : swagger-ui
169+
170+ - name : Build public directory for GitHub Pages
171+ run : |
172+ PR_PATH="openapi/pr-${{ github.event.number }}"
173+ mkdir -p "public/${PR_PATH}"
174+ cp -R swagger-ui/* "public/${PR_PATH}/"
175+ echo "Built GitHub Pages content at public/${PR_PATH}"
176+
177+ - name : Publish to GitHub Pages
178+ uses : peaceiris/actions-gh-pages@v4
179+ with :
180+ github_token : ${{ secrets.GITHUB_TOKEN }}
181+ publish_dir : ./public
182+ keep_files : true
183+
184+ - name : Comment preview URL on PR
185+ uses : actions/github-script@v7
186+ with :
187+ github-token : ${{ secrets.GITHUB_TOKEN }}
188+ script : |
189+ const prNumber = context.payload.pull_request.number;
190+ const owner = context.repo.owner;
191+ const repo = context.repo.repo;
192+ const baseUrl = `https://${owner}.github.io/${repo}`;
193+ const previewPath = `/openapi/pr-${prNumber}/`;
194+ const url = `${baseUrl}${previewPath}`;
195+
196+ const body = [
197+ '📘 **OpenAPI / Swagger preview**',
198+ '',
199+ `➡️ ${url}`,
200+ '',
201+ 'This page is automatically updated on each push to this PR.'
202+ ].join('\n');
203+
204+ await github.rest.issues.createComment({
205+ owner,
206+ repo,
207+ issue_number: prNumber,
208+ body,
209+ });
210+
0 commit comments