Files
molecule-ai-workspace-templ…/.gitea/workflows/secret-scan.yml
T
hongming 8c09e80dea
CI / Template validation (static) (push) Successful in 12s
CI / Template validation (static) (pull_request) Successful in 14s
Secret scan / secret-scan (pull_request) Successful in 15s
verify-providers-projection / Regenerate projection, fail on drift, assert registry ⊆ template (pull_request) Successful in 17s
CI / Adapter unit tests (pull_request) Successful in 47s
CI / Adapter unit tests (push) Successful in 47s
CI / Template validation (runtime) (push) Successful in 2m20s
CI / Template validation (runtime) (pull_request) Successful in 2m23s
CI / T4 tier-4 conformance (live) (push) Successful in 2m21s
CI / T4 tier-4 conformance (live) (pull_request) Successful in 2m23s
CI / validate (push) Successful in 2s
CI / validate (pull_request) Successful in 2s
fix(ci): add concurrency cancel-in-progress to secret-scan.yml
2026-07-11 04:22:55 +00:00

93 lines
3.4 KiB
YAML

name: Secret scan
# Inline port of the secret scan workflow. The original referenced
# Molecule-AI/molecule-core/.github/workflows/secret-scan.yml@staging
# which hits the suspended GitHub org (2026-05-06) and fails in 1s.
# Inlined here so the check runs on Gitea directly without cross-repo uses:.
#
# Emits check context "Secret scan / secret-scan (pull_request)" which
# matches the required-check name in this repo's branch protection.
#
# Gitea 1.22.6 hostile-shape checklist applied:
# - No workflow_dispatch.inputs
# - No merge_group trigger
# - No cross-repo uses:
# - GITHUB_SERVER_URL pinned at workflow level
# - No on.push.paths: filter
# - timeout-minutes on every job
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
on:
pull_request:
types: [opened, synchronize, reopened]
push:
branches: [main, staging, master]
env:
GITHUB_SERVER_URL: https://git.moleculesai.app
permissions:
contents: read
jobs:
secret-scan:
name: secret-scan
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Scan for secrets
run: |
python3 - << 'PYEOF'
import os, re, sys
from pathlib import Path
PATTERNS = [
re.compile(r'''["']sk-ant-[a-zA-Z0-9]{50,}["']'''),
re.compile(r'''["']ghp_[a-zA-Z0-9]{36,}["']'''),
re.compile(r'''["']AKIA[A-Z0-9]{16}["']'''),
re.compile(r'''["'][a-zA-Z0-9/+=]{40}["']'''),
re.compile(r'''["']sk_test_[a-zA-Z0-9]{24,}["']'''),
re.compile(r'''["']Bearer\s+[a-zA-Z0-9_.-]{20,}["']'''),
re.compile(r'''ghp_[a-zA-Z0-9]{36,}'''),
re.compile(r'''sk-ant-[a-zA-Z0-9]{50,}'''),
]
SKIP_DIRS = {'.molecule-ci', '.molecule-ci-canonical', '.git', 'node_modules', '__pycache__'}
EXTENSIONS = {'.yaml', '.yml', '.md', '.py', '.sh'}
def is_false_positive(line):
ctx = line.lower()
return '...' in ctx or '<example' in ctx or '</example' in ctx
root = Path(os.environ.get('GITHUB_WORKSPACE', '.'))
warnings = []
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS]
for filename in filenames:
if Path(filename).suffix not in EXTENSIONS:
continue
filepath = Path(dirpath) / filename
try:
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
for lineno, line in enumerate(f.readlines(), 1):
for pattern in PATTERNS:
for match in pattern.finditer(line):
if not is_false_positive(line):
warnings.append(f" {filepath}:{lineno}: {match.group(0)[:40]}...")
except Exception:
pass
if warnings:
print("::error::Potential secret found in committed files:")
for w in warnings:
print(w)
sys.exit(1)
else:
print("::notice::No secrets detected")
PYEOF