name: Create translation Batch Pull Request (Microsoft) # **What it does**: # - Creates one pull request per language after running a series of automated checks, # removing translations that are broken in any known way # **Why we have it**: # - To deploy translations # **Who does it impact**: It automates what would otherwise be manual work, # helping docs engineering focus on higher value work on: workflow_dispatch: schedule: - cron: '02 17 * * *' # Once a day at 17:02 UTC / 9:02 PST permissions: contents: write jobs: create-translation-batch: name: Create translation batch if: github.repository == 'github/docs-internal' runs-on: ubuntu-latest # A sync's average run time is ~3.2 hours. # This sets a maximum execution time of 300 minutes (5 hours) to prevent the workflow from running longer than necessary. timeout-minutes: 300 strategy: fail-fast: false max-parallel: 1 matrix: include: - language: es language_dir: translations/es-ES language_repo: github/docs-internal.es-es - language: ja language_dir: translations/ja-JP language_repo: github/docs-internal.ja-jp - language: pt language_dir: translations/pt-BR language_repo: github/docs-internal.pt-br - language: cn language_dir: translations/zh-CN language_repo: github/docs-internal.zh-cn # We'll be ready to add the following languages in a future effort. # - language: ru # language_dir: translations/ru-RU # language_repo: github/docs-internal.ru-ru # - language: ko # language_dir: translations/ko-KR # language_repo: github/docs-internal.ko-kr # - language: fr # language_dir: translations/fr-FR # language_repo: github/docs-internal.fr-fr # - language: de # language_dir: translations/de-DE # language_repo: github/docs-internal.de-de steps: - name: Set branch name id: set-branch run: | echo "::set-output name=BRANCH_NAME::msft-translation-batch-${{ matrix.language }}-$(date +%Y-%m-%d__%H-%M)" - run: git config --global user.name "docubot" - run: git config --global user.email "67483024+docubot@users.noreply.github.com" - name: Checkout the docs-internal repo uses: actions/checkout@dcd71f646680f2efd8db4afa5ad64fdcba30e748 with: fetch-depth: 0 lfs: true - name: Create a branch for the current language run: git checkout -b ${{ steps.set-branch.outputs.BRANCH_NAME }} - name: Remove unwanted git hooks run: rm .git/hooks/post-checkout - name: Remove all language translations run: | git rm -rf --quiet ${{ matrix.language_dir }}/content git rm -rf --quiet ${{ matrix.language_dir }}/data - name: Checkout the language-specific repo uses: actions/checkout@dcd71f646680f2efd8db4afa5ad64fdcba30e748 with: repository: ${{ matrix.language_repo }} token: ${{ secrets.DOCUBOT_READORG_REPO_WORKFLOW_SCOPES }} path: ${{ matrix.language_dir }} - name: Remove .git from the language-specific repo run: rm -rf ${{ matrix.language_dir }}/.git - name: Commit translated files run: | git add ${{ matrix.language_dir }} git commit -m "Add translations" || echo "Nothing to commit" - name: 'Setup node' uses: actions/setup-node@17f8bd926464a1afa4c6a11669539e9c1ba77048 with: node-version: '16.15.0' - run: npm ci - name: Homogenize frontmatter run: | node script/i18n/homogenize-frontmatter.js git add ${{ matrix.language_dir }} && git commit -m "Run script/i18n/homogenize-frontmatter.js" || echo "Nothing to commit" - name: Fix translation errors run: | node script/i18n/fix-translation-errors.js git add ${{ matrix.language_dir }} && git commit -m "Run script/i18n/fix-translation-errors.js" || echo "Nothing to commit" - name: Check rendering run: | node script/i18n/lint-translation-files.js --check rendering | tee -a /tmp/batch.log | cat git add ${{ matrix.language_dir }} && git commit -m "Run script/i18n/lint-translation-files.js --check rendering" || echo "Nothing to commit" - name: Reset files with broken liquid tags run: | node script/i18n/msft-reset-files-with-broken-liquid-tags.js --language=${{ matrix.language }} | tee -a /tmp/batch.log | cat git add ${{ matrix.language_dir }} && git commit -m "run script/i18n/msft-reset-files-with-broken-liquid-tags.js --language=${{ matrix.language }}" || echo "Nothing to commit" - name: Check in CSV report run: | mkdir -p translations/log csvFile=translations/log/msft-${{ matrix.language }}-resets.csv script/i18n/msft-report-reset-files.js --report-type=csv --language=${{ matrix.language }} --log-file=/tmp/batch.log > $csvFile git add -f $csvFile && git commit -m "Check in ${{ matrix.language }} CSV report" || echo "Nothing to commit" - name: Write the reported files that were reset to /tmp/pr-body.txt run: script/i18n/msft-report-reset-files.js --report-type=pull-request-body --language=${{ matrix.language }} --log-file=/tmp/batch.log --csv-path=${{ steps.set-branch.outputs.BRANCH_NAME }}/translations/log/msft-${{ matrix.language }}-resets.csv > /tmp/pr-body.txt - name: Push filtered translations run: git push origin ${{ steps.set-branch.outputs.BRANCH_NAME }} - name: Close existing stale batches uses: lee-dohm/close-matching-issues@e9e43aad2fa6f06a058cedfd8fb975fd93b56d8f with: token: ${{ secrets.OCTOMERGER_PAT_WITH_REPO_AND_WORKFLOW_SCOPE }} query: 'type:pr label:translation-batch-${{ matrix.language }}' - name: Create translation batch pull request env: GITHUB_TOKEN: ${{ secrets.DOCUBOT_REPO_PAT }} TITLE: 'New translation batch for ${{ matrix.language }}' BASE: 'main' HEAD: ${{ steps.set-branch.outputs.BRANCH_NAME }} LANGUAGE: ${{ matrix.language }} BODY_FILE: '/tmp/pr-body.txt' run: .github/actions-scripts/msft-create-translation-batch-pr.js - name: Approve PR if: github.ref_name == 'main' env: GITHUB_TOKEN: ${{ secrets.OCTOMERGER_PAT_WITH_REPO_AND_WORKFLOW_SCOPE }} run: gh pr review --approve || echo "Nothing to approve" - name: Set auto-merge if: github.ref_name == 'main' env: GITHUB_TOKEN: ${{ secrets.OCTOMERGER_PAT_WITH_REPO_AND_WORKFLOW_SCOPE }} run: gh pr merge ${{ steps.set-branch.outputs.BRANCH_NAME }} --auto --squash || echo "Nothing to merge" # When the maximum execution time is reached for this job, Actions cancels the workflow run. # This emits a notification for the first responder to triage. - name: Send Slack notification if workflow is cancelled uses: someimportantcompany/github-actions-slack-message@f8d28715e7b8a4717047d23f48c39827cacad340 if: cancelled() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }}🎉 color: failure text: 'The new translation batch for ${{ matrix.language }} was cancelled.' # Emit a notification for the first responder to triage if the workflow failed. - name: Send Slack notification if workflow failed uses: someimportantcompany/github-actions-slack-message@f8d28715e7b8a4717047d23f48c39827cacad340 if: failure() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: 'The new translation batch for ${{ matrix.language }} failed.'