mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-14 10:34:06 +02:00
c4874deb5d
Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.19.0 to 2.19.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/step-security/harden-runner/releases">step-security/harden-runner's releases</a>.</em></p> <blockquote> <h2>v2.19.1</h2> <h2>What's Changed</h2> <ul> <li>fix: detect ubuntu-slim runners early and bail out by <a href="https://github.com/devantler"><code>@devantler</code></a> in <a href="https://redirect.github.com/step-security/harden-runner/pull/657">step-security/harden-runner#657</a></li> </ul> <p>What the fix changes</p> <ul> <li>Harden-Runner will detect <code>ubuntu-slim</code> runners and exit cleanly with an informational log message, instead of post harden runner step failing on chown: invalid user: 'undefined'.</li> </ul> <p>What the fix does not do</p> <ul> <li>Jobs running on <code>ubuntu-slim</code> will not be monitored by Harden-Runner. The agent relies on kernel-level features (that require elevated capabilities).</li> <li>Per GitHub's docs on <a href="https://docs.github.com/en/actions/reference/runners/github-hosted-runners#single-cpu-runners">single-CPU runners</a>: "The container for ubuntu-slim runners runs in unprivileged mode. This means that some operations requiring elevated privileges such as mounting file systems, using Docker-in-Docker, or accessing low-level kernel features are not supported." Those low-level kernel features are what the agent needs, so monitoring inside the unprivileged container is not feasible today.</li> </ul> <p>For StepSecurity enterprise customers If your security posture requires that workflows are always monitored, you can block the use of <code>ubuntu-slim</code> via workflow run policies see the <a href="https://docs.stepsecurity.io/workflow-run-policies/policies#runner-label-policy">Runner Label Policy</a> docs. This lets you enforce that jobs only run on monitored runner types.</p> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/devantler"><code>@devantler</code></a> made their first contribution in <a href="https://redirect.github.com/step-security/harden-runner/pull/657">step-security/harden-runner#657</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/step-security/harden-runner/compare/v2.19.0...v2.19.1">https://github.com/step-security/harden-runner/compare/v2.19.0...v2.19.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/step-security/harden-runner/commit/a5ad31d6a139d249332a2605b85202e8c0b78450"><code>a5ad31d</code></a> Merge pull request <a href="https://redirect.github.com/step-security/harden-runner/issues/657">#657</a> from devantler/fix/ubuntu-slim-user-env</li> <li><a href="https://github.com/step-security/harden-runner/commit/6e928567d74554b8842dd434908da31c593ba85c"><code>6e92856</code></a> build dist and trim ubuntu-slim message</li> <li><a href="https://github.com/step-security/harden-runner/commit/4e0504ee086374bdec7064e5c26d48af41ba6209"><code>4e0504e</code></a> Merge branch 'main' into fix/ubuntu-slim-user-env</li> <li><a href="https://github.com/step-security/harden-runner/commit/376d25a97f3a1640ff8cbbddaa4af25948df2cf3"><code>376d25a</code></a> fix: detect ubuntu-slim runners early and bail out</li> <li>See full diff in <a href="https://github.com/step-security/harden-runner/compare/8d3c67de8e2fe68ef647c8db1e6a09f647780f40...a5ad31d6a139d249332a2605b85202e8c0b78450">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
299 lines
12 KiB
YAML
299 lines
12 KiB
YAML
name: Check TOML Translation Files on PR
|
|
|
|
# This workflow validates TOML translation files
|
|
|
|
on:
|
|
pull_request_target:
|
|
types: [opened, synchronize, reopened]
|
|
paths:
|
|
- "frontend/public/locales/*/translation.toml"
|
|
- ".github/scripts/check_language_toml.py"
|
|
- ".github/workflows/check_toml.yml"
|
|
|
|
# cancel in-progress jobs if a new job is triggered
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref_name || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read # Allow read access to repository content
|
|
|
|
jobs:
|
|
check-files:
|
|
if: github.event_name == 'pull_request_target'
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
issues: write # Allow posting comments on issues/PRs
|
|
pull-requests: write # Allow writing to pull requests
|
|
steps:
|
|
- name: Harden Runner
|
|
uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
|
|
with:
|
|
egress-policy: audit
|
|
|
|
- name: Checkout main branch first
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
- name: Setup GitHub App Bot
|
|
id: setup-bot
|
|
uses: ./.github/actions/setup-bot
|
|
with:
|
|
app-id: ${{ secrets.GH_APP_ID }}
|
|
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
|
|
|
|
- name: Get PR data
|
|
id: get-pr-data
|
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const prNumber = context.payload.pull_request.number;
|
|
const repoOwner = context.payload.repository.owner.login;
|
|
const repoName = context.payload.repository.name;
|
|
const branch = context.payload.pull_request.head.ref;
|
|
|
|
console.log(`PR Number: ${prNumber}`);
|
|
console.log(`Repo Owner: ${repoOwner}`);
|
|
console.log(`Repo Name: ${repoName}`);
|
|
console.log(`Branch: ${branch}`);
|
|
|
|
core.setOutput("pr_number", prNumber);
|
|
core.setOutput("repo_owner", repoOwner);
|
|
core.setOutput("repo_name", repoName);
|
|
core.setOutput("branch", branch);
|
|
continue-on-error: true
|
|
|
|
- name: Fetch PR changed files
|
|
id: fetch-pr-changes
|
|
env:
|
|
GH_TOKEN: ${{ steps.setup-bot.outputs.token }}
|
|
run: |
|
|
echo "Fetching PR changed files..."
|
|
echo "Getting list of changed files from PR..."
|
|
# Check if PR number exists
|
|
if [ -z "${{ steps.get-pr-data.outputs.pr_number }}" ]; then
|
|
echo "Error: PR number is empty"
|
|
exit 1
|
|
fi
|
|
# Get changed files and filter for TOML translation files
|
|
gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^frontend/public/locales/[a-zA-Z-]+/translation\.toml$' > changed_files.txt || echo "No matching TOML files found in PR"
|
|
# Check if any files were found
|
|
if [ ! -s changed_files.txt ]; then
|
|
echo "No TOML translation files changed in this PR"
|
|
echo "Workflow will exit early as no relevant files to check"
|
|
exit 0
|
|
fi
|
|
echo "Found $(wc -l < changed_files.txt) matching TOML files"
|
|
|
|
- name: Determine reference file
|
|
id: determine-file
|
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const prNumber = ${{ steps.get-pr-data.outputs.pr_number }};
|
|
const repoOwner = "${{ steps.get-pr-data.outputs.repo_owner }}";
|
|
const repoName = "${{ steps.get-pr-data.outputs.repo_name }}";
|
|
|
|
const prRepoOwner = "${{ github.event.pull_request.head.repo.owner.login }}";
|
|
const prRepoName = "${{ github.event.pull_request.head.repo.name }}";
|
|
const branch = "${{ steps.get-pr-data.outputs.branch }}";
|
|
|
|
console.log(`Determining reference file for PR #${prNumber}`);
|
|
|
|
// Validate inputs
|
|
const validateInput = (input, regex, name) => {
|
|
if (!regex.test(input)) {
|
|
throw new Error(`Invalid ${name}: ${input}`);
|
|
}
|
|
};
|
|
|
|
validateInput(repoOwner, /^[a-zA-Z0-9_-]+$/, "repository owner");
|
|
validateInput(repoName, /^[a-zA-Z0-9._-]+$/, "repository name");
|
|
validateInput(branch, /^[a-zA-Z0-9._/-]+$/, "branch name");
|
|
|
|
// Get the list of changed files in the PR
|
|
const { data: files } = await github.rest.pulls.listFiles({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
pull_number: prNumber,
|
|
});
|
|
|
|
// Filter for relevant TOML files based on the PR changes
|
|
const changedFiles = files
|
|
.filter(file =>
|
|
file.status !== "removed" &&
|
|
/^frontend\/public\/locales\/[a-zA-Z-]+\/translation\.toml$/.test(file.filename)
|
|
)
|
|
.map(file => file.filename);
|
|
|
|
console.log("Changed files:", changedFiles);
|
|
|
|
// Create a temporary directory for PR files
|
|
const tempDir = "pr-branch";
|
|
if (!fs.existsSync(tempDir)) {
|
|
fs.mkdirSync(tempDir, { recursive: true });
|
|
}
|
|
|
|
// Download and save each changed file
|
|
for (const file of changedFiles) {
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: prRepoOwner,
|
|
repo: prRepoName,
|
|
path: file,
|
|
ref: branch,
|
|
});
|
|
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
const filePath = path.join(tempDir, file);
|
|
const dirPath = path.dirname(filePath);
|
|
|
|
if (!fs.existsSync(dirPath)) {
|
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
}
|
|
|
|
fs.writeFileSync(filePath, content);
|
|
console.log(`Saved file: ${filePath}`);
|
|
}
|
|
|
|
// Output the list of changed files for further processing
|
|
const fileList = changedFiles.join(" ");
|
|
core.exportVariable("FILES_LIST", fileList);
|
|
console.log("Files saved and listed in FILES_LIST.");
|
|
|
|
// Determine reference file
|
|
let referenceFilePath;
|
|
if (changedFiles.includes("frontend/public/locales/en-GB/translation.toml")) {
|
|
console.log("Using PR branch reference file.");
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: prRepoOwner,
|
|
repo: prRepoName,
|
|
path: "frontend/public/locales/en-GB/translation.toml",
|
|
ref: branch,
|
|
});
|
|
|
|
referenceFilePath = "pr-branch-translation-en-GB.toml";
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
fs.writeFileSync(referenceFilePath, content);
|
|
} else {
|
|
console.log("Using main branch reference file.");
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
path: "frontend/public/locales/en-GB/translation.toml",
|
|
ref: "main",
|
|
});
|
|
|
|
referenceFilePath = "main-branch-translation-en-GB.toml";
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
fs.writeFileSync(referenceFilePath, content);
|
|
}
|
|
|
|
console.log(`Reference file path: ${referenceFilePath}`);
|
|
core.exportVariable("REFERENCE_FILE", referenceFilePath);
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install Python dependencies
|
|
run: |
|
|
pip install --require-hashes --only-binary=:all: -r ./.github/scripts/requirements_sync_readme.txt
|
|
|
|
- name: Run Python script to check files
|
|
id: run-check
|
|
run: |
|
|
echo "Running Python script to check TOML files..."
|
|
python .github/scripts/check_language_toml.py \
|
|
--actor ${{ github.event.pull_request.user.login }} \
|
|
--reference-file "${REFERENCE_FILE}" \
|
|
--branch "pr-branch" \
|
|
--files "${FILES_LIST[@]}" > result.txt
|
|
continue-on-error: true # Continue the job even if this step fails
|
|
|
|
- name: Capture output
|
|
id: capture-output
|
|
run: |
|
|
if [ -f result.txt ] && [ -s result.txt ]; then
|
|
echo "Capturing output..."
|
|
SCRIPT_OUTPUT=$(cat result.txt)
|
|
echo "SCRIPT_OUTPUT<<EOF" >> $GITHUB_ENV
|
|
echo "$SCRIPT_OUTPUT" >> $GITHUB_ENV
|
|
echo "EOF" >> $GITHUB_ENV
|
|
echo "${SCRIPT_OUTPUT}"
|
|
|
|
# Determine job failure based on script output
|
|
if [[ "$SCRIPT_OUTPUT" == *"❌"* ]]; then
|
|
echo "FAIL_JOB=true" >> $GITHUB_ENV
|
|
else
|
|
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
|
fi
|
|
else
|
|
echo "No output found."
|
|
echo "SCRIPT_OUTPUT=" >> $GITHUB_ENV
|
|
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
|
fi
|
|
|
|
- name: Post comment on PR
|
|
if: env.SCRIPT_OUTPUT != ''
|
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const { GITHUB_REPOSITORY, SCRIPT_OUTPUT } = process.env;
|
|
const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/');
|
|
const issueNumber = context.issue.number;
|
|
|
|
// Find existing comment
|
|
const comments = await github.rest.issues.listComments({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
issue_number: issueNumber
|
|
});
|
|
|
|
const comment = comments.data.find(c => c.body.includes("## 🌐 TOML Translation Verification Summary"));
|
|
|
|
// Only update or create comments by the action user
|
|
const expectedActor = "${{ steps.setup-bot.outputs.app-slug }}[bot]";
|
|
|
|
if (comment && comment.user.login === expectedActor) {
|
|
// Update existing comment
|
|
await github.rest.issues.updateComment({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
comment_id: comment.id,
|
|
body: `## 🌐 TOML Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
|
});
|
|
console.log("Updated existing comment.");
|
|
} else if (!comment) {
|
|
// Create new comment if no existing comment is found
|
|
await github.rest.issues.createComment({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
issue_number: issueNumber,
|
|
body: `## 🌐 TOML Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
|
});
|
|
console.log("Created new comment.");
|
|
} else {
|
|
console.log("Comment update attempt denied. Actor does not match.");
|
|
}
|
|
|
|
- name: Fail job if errors found
|
|
if: env.FAIL_JOB == 'true'
|
|
run: |
|
|
echo "Failing the job because errors were detected."
|
|
exit 1
|
|
|
|
- name: Cleanup temporary files
|
|
if: always()
|
|
run: |
|
|
echo "Cleaning up temporary files..."
|
|
rm -rf pr-branch
|
|
rm -f pr-branch-translation-en-GB.toml main-branch-translation-en-GB.toml changed_files.txt result.txt
|
|
echo "Cleanup complete."
|
|
continue-on-error: true # Ensure cleanup runs even if previous steps fail
|