-
Notifications
You must be signed in to change notification settings - Fork 0
chore(swagger): preview openapi doc at gh-pages #119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,160 @@ | ||||||||||||||||||||||||||||||
| name: OpenAPI generation | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||
| push: | ||||||||||||||||||||||||||||||
| pull_request: | ||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||
| openapi-generate: | ||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||
| APP_ENV: testing | ||||||||||||||||||||||||||||||
| APP_DEBUG: true | ||||||||||||||||||||||||||||||
| APP_KEY: base64:4vh0op/S1dAsXKQ2bbdCfWRyCI9r8NNIdPXyZWt9PX4= | ||||||||||||||||||||||||||||||
| DEV_EMAIL_TO: smarcet@gmail.com | ||||||||||||||||||||||||||||||
| APP_URL: http://localhost | ||||||||||||||||||||||||||||||
| DB_CONNECTION: mysql | ||||||||||||||||||||||||||||||
| DB_HOST: 127.0.0.1 | ||||||||||||||||||||||||||||||
| DB_PORT: 3306 | ||||||||||||||||||||||||||||||
| DB_DATABASE: idp_test | ||||||||||||||||||||||||||||||
| DB_USERNAME: root | ||||||||||||||||||||||||||||||
| DB_PASSWORD: 1qaz2wsx | ||||||||||||||||||||||||||||||
| REDIS_HOST: 127.0.0.1 | ||||||||||||||||||||||||||||||
| REDIS_PORT: 6379 | ||||||||||||||||||||||||||||||
| REDIS_DB: 0 | ||||||||||||||||||||||||||||||
| REDIS_PASSWORD: 1qaz2wsx | ||||||||||||||||||||||||||||||
| REDIS_DATABASES: 16 | ||||||||||||||||||||||||||||||
| SSL_ENABLED: false | ||||||||||||||||||||||||||||||
| SESSION_DRIVER: redis | ||||||||||||||||||||||||||||||
| PHP_VERSION: 8.3 | ||||||||||||||||||||||||||||||
| OTEL_SDK_DISABLED: true | ||||||||||||||||||||||||||||||
| OTEL_SERVICE_ENABLED: false | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| services: | ||||||||||||||||||||||||||||||
| mysql: | ||||||||||||||||||||||||||||||
| image: mysql:8.0 | ||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||
| MYSQL_ROOT_PASSWORD: ${{env.DB_PASSWORD}} | ||||||||||||||||||||||||||||||
| MYSQL_DATABASE: ${{env.DB_DATABASE}} | ||||||||||||||||||||||||||||||
| ports: | ||||||||||||||||||||||||||||||
| - 3306:3306 | ||||||||||||||||||||||||||||||
| options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 | ||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||
| - name: Create Redis | ||||||||||||||||||||||||||||||
| uses: supercharge/redis-github-action@1.8.1 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| redis-port: ${{env.REDIS_PORT}} | ||||||||||||||||||||||||||||||
| redis-password: ${{env.REDIS_PASSWORD}} | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Check out repository code | ||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Install PHP | ||||||||||||||||||||||||||||||
| uses: shivammathur/setup-php@v2 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| php-version: ${{ env.PHP_VERSION }} | ||||||||||||||||||||||||||||||
| extensions: pdo_mysql, mbstring, exif, pcntl, bcmath, sockets, gettext, apcu, redis, igbinary, memcached | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Install dependencies | ||||||||||||||||||||||||||||||
| uses: "ramsey/composer-install@v3" | ||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||
| COMPOSER_AUTH: '{"github-oauth": {"github.com": "${{ secrets.PAT }}"} }' | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
|
Comment on lines
+59
to
+61
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat -n .github/workflows/l5-swagger-generate.ymlRepository: OpenStackweb/openstackid Length of output: 6964 🏁 Script executed: # Check if PAT secret is referenced elsewhere in workflows
rg 'secrets\.PAT' .github/workflows/
# Check for any repository secrets documentation or configuration
find .github -name "*.yml" -o -name "*.yaml" | head -20Repository: OpenStackweb/openstackid Length of output: 720 🏁 Script executed: # Check pull_request_unit_tests.yml to see if it has guards against fork PRs
cat -n .github/workflows/pull_request_unit_tests.yml | head -40Repository: OpenStackweb/openstackid Length of output: 1503 🏁 Script executed: # Search for composer-install and secrets.PAT in pull_request_unit_tests.yml
cat -n .github/workflows/pull_request_unit_tests.yml | grep -A 3 -B 3 "secrets.PAT"Repository: OpenStackweb/openstackid Length of output: 362 🏁 Script executed: # Check if there are any conditional guards in the openapi-generate job
cat -n .github/workflows/l5-swagger-generate.yml | grep -A 10 "openapi-generate:"Repository: OpenStackweb/openstackid Length of output: 512 🏁 Script executed: # Check for composer.json to see if there are private package dependencies
head -50 composer.json | grep -A 5 -B 5 '"repositories"'Repository: OpenStackweb/openstackid Length of output: 245 🏁 Script executed: # Let's check what happens when secrets.PAT is undefined in GitHub Actions
# Also verify the behavior described in GitHub documentation by searching for any conditional patterns in the repo
rg 'github\.event\.pull_request\.head\.repo\.full_name' .github/workflows/Repository: OpenStackweb/openstackid Length of output: 50
Repository secrets are unavailable by default on forked pull requests. When To fix this, either:
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||
| - name: Generate OpenAPI docs | ||||||||||||||||||||||||||||||
| run: php artisan l5-swagger:generate | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Build Swagger UI preview | ||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||
| mkdir -p swagger-ui | ||||||||||||||||||||||||||||||
| cp storage/api-docs/api-docs.json swagger-ui/api-docs.json | ||||||||||||||||||||||||||||||
| cat > swagger-ui/index.html << 'HTMLEOF' | ||||||||||||||||||||||||||||||
| <!doctype html> | ||||||||||||||||||||||||||||||
| <html lang="en"> | ||||||||||||||||||||||||||||||
| <head> | ||||||||||||||||||||||||||||||
| <meta charset="utf-8" /> | ||||||||||||||||||||||||||||||
| <title>OpenStackID API - Swagger UI</title> | ||||||||||||||||||||||||||||||
| <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css" /> | ||||||||||||||||||||||||||||||
| </head> | ||||||||||||||||||||||||||||||
| <body> | ||||||||||||||||||||||||||||||
| <div id="swagger-ui"></div> | ||||||||||||||||||||||||||||||
| <script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script> | ||||||||||||||||||||||||||||||
| <script> | ||||||||||||||||||||||||||||||
| window.onload = () => { | ||||||||||||||||||||||||||||||
| window.ui = SwaggerUIBundle({ | ||||||||||||||||||||||||||||||
| url: 'api-docs.json', | ||||||||||||||||||||||||||||||
| dom_id: '#swagger-ui' | ||||||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||
| </script> | ||||||||||||||||||||||||||||||
| </body> | ||||||||||||||||||||||||||||||
| </html> | ||||||||||||||||||||||||||||||
| HTMLEOF | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Upload Swagger UI artifact | ||||||||||||||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| name: swagger-ui | ||||||||||||||||||||||||||||||
| path: swagger-ui/ | ||||||||||||||||||||||||||||||
| if-no-files-found: error | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| pages-preview: | ||||||||||||||||||||||||||||||
| name: Publish Swagger UI to GitHub Pages | ||||||||||||||||||||||||||||||
| needs: openapi-generate | ||||||||||||||||||||||||||||||
| if: github.event_name == 'pull_request' | ||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||
| contents: write | ||||||||||||||||||||||||||||||
| issues: write | ||||||||||||||||||||||||||||||
| pull-requests: write | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
|
Comment on lines
+102
to
+109
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat .github/workflows/l5-swagger-generate.ymlRepository: OpenStackweb/openstackid Length of output: 5844 Guard The job writes to Suggested condition- if: github.event_name == 'pull_request'
+ if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||
| - name: Checkout repository | ||||||||||||||||||||||||||||||
| uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Download Swagger UI artifact | ||||||||||||||||||||||||||||||
| uses: actions/download-artifact@v4 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| name: swagger-ui | ||||||||||||||||||||||||||||||
| path: swagger-ui | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Build public directory for GitHub Pages | ||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||
| PR_PATH="openapi/pr-${{ github.event.number }}" | ||||||||||||||||||||||||||||||
| mkdir -p "public/${PR_PATH}" | ||||||||||||||||||||||||||||||
| cp -R swagger-ui/* "public/${PR_PATH}/" | ||||||||||||||||||||||||||||||
| echo "Built GitHub Pages content at public/${PR_PATH}" | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Publish to GitHub Pages | ||||||||||||||||||||||||||||||
| uses: peaceiris/actions-gh-pages@v4 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| github_token: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||
| publish_dir: ./public | ||||||||||||||||||||||||||||||
| keep_files: true | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| - name: Comment preview URL on PR | ||||||||||||||||||||||||||||||
| uses: actions/github-script@v7 | ||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||
| script: | | ||||||||||||||||||||||||||||||
| const prNumber = context.payload.pull_request.number; | ||||||||||||||||||||||||||||||
| const owner = context.repo.owner; | ||||||||||||||||||||||||||||||
| const repo = context.repo.repo; | ||||||||||||||||||||||||||||||
| const baseUrl = `https://${owner}.github.io/${repo}`; | ||||||||||||||||||||||||||||||
| const previewPath = `/openapi/pr-${prNumber}/`; | ||||||||||||||||||||||||||||||
| const url = `${baseUrl}${previewPath}`; | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| const body = [ | ||||||||||||||||||||||||||||||
| '📘 **OpenAPI / Swagger preview**', | ||||||||||||||||||||||||||||||
| '', | ||||||||||||||||||||||||||||||
| `➡️ ${url}`, | ||||||||||||||||||||||||||||||
| '', | ||||||||||||||||||||||||||||||
| 'This page is automatically updated on each push to this PR.' | ||||||||||||||||||||||||||||||
| ].join('\n'); | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
| await github.rest.issues.createComment({ | ||||||||||||||||||||||||||||||
| owner, | ||||||||||||||||||||||||||||||
| repo, | ||||||||||||||||||||||||||||||
| issue_number: prNumber, | ||||||||||||||||||||||||||||||
| body, | ||||||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid committing credential-like and PII values in workflow env.
APP_KEY,DB_PASSWORD,REDIS_PASSWORD, andDEV_EMAIL_TOare committed directly in repo. Even for CI/test values, this weakens security posture and can trigger secret/PII leakage concerns.Suggested hardening
📝 Committable suggestion
🤖 Prompt for AI Agents