mirror of https://github.com/grafana/grafana.git
159 lines
6.3 KiB
YAML
159 lines
6.3 KiB
YAML
name: Crowdin Download Action
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
schedule:
|
|
- cron: "0 0 * * *"
|
|
|
|
jobs:
|
|
download-sources-from-crowdin:
|
|
runs-on: ubuntu-latest
|
|
|
|
permissions:
|
|
contents: write # needed to commit changes into the PR
|
|
pull-requests: write # needed to update PR description, labels, etc
|
|
id-token: write # needed to get vault secrets
|
|
|
|
steps:
|
|
- name: Generate token
|
|
id: generate_token
|
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
|
with:
|
|
app_id: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_ID }}
|
|
private_key: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_PEM }}
|
|
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.head_ref }}
|
|
token: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Download sources
|
|
id: crowdin-download
|
|
uses: crowdin/github-action@v2
|
|
with:
|
|
upload_sources: false
|
|
upload_translations: false
|
|
download_sources: false
|
|
download_translations: true
|
|
export_only_approved: true
|
|
localization_branch_name: i18n_crowdin_translations
|
|
create_pull_request: true
|
|
pull_request_title: 'I18n: Download translations from Crowdin'
|
|
pull_request_body: |
|
|
:robot: Automatic download of translations from Crowdin.
|
|
|
|
This runs once per day and will merge automatically if all the required checks pass.
|
|
|
|
If there's a conflict, close the pull request and **delete the branch**.
|
|
You can then either wait for the schedule to trigger a new PR, or rerun the action manually.
|
|
pull_request_labels: 'area/frontend, area/internationalization, no-changelog, no-backport'
|
|
pull_request_base_branch_name: 'main'
|
|
base_url: 'https://grafana.api.crowdin.com'
|
|
config: 'crowdin.yml'
|
|
source: 'public/locales/en-US/grafana.json'
|
|
translation: 'public/locales/%locale%/%original_file_name%'
|
|
# Magic details of the github-actions bot user, to pass CLA checks
|
|
github_user_name: "github-actions[bot]"
|
|
github_user_email: "41898282+github-actions[bot]@users.noreply.github.com"
|
|
env:
|
|
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
|
|
|
- name: Get pull request ID
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
shell: bash
|
|
# Crowdin action returns us the URL of the pull request, but we need an ID for the GraphQL API
|
|
# that looks like 'PR_kwDOAOaWjc5mP_GU'
|
|
run: |
|
|
pr_id=$(gh pr view ${{ steps.crowdin-download.outputs.pull_request_url }} --json id -q .id)
|
|
echo "PULL_REQUEST_ID=$pr_id" >> "$GITHUB_ENV"
|
|
env:
|
|
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Get project board ID
|
|
uses: octokit/graphql-action@v2.x
|
|
id: get-project-id
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
with:
|
|
# Frontend Platform project - https://github.com/orgs/grafana/projects/78
|
|
org: grafana
|
|
project_number: 78
|
|
query: |
|
|
query getProjectId($org: String!, $project_number: Int!){
|
|
organization(login: $org) {
|
|
projectV2(number: $project_number) {
|
|
title
|
|
id
|
|
}
|
|
}
|
|
}
|
|
env:
|
|
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Add to project board
|
|
uses: octokit/graphql-action@v2.x
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
with:
|
|
projectid: ${{ fromJson(steps.get-project-id.outputs.data).organization.projectV2.id }}
|
|
prid: ${{ env.PULL_REQUEST_ID }}
|
|
query: |
|
|
mutation addPullRequestToProject($projectid: ID!, $prid: ID!){
|
|
addProjectV2ItemById(input: {projectId: $projectid, contentId: $prid}) {
|
|
item {
|
|
id
|
|
}
|
|
}
|
|
}
|
|
env:
|
|
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Run auto-milestone
|
|
uses: grafana/grafana-github-actions-go/auto-milestone@main
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
with:
|
|
pr: ${{ steps.crowdin-download.outputs.pull_request_number }}
|
|
token: ${{ steps.generate_token.outputs.token }}
|
|
|
|
- name: Get vault secrets
|
|
id: vault-secrets
|
|
uses: grafana/shared-workflows/actions/get-vault-secrets@main
|
|
with:
|
|
# Secrets placed in ci/repo/grafana/grafana/grafana-pr-approver
|
|
repo_secrets: |
|
|
GRAFANA_PR_APPROVER_APP_ID=grafana-pr-approver:app-id
|
|
GRAFANA_PR_APPROVER_APP_PEM=grafana-pr-approver:private-key
|
|
|
|
- name: Generate approver token
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
id: generate_approver_token
|
|
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
|
with:
|
|
app_id: ${{ env.GRAFANA_PR_APPROVER_APP_ID }}
|
|
private_key: ${{ env.GRAFANA_PR_APPROVER_APP_PEM }}
|
|
|
|
- name: Approve and automerge PR
|
|
if: steps.crowdin-download.outputs.pull_request_url
|
|
shell: bash
|
|
# Only approve if:
|
|
# - the PR does not modify files other than json files under the public/locales/ directory
|
|
# - the PR does not modify the en-US locale
|
|
run: |
|
|
filesChanged=$(gh pr diff --name-only ${{ steps.crowdin-download.outputs.pull_request_url }})
|
|
|
|
if [[ $(echo $filesChanged | grep -v 'public/locales/[a-zA-Z\-]*/grafana.json' | wc -l) -ne 0 ]]; then
|
|
echo "Non-i18n changes detected, not approving"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $(echo $filesChanged | grep "public/locales/en-US" | wc -l) -ne 0 ]]; then
|
|
echo "public/locales/en-US changes detected, not approving"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Approving and enabling automerge"
|
|
gh pr review ${{ steps.crowdin-download.outputs.pull_request_url }} --approve
|
|
gh pr merge --auto --squash ${{ steps.crowdin-download.outputs.pull_request_url }}
|
|
env:
|
|
GITHUB_TOKEN: ${{ steps.generate_approver_token.outputs.token }}
|