Feature/admin docs gen #3511
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################## | |
############################################################################## | |
# | |
# NOTE! | |
# | |
# Please read the README.md file in this directory that defines what should | |
# be placed in this file | |
# | |
############################################################################## | |
############################################################################## | |
name: PR Workflow | |
on: | |
pull_request: | |
branches: | |
- '**' | |
env: | |
CODECOV_UNIQUE_NAME: CODECOV_UNIQUE_NAME-${{ github.run_id }}-${{ github.run_number }} | |
jobs: | |
Code-Quality-Checks: | |
name: Performs linting, formatting, type-checking, checking for different source and target branch | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout the Repository | |
uses: actions/checkout@v4 | |
- name: Set up Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '22.x' | |
- name: Install Dependencies | |
run: npm install | |
- name: Count number of lines | |
run: | | |
chmod +x ./.github/workflows/scripts/countline.py | |
./.github/workflows/scripts/countline.py --lines 600 --exclude_files src/screens/LoginPage/LoginPage.tsx src/GraphQl/Queries/Queries.ts src/screens/OrgList/OrgList.tsx src/GraphQl/Mutations/mutations.ts src/components/EventListCard/EventListCardModals.tsx src/components/TagActions/TagActionsMocks.ts src/utils/interfaces.ts src/screens/MemberDetail/MemberDetail.tsx | |
- name: Get changed TypeScript files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
- name: Check formatting | |
if: steps.changed-files.outputs.only_changed != 'true' | |
run: npm run format:check | |
- name: Run formatting if check fails | |
if: failure() | |
run: npm run format:fix | |
- name: Check for type errors | |
if: steps.changed-files.outputs.only_changed != 'true' | |
run: npm run typecheck | |
- name: Check for linting errors in modified files | |
if: steps.changed-files.outputs.only_changed != 'true' | |
env: | |
CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} | |
run: npx eslint ${CHANGED_FILES} | |
- name: Check for TSDoc comments | |
run: npm run check-tsdoc # Run the TSDoc check script | |
- name: Check for localStorage Usage | |
run: | | |
chmod +x scripts/githooks/check-localstorage-usage.js | |
node scripts/githooks/check-localstorage-usage.js --scan-entire-repo | |
- name: Compare translation files | |
run: | | |
chmod +x .github/workflows/scripts/compare_translations.py | |
python .github/workflows/scripts/compare_translations.py --directory public/locales | |
- name: Check if the source and target branches are different | |
if: ${{ github.event.pull_request.base.ref == github.event.pull_request.head.ref }} | |
run: | | |
echo "Source Branch ${{ github.event.pull_request.head.ref }}" | |
echo "Target Branch ${{ github.event.pull_request.base.ref }}" | |
echo "Error: Source and Target Branches are the same. Please ensure they are different." | |
echo "Error: Close this PR and try again." | |
exit 1 | |
Check-Sensitive-Files: | |
if: ${{ github.actor != 'dependabot[bot]' && !contains(github.event.pull_request.labels.*.name, 'ignore-sensitive-files-pr') }} | |
name: Checks if sensitive files have been changed without authorization | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Get Changed Unauthorized files | |
id: changed-unauth-files | |
uses: tj-actions/changed-files@v45 | |
with: | |
files: | | |
.env* | |
vitest.config.js | |
src/App.tsx | |
.github/** | |
env.example | |
.node-version | |
.husky/** | |
scripts/** | |
src/style/** | |
schema.graphql | |
package.json | |
package-lock.json | |
tsconfig.json | |
.gitignore | |
.eslintrc.json | |
.eslintignore | |
.prettierrc | |
.prettierignore | |
vite.config.ts | |
docker-compose.yaml | |
Dockerfile | |
CODEOWNERS | |
LICENSE | |
setup.ts | |
.coderabbit.yaml | |
CODE_OF_CONDUCT.md | |
CODE_STYLE.md | |
CONTRIBUTING.md | |
DOCUMENTATION.md | |
INSTALLATION.md | |
ISSUE_GUIDELINES.md | |
PR_GUIDELINES.md | |
README.md | |
*.pem | |
*.key | |
*.cert | |
*.password | |
*.secret | |
*.credentials | |
.nojekyll | |
yarn.lock | |
docs/docusaurus.config.ts | |
docs/sidebar* | |
CNAME | |
- name: List all changed unauthorized files | |
if: steps.changed-unauth-files.outputs.any_changed == 'true' || steps.changed-unauth-files.outputs.any_deleted == 'true' | |
env: | |
CHANGED_UNAUTH_FILES: ${{ steps.changed-unauth-files.outputs.all_changed_files }} | |
run: | | |
for file in ${CHANGED_UNAUTH_FILES}; do | |
echo "$file is unauthorized to change/delete" | |
done | |
echo "To override this, apply the 'ignore-sensitive-files-pr' label" | |
exit 1 | |
Count-Changed-Files: | |
if: ${{ github.actor != 'dependabot[bot]' }} | |
name: Checks if number of files changed is acceptable | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Get changed files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
- name: Echo number of changed files | |
env: | |
CHANGED_FILES_COUNT: ${{ steps.changed-files.outputs.all_changed_files_count }} | |
run: | | |
echo "Number of files changed: $CHANGED_FILES_COUNT" | |
- name: Check if the number of changed files is less than 100 | |
if: steps.changed-files.outputs.all_changed_files_count > 100 | |
env: | |
CHANGED_FILES_COUNT: ${{ steps.changed-files.outputs.all_changed_files_count }} | |
run: | | |
echo "Error: Too many files (greater than 100) changed in the pull request." | |
echo "Possible issues:" | |
echo "- Contributor may be merging into an incorrect branch." | |
echo "- Source branch may be incorrect please use develop as source branch." | |
exit 1 | |
Check-ESlint-Disable: | |
name: Check for eslint-disable | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Get changed files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.9 | |
- name: Run Python script | |
run: | | |
python .github/workflows/scripts/eslint_disable_check.py --files ${{ steps.changed-files.outputs.all_changed_files }} | |
Check-Code-Coverage-Disable: | |
name: Check for code coverage disable | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Get changed files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.9 | |
- name: Run Python script | |
run: | | |
python .github/workflows/scripts/code_coverage_disable_check.py --files ${{ steps.changed-files.outputs.all_changed_files }} | |
Test-Application: | |
name: Test Application | |
runs-on: ubuntu-latest | |
needs: [Code-Quality-Checks, Check-ESlint-Disable,Check-Code-Coverage-Disable] | |
steps: | |
- name: Checkout the Repository | |
uses: actions/checkout@v4 | |
- name: Set up Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '22.x' | |
- name: Install Dependencies | |
run: npm install | |
- name: Get changed TypeScript files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
- name: Run Jest Tests | |
if: steps.changed-files.outputs.only_changed != 'true' | |
env: | |
NODE_V8_COVERAGE: './coverage/jest' | |
run: | | |
npm run test -- --watchAll=false --coverage | |
- name: Run Vitest Tests | |
if: steps.changed-files.outputs.only_changed != 'true' | |
env: | |
NODE_V8_COVERAGE: './coverage/vitest' | |
run: | | |
npm run test:vitest:coverage | |
- name: Merge Coverage Reports | |
if: steps.changed-files.outputs.only_changed != 'true' | |
run: | | |
mkdir -p coverage | |
if ! npx lcov-result-merger 'coverage/*/lcov.info' > 'coverage/lcov.info'; then | |
echo "Failed to merge coverage reports" | |
exit 1 | |
fi | |
- name: TypeScript compilation for changed files | |
run: | | |
for file in ${{ steps.changed-files.outputs.all_files }}; do | |
if [[ "$file" == *.ts || "$file" == *.tsx ]]; then | |
npx tsc --noEmit "$file" | |
fi | |
done | |
- name: Present and Upload coverage to Codecov as ${{env.CODECOV_UNIQUE_NAME}} | |
uses: codecov/codecov-action@v4 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
verbose: true | |
gcov_ignore: 'docs/' | |
fail_ci_if_error: false | |
files: './coverage/lcov.info' | |
name: '${{env.CODECOV_UNIQUE_NAME}}' | |
- name: Test acceptable level of code coverage | |
uses: VeryGoodOpenSource/very_good_coverage@v3 | |
with: | |
path: "./coverage/lcov.info" | |
min_coverage: 0.0 | |
# Graphql-Inspector: | |
# if: ${{ github.actor != 'dependabot[bot]' }} | |
# name: Runs Introspection on the GitHub talawa-api repo on the schema.graphql file | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Checkout the Repository | |
# uses: actions/checkout@v4 | |
# - name: Set up Node.js | |
# uses: actions/setup-node@v4 | |
# with: | |
# node-version: '22.x' | |
# - name: resolve dependency | |
# run: npm install -g @graphql-inspector/cli | |
# - name: Clone API Repository | |
# run: | | |
# # Retrieve the complete branch name directly from the GitHub context | |
# FULL_BRANCH_NAME=${{ github.base_ref }} | |
# echo "FULL_Branch_NAME: $FULL_BRANCH_NAME" | |
# # Clone the specified repository using the extracted branch name | |
# git clone --branch $FULL_BRANCH_NAME https://github.com/PalisadoesFoundation/talawa-api && ls -a | |
# - name: Validate Documents | |
# run: graphql-inspector validate './src/GraphQl/**/*.ts' './talawa-api/schema.graphql' | |
Start-App-Without-Docker: | |
name: Check if Talawa Admin app starts (No Docker) | |
runs-on: ubuntu-latest | |
needs: [Code-Quality-Checks, Test-Application] | |
if: github.actor != 'dependabot' | |
steps: | |
- name: Checkout the Repository | |
uses: actions/checkout@v4 | |
- name: Set up Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '20.x' | |
- name: Install Dependencies | |
run: npm install | |
- name: Build Production App | |
run: npm run build | |
- name: Start Production App | |
run: | | |
npm run preview & | |
echo $! > .pidfile_prod | |
- name: Check if Production App is running | |
run: | | |
chmod +x .github/workflows/scripts/app_health_check.sh | |
.github/workflows/scripts/app_health_check.sh 4173 120 | |
- name: Stop Production App | |
run: | | |
if [ -f .pidfile_prod ]; then | |
kill "$(cat .pidfile_prod)" | |
fi | |
- name: Start Development App | |
run: | | |
npm run serve & | |
echo $! > .pidfile_dev | |
- name: Check if Development App is running | |
run: | | |
chmod +x .github/workflows/scripts/app_health_check.sh | |
.github/workflows/scripts/app_health_check.sh 4321 120 | |
- name: Stop Development App | |
if: always() | |
run: | | |
if [ -f .pidfile_dev ]; then | |
kill "$(cat .pidfile_dev)" | |
fi | |
Docker-Start-Check: | |
name: Check if Talawa Admin app starts in Docker | |
runs-on: ubuntu-latest | |
needs: [Code-Quality-Checks, Test-Application] | |
if: github.actor != 'dependabot' | |
steps: | |
- name: Checkout the Repository | |
uses: actions/checkout@v4 | |
- name: Set up Docker | |
uses: docker/setup-buildx-action@v3 | |
with: | |
driver-opts: | | |
image=moby/buildkit:latest | |
- name: Build Docker image | |
run: | | |
set -e | |
echo "Building Docker image..." | |
docker build -t talawa-admin-app . | |
echo "Docker image built successfully" | |
- name: Run Docker Container | |
run: | | |
set -e | |
echo "Started Docker container..." | |
docker run -d --name talawa-admin-app-container -p 4321:4321 talawa-admin-app | |
echo "Docker container started successfully" | |
- name: Check if Talawa Admin App is running | |
run: | | |
chmod +x .github/workflows/scripts/app_health_check.sh | |
.github/workflows/scripts/app_health_check.sh 4321 120 true | |
- name: Stop Docker Container | |
if: always() | |
run: | | |
docker stop talawa-admin-app-container | |
docker rm talawa-admin-app-container | |
Test-Docusaurus-Deployment: | |
name: Test Deployment to https://docs-admin.talawa.io | |
runs-on: ubuntu-latest | |
needs: [Docker-Start-Check, Start-App-Without-Docker] | |
# Run only if the develop-postgres branch and not dependabot | |
if: ${{ github.actor != 'dependabot[bot]' && github.event.pull_request.base.ref == 'develop-postgres' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
cache: yarn | |
cache-dependency-path: 'docs/' | |
# Run Docusaurus in the ./docs directory | |
- name: Install dependencies | |
working-directory: ./docs | |
run: yarn install --frozen-lockfile | |
- name: Test building the website | |
working-directory: ./docs | |
run: yarn build | |
Check-Target-Branch: | |
if: ${{ github.actor != 'dependabot[bot]' }} | |
name: Check Target Branch | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check if the target branch is develop | |
if: github.event.pull_request.base.ref != 'develop-postgres' | |
run: | | |
echo "Error: Pull request target branch must be 'develop-postgres'. Please refer PR_GUIDELINES.md" | |
echo "Error: Close this PR and try again." | |
exit 1 | |
Validate-Coderabbit: | |
name: Validate CodeRabbit Approval | |
runs-on: ubuntu-latest | |
if: github.actor != 'dependabot[bot]' | |
needs: [Test-Docusaurus-Deployment] | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
- name: Validate CodeRabbit.ai Approval | |
run: | | |
chmod +x $GITHUB_WORKSPACE/.github/workflows/scripts/validate-coderabbit.sh | |
$GITHUB_WORKSPACE/.github/workflows/scripts/validate-coderabbit.sh | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
PR_NUMBER: ${{ github.event.pull_request.number }} | |
GITHUB_REPOSITORY: ${{ github.repository }} | |
Merge-Conflict-Check: | |
name: Check for Merge Conflicts | |
runs-on: ubuntu-latest | |
if: github.actor != 'dependabot[bot]' | |
needs: [Code-Quality-Checks] | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@v4 | |
- name: Check Mergeable Status via API | |
run: | | |
PR_NUMBER=${{ github.event.pull_request.number }} | |
max_retries=3 | |
retry_delay=5 | |
for ((i=1; i<=max_retries; i++)); do | |
echo "Attempt $i of $max_retries" | |
response=$(curl -s -f -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
"https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER") | |
if [ $? -ne 0 ]; then | |
echo "Failed to call GitHub API" | |
if [ $i -eq $max_retries ]; then | |
exit 1 | |
fi | |
sleep $retry_delay | |
continue | |
fi | |
mergeable=$(echo "$response" | jq -r '.mergeable') | |
if [ "$mergeable" == "true" ]; then | |
echo "No conflicts detected." | |
exit 0 | |
elif [ "$mergeable" == "false" ]; then | |
echo "Merge conflicts detected." | |
exit 1 | |
else | |
echo "Mergeable status unknown." | |
if [ $i -eq $max_retries ]; then | |
exit 1 | |
fi | |
sleep $retry_delay | |
fi | |
done | |
generate-docs: | |
name: Generate Auto Documentation | |
runs-on: ubuntu-latest | |
needs: [Code-Quality-Checks, Test-Application, Start-App-Without-Docker, Docker-Start-Check] | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
repository: ${{ github.event.pull_request.head.repo.full_name }} | |
ref: ${{ github.event.pull_request.head.ref }} | |
fetch-depth: 0 # Required for getting full git history | |
token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '22.x' | |
cache: 'npm' | |
- name: Install dependencies | |
run: | | |
npm ci | |
npm install -g typedoc typedoc-plugin-markdown | |
- name: Generate Documentation | |
run: | | |
# Generate the documentation | |
typedoc \ | |
--out docs/docs/auto-docs \ | |
--plugin typedoc-plugin-markdown \ | |
--theme markdown \ | |
--tsconfig tsconfig.json \ | |
--excludePrivate \ | |
--excludeProtected \ | |
--excludeExternals \ | |
--hideGenerator \ | |
--categorizeByGroup true \ | |
--entryPointStrategy expand \ | |
--entryPoints "src/**/*.ts" "src/**/*.tsx" \ | |
--exclude "**/*.{test,spec,stories}.{ts,tsx}" \ | |
--exclude "**/__tests__/**" \ | |
--exclude "**/__mocks__/**" \ | |
--exclude "**/node_modules/**" \ | |
--cleanOutputDir true | |
- name: Create placeholder documentation | |
run: | | |
# Create User Guide placeholder | |
echo "# User Guide | |
This section contains the user guide for Talawa Admin. | |
" > docs/docs/user-guide/intro.md | |
# Create Developer Guide placeholder | |
echo "# Developer Guide | |
This section contains the developer guide for Talawa Admin. | |
" > docs/docs/developer-guide/intro.md | |
# Create Reference placeholder | |
echo "# API Reference | |
This section contains the auto-generated API documentation for Talawa Admin. | |
" > docs/docs/developer-guide/reference/README.md | |
- name: Setup Git Config | |
run: | | |
git config user.name "GitHub Actions Bot" | |
git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
- name: Debug GitHub Variables | |
run: | | |
echo "GitHub REF: ${{ github.ref }}" | |
echo "GitHub HEAD REF: ${{ github.head_ref }}" | |
echo "GitHub BASE REF: ${{ github.base_ref }}" | |
echo "GitHub REF NAME: ${{ github.ref_name }}" | |
echo "GitHub EVENT NAME: ${{ github.event_name }}" | |
echo "Current branch:" | |
git branch --show-current | |
echo "All branches:" | |
git branch -a | |
echo "Git status:" | |
git status | |
- name: Check and Commit Documentation | |
env: | |
PR_BRANCH: ${{ github.event.pull_request.head.ref }} | |
PR_REPO: ${{ github.event.pull_request.head.repo.full_name }} | |
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} | |
run: | | |
set -e # Exit on error | |
git remote set-url origin "https://$GITHUB_TOKEN@github.com/$PR_REPO.git" | |
git fetch origin "$PR_BRANCH" | |
git checkout "$PR_BRANCH" | |
git add docs/docs/auto-docs/ | |
git add docs/docs/developer-guide/ | |
git add docs/docs/user-guide/ | |
if [[ -n "$(git status --porcelain)" ]]; then | |
git commit -m "docs: update auto-generated documentation [skip ci]" | |
if ! git push origin "HEAD:$PR_BRANCH"; then | |
echo "Failed to push changes" | |
exit 1 | |
fi | |
else | |
echo "No changes to commit" | |
fi |