feat: add schema validation for localization files #32782
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
name: "Lint PR" | |
on: | |
pull_request: | |
types: | |
- opened | |
- edited | |
- synchronize | |
schedule: | |
- cron: "0 8 * * *" | |
permissions: | |
contents: read | |
actions: read | |
pull-requests: write | |
jobs: | |
pr-title: | |
if: ${{ github.event_name == 'pull_request' }} | |
runs-on: ubuntu-latest | |
steps: | |
# Please look up the latest version from | |
# https://github.com/amannn/action-semantic-pull-request/releases | |
- uses: amannn/[email protected] | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- uses: actions/github-script@v6 | |
with: | |
script: | | |
const AZDO_TICKET_REGEX = 'https:\/\/(dev\.azure\.com\/msazure|msazure\.visualstudio\.com)\/Microsoft%20Teams%20Extensibility'; | |
const AZDO_TICKET_REGEX_WXP = 'https:\/\/office\.visualstudio\.com\/OC'; | |
const pullRequest = context.payload.pull_request; | |
if(pullRequest.title.startsWith("feat")) { | |
const body = pullRequest.body; | |
const match = body?.match(AZDO_TICKET_REGEX) || body?.match(AZDO_TICKET_REGEX_WXP); | |
if(!match) { | |
core.setFailed("Feat PR should contains AZDO tickets"); | |
} | |
} else if(pullRequest.title.startsWith("fix")) { | |
const body = pullRequest.body; | |
const match = body?.match(AZDO_TICKET_REGEX) || body?.match(AZDO_TICKET_REGEX_WXP); | |
if(!match && !body) { | |
core.setFailed("Fix PR should contains AZDO tickets or descrptions"); | |
} | |
} | |
check-format: | |
if: ${{ github.event_name == 'pull_request' }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout branch | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
ref: ${{ github.event.pull_request.head.ref }} | |
repository: ${{github.event.pull_request.head.repo.full_name}} | |
- name: setup project | |
uses: ./.github/actions/setup-project | |
- name: prettier check files in PR on Fork | |
if: ${{ github.event.pull_request.head.repo.full_name != 'OfficeDev/TeamsFx' }} | |
run: | | |
git remote add upstream https://github.com/OfficeDev/TeamsFx.git | |
git fetch upstream ${{ github.event.pull_request.base.ref }} | |
VAR=$(realpath .github/scripts/lint-pr.sh) | |
pnpm -r exec -- bash $VAR upstream/${{ github.event.pull_request.base.ref }} | |
- name: prettier check files in PR on local | |
if: ${{ github.event.pull_request.head.repo.full_name == 'OfficeDev/TeamsFx' }} | |
run: | | |
VAR=$(realpath .github/scripts/lint-pr.sh) | |
pnpm -r exec -- bash $VAR origin/${{ github.event.pull_request.base.ref }} | |
- name: Check if there are changes | |
id: changes | |
run: | | |
git add . | |
VAR=$(git diff --cached --name-only) | |
if [ ! -z "$VAR" ] | |
then | |
echo $VAR | |
echo '======================================= Prompt Information ===============================================' | |
echo 'There may be some unformatted files in your PR, please run these commands on Git Bash terminal: ' | |
echo '1. npm run setup' | |
echo '2. VAR=$(realpath .github/scripts/lint-pr.sh) ' | |
echo '3. pnpm -r exec -- bash $VAR ${your-PR-target-branch}' | |
echo 'please replace the ${your-PR-target-branch} as the target branch of your PR, such as origin/dev or upstream/dev' | |
exit 1 | |
fi | |
- name: Check unused strings | |
working-directory: ./packages/fx-core | |
run: npm run checkUnusedStrings | |
shell: bash | |
env: | |
CI: true | |
check-yaml-lint: | |
if: ${{ github.event_name == 'pull_request' }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout branch | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
ref: ${{ github.event.pull_request.head.ref }} | |
repository: ${{github.event.pull_request.head.repo.full_name}} | |
- name: Install Yaml lint and mustache | |
run: | | |
pip install yamllint | |
npm install mustache -g | |
echo "{}" > test.json | |
- name: check origin or remote | |
id: remote | |
run: | | |
if [ ${{ github.event.pull_request.head.repo.full_name == 'OfficeDev/TeamsFx' }} ] | |
then | |
echo "target=origin" >> $GITHUB_OUTPUT | |
else | |
echo "target=remote" >> $GITHUB_OUTPUT | |
fi | |
- name: check yaml lint origin | |
run: | | |
TRAGET=${{steps.remote.outputs.target}}/${{ github.event.pull_request.base.ref }} | |
YMLTPL=$(git diff --diff-filter=MARC $TRAGET...HEAD --name-only -- templates | grep -E '.yml.tpl$'|xargs) | |
echo $YMLTPL | |
if [ ! -z "$YMLTPL" ] | |
then | |
for obj in "$YMLTPL" | |
do | |
mustache test.json $obj | yamllint -d "{extends: relaxed, rules: {line-length: {max: 100}}}" - | |
done | |
fi | |
check-sensitive-content: | |
if: ${{ github.event_name == 'pull_request' || github.event_name == 'schedule' }} | |
runs-on: ubuntu-latest | |
steps: | |
- shell: bash | |
if: ${{ github.event_name == 'pull_request'}} | |
run: | | |
if [ "${{ github.event_name }}" == "push" ]; then | |
echo "depth=$(($(jq length <<< '${{ toJson(github.event.commits) }}') + 1))" >> $GITHUB_ENV | |
echo "branch=${{ github.ref_name }}" >> $GITHUB_ENV | |
fi | |
if [ "${{ github.event_name }}" == "pull_request" ]; then | |
echo "depth=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_ENV | |
echo "branch=${{ github.event.pull_request.head.ref }}" >> $GITHUB_ENV | |
fi | |
- uses: actions/checkout@v4 | |
if: ${{ github.event_name == 'pull_request'}} | |
with: | |
ref: ${{env.branch}} | |
repository: ${{github.event.pull_request.head.repo.full_name}} | |
fetch-depth: ${{env.depth}} | |
- uses: trufflesecurity/trufflehog@main | |
if: ${{ github.event_name == 'pull_request'}} | |
with: | |
extra_args: --only-verified | |
- if: ${{ github.event_name == 'schedule' }} | |
uses: actions/checkout@v4 | |
- if: ${{ github.event_name == 'schedule' }} | |
uses: trufflesecurity/trufflehog@main | |
with: | |
base: "" | |
head: ${{ github.ref_name }} | |
extra_args: --only-verified | |
attension-on-version: | |
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'main' && github.event.action != 'edited' }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: checkout branch | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
token: ${{ secrets.GITHUB_TOKEN }} | |
ref: ${{ github.event.pull_request.head.ref }} | |
- name: Get branch name | |
id: branch-name | |
uses: tj-actions/branch-names@v7 | |
- name: check origin or remote | |
id: remote | |
run: | | |
if [ ${{ github.event.pull_request.head.repo.full_name == 'OfficeDev/TeamsFx' }} ] | |
then | |
echo "target=origin" >> $GITHUB_OUTPUT | |
else | |
echo "target=remote" >> $GITHUB_OUTPUT | |
fi | |
- name: check feature history | |
id: description | |
shell: "/bin/bash {0}" | |
run: | | |
head=${{steps.remote.outputs.target}}/${{ github.event.pull_request.base.ref }} | |
echo $head | |
history_cli_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/cli | grep "^feat") | |
echo $history_cli_feat | |
history_toolkit_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/vscode-extension | grep "^feat") | |
echo $history_toolkit_feat | |
history_core_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/fx-core | grep "^feat") | |
echo $history_core_feat | |
history_sdk_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/sdk | grep "^feat") | |
echo $history_sdk_feat | |
history_sdk_react_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/sdk-react | grep "^feat") | |
echo $history_sdk_react_feat | |
history_dotnet_sdk_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/dotnet-sdk | grep "^feat") | |
echo $history_dotnet_sdk_feat | |
echo -e '\nFx-core feat commits:\n' "$history_core_feat" '\n\nCLI feat commits:\n' "$history_cli_feat" '\n\nExtension-toolkit feat commits:\n' "$history_toolkit_feat" '\n\nSDK feat commits:\n' "$history_sdk_feat" '\n\nSDK React feat commits:\n' "$history_sdk_react_feat" '\n\n.Net SDK feat commits:\n' "$history_dotnet_sdk_feat" '\n'> feat_history.txt | |
history_cli_fix=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/cli | grep "^fix") | |
echo $history_cli_fix | |
history_toolkit_fix=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/vscode-extension | grep "^fix") | |
echo $history_toolkit_fix | |
history_core_fix=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/fx-core | grep "^fix") | |
echo $history_core_fix | |
history_sdk_fix=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/sdk | grep "^fix") | |
echo $history_sdk_fix | |
history_sdk_react_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/sdk-react | grep "^fix") | |
echo $history_sdk_react_fix | |
history_dotnet_sdk_feat=$(git log --pretty=format:"%s %h" $head...HEAD -- packages/dotnet-sdk | grep "^fix") | |
echo $history_dotnet_sdk_fix | |
echo -e '\nFx-core fix commits:\n' "$history_core_fix" '\n\nCLI fix commits:\n' "$history_cli_fix" '\n\nExtension-toolkit fix commits:\n' "$history_toolkit_fix" '\n\nSDK fix commits:\n' "$history_sdk_fix" '\n\nSDK React fix commits:\n' "$history_sdk_react_fix" '\n\n.Net SDK fix commits:\n' "$history_dotnet_sdk_fix" '\n'> fix_history.txt | |
- name: Setup node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 14 | |
- name: list history | |
if: ${{ github.event.pull_request.base.ref == 'main' }} | |
run: | | |
cat feat_history.txt > version_info.txt | |
cat fix_history.txt >> version_info.txt | |
- uses: JoseThen/[email protected] | |
with: | |
file_path: './version_info.txt' | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |