diff --git a/.github/workflows/license-checker.yml b/.github/workflows/license-checker.yml new file mode 100644 index 00000000..e0adffac --- /dev/null +++ b/.github/workflows/license-checker.yml @@ -0,0 +1,102 @@ + +# + +name: Check SPDX Licenses + +on: + workflow_dispatch: + workflow_call: + pull_request: + branches: + - "main" + - "staging" + types: + - opened + - reopened + - synchronize + - assigned + - review_requested + +jobs: + check-spdx-licenses: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5.0.0 + with: + cache: "pip" + python-version: "3.8" + - name: Install copyright check tool + run: pip install git+https://github.com/espressif/check-copyright.git@master + - name: Check SPDX licenses + id: check_spdx_licenses + run: | + set +e + output=$(python -m check_copyright --verbose --dry-run --config ./check_copyright_config.yaml . 2>&1) + exit_code=$? + clean_output=$(echo "$output" | sed 's/\x1b\[[0-9;]*m//g') + echo "CLEAN_OUTPUT<> $GITHUB_ENV + echo "$clean_output" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "EXIT_CODE=$exit_code" >> $GITHUB_ENV + exit 0 + - name: Debug Extracted Files + run: | + echo "Extracted Files:" + echo "$CLEAN_OUTPUT" + - name: Extract Files + id: extract_files + run: | + set +e + files=$(echo "$CLEAN_OUTPUT" | awk ' + /Files which failed the copyright check:/, /Additional information about this hook and copyright headers may be found here:/ { + if ($0 !~ /Files which failed the copyright check:/ && $0 !~ /Additional information about this hook and copyright headers may be found here:/) print + } + /Some files are without a copyright note and a license header needs to be added:/, /Additional information about this hook and copyright headers may be found here:/ { + if ($0 !~ /Some files are without a copyright note and a license header needs to be added:/ && $0 !~ /Additional information about this hook and copyright headers may be found here:/) print + }' | sed 's/^ *//' | sed '/^$/d' | grep '^.') + echo "FILES<> $GITHUB_ENV + echo "$files" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "Extracted Files: $files" + exit 0 + - name: Debug Extracted Files + run: | + echo "Extracted Files:" + echo "$FILES" + - name: Extract File Paths + if: env.FILES != '' + run: | + # Extract lines starting with './' but ignore any paths following "Modified files:" until a stop marker + files_clean=$(echo "$FILES" | awk '/^Modified files:/ {ignore = 1} /^Above is a list of files/ {ignore = 0} !ignore && /^\.\// {print}' | sort | uniq) + # Save the cleaned files into a new environment variable 'FILES_CLEAN' + echo "FILES_CLEAN<> $GITHUB_ENV + echo "$files_clean" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "Extracted Paths: $files_clean" + - name: Debug Extracted Paths + run: | + echo "Extracted Paths:" + echo "$FILES_CLEAN" + echo "---------------------------------" + - name: Comment on PR or Issue + if: env.FILES_CLEAN != '' + uses: actions/github-script@v7 + with: + script: | + const formattedOutput = process.env.FILES_CLEAN; + const issueNumber = context.issue.number || context.payload.pull_request.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + if (formattedOutput) { + const commentBody = `Our automated SPDX license verification process has discovered that the following files are missing a license header:\n\`\`\`\n${formattedOutput}\n\`\`\`\nPlease ensure each indicated file includes a valid SPDX license identifier. This is essential for maintaining licensing compliance. Your attention and cooperation in updating these files are greatly appreciated. Thank you.`; + await github.rest.issues.createComment({ + issue_number: issueNumber, + owner: owner, + repo: repo, + body: commentBody + }); + core.setFailed("SPDX license issues found."); + } else { + console.log("No SPDX license issues found."); + } \ No newline at end of file diff --git a/.github/workflows/lint-and-license-check.yml b/.github/workflows/lint-and-license-check.yml new file mode 100644 index 00000000..1de5fa5f --- /dev/null +++ b/.github/workflows/lint-and-license-check.yml @@ -0,0 +1,115 @@ +# + +name: Lint and License Check + +on: + push: + branches: + - main + pull_request: + branches: + - "main" + - "staging" + types: + - opened + - reopened + - synchronize + - assigned + - review_requested + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '16' + + - name: Install dependencies + working-directory: app/frontend # Adjust path according to your repo structure + run: npm install + + - name: Run ESLint and Capture Output + working-directory: app/frontend + id: run_eslint + run: | + set +e + output=$(npm run lint --silent 2>&1) + exit_code=$? + echo "$output" + clean_output=$(echo "$output" | sed 's/\x1b\[[0-9;]*m//g') # Remove ANSI escape codes + echo "CLEAN_OUTPUT<> $GITHUB_ENV + echo "$clean_output" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + # Process output to group errors under file paths with separators + grouped_errors="" + current_file="" + errors_for_file="" + has_errors=false + + while IFS= read -r line; do + if echo "$line" | grep -q '^\s*\/'; then + # Detected a file path line, add to grouped_errors if it contains errors + if [ "$has_errors" = true ]; then + grouped_errors+="$current_file\n$errors_for_file\n---\n" + errors_for_file="" # Reset error collection for next file + has_errors=false # Reset error flag for the next file + fi + current_file="$line" + elif echo "$line" | grep -q 'error'; then + # Detected an error line, associate with the current file + errors_for_file+=" $line\n" + has_errors=true # Mark that this file has errors + fi + done <<< "$clean_output" + + # Add any remaining errors after the loop + if [ "$has_errors" = true ]; then + grouped_errors+="$current_file\n$errors_for_file\n" + fi + + # Store grouped errors in environment variable + if [ -n "$grouped_errors" ]; then + echo "Errors found." + echo "GROUPED_ERRORS<> $GITHUB_ENV + echo -e "$grouped_errors" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "HAS_ERRORS=true" >> $GITHUB_ENV + else + echo "No relevant errors found." + echo "HAS_ERRORS=false" >> $GITHUB_ENV + fi + + exit 0 # Always exit with 0 to avoid failing the step + + - name: Comment on PR with ESLint Errors + if: env.HAS_ERRORS == 'true' + uses: actions/github-script@v7 + with: + script: | + const lintErrors = process.env.GROUPED_ERRORS; + const issueNumber = context.payload.pull_request.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + + if (lintErrors && issueNumber) { + const commentBody = `## Frontend Project: ESLint Errors\n\`\`\`\n${lintErrors}\n\`\`\`\nPlease review and resolve the ESLint errors.`; + await github.rest.issues.createComment({ + issue_number: issueNumber, + owner: owner, + repo: repo, + body: commentBody + }); + } else { + console.log("No relevant errors to report."); + } + + - name: Fail if Errors Exist + if: env.HAS_ERRORS == 'true' + run: exit 1 # Fail the workflow if errors exist