i18n-update-pull #260
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: i18n-update-pull | |
on: | |
issue_comment: | |
types: [created] | |
env: | |
LOKALISE_PROJECT_ID: ${{ vars.LOKALISE_PROJECT_ID }} | |
LOKALISE_API_TOKEN: ${{ secrets.LOKALISE_API_TOKEN }} | |
NODE_VERSION: 18.x | |
CI: true | |
jobs: | |
precheck: | |
name: Pre-check | |
runs-on: ubuntu-latest | |
if: github.event.issue.pull_request && github.event.issue.pull_request.merged_at && github.event.issue.state == 'closed' && github.event.comment.body == '.i18n-update-pull' && (github.event.comment.author_association == 'COLLABORATOR' || github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') | |
outputs: | |
skip: ${{ steps.fetch-pr.outputs.skip }} | |
skipReason: ${{ steps.fetch-pr.outputs.skipReason }} | |
newBranch: ${{ steps.fetch-pr.outputs.newBranch }} | |
branch: ${{ steps.fetch-pr.outputs.branch }} | |
steps: | |
- name: Generate Github Token for CI Bot | |
uses: actions/create-github-app-token@v1 | |
id: generate-token | |
with: | |
app-id: ${{ secrets.CI_APP_ID }} | |
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }} | |
- name: Check out repository | |
uses: actions/checkout@v4 | |
with: | |
token: ${{ steps.generate-token.outputs.token }} | |
- name: Fetch PR details | |
id: fetch-pr | |
run: | | |
PR_DETAILS=$(curl -s -H "Authorization: token $GITHUB_TOKEN" "${{ github.event.issue.pull_request.url }}") | |
PR_BRANCH=$(echo "$PR_DETAILS" | jq -r '.head.ref') | |
skip () { | |
echo "$1 Exiting..." | |
echo "skip=true" >> $GITHUB_OUTPUT | |
echo "skipReason=$1" >> $GITHUB_OUTPUT | |
} | |
if [[ $PR_BRANCH == "i18n/"* ]]; then | |
skip "Branch \`$PR_BRANCH\` is a i18n branch." | |
fi | |
PR_BRANCH=$(echo "$PR_DETAILS" | jq -r '.head.label' | sed 's/:/\//g') | |
NEW_BRANCH="i18n/$PR_BRANCH" | |
echo "newBranch=$NEW_BRANCH" >> $GITHUB_OUTPUT | |
echo "branch=$PR_BRANCH" >> $GITHUB_OUTPUT | |
git config --global user.name "livecodes-ci[bot]" | |
git config --global user.email "186997172+livecodes-ci[bot]@users.noreply.github.com" | |
if [[ ! $(git ls-remote --heads origin $NEW_BRANCH) ]]; then | |
skip "Branch \`$NEW_BRANCH\` does not exist." | |
fi | |
env: | |
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} | |
runner: | |
name: Runner | |
runs-on: ubuntu-latest | |
needs: precheck | |
if: needs.precheck.outputs.skip != 'true' | |
env: | |
NEW_BRANCH: ${{ needs.precheck.outputs.newBranch }} | |
PR_BRANCH: ${{ needs.precheck.outputs.branch }} | |
steps: | |
- name: Generate Github Token for CI Bot | |
uses: actions/create-github-app-token@v1 | |
id: generate-token | |
with: | |
app-id: ${{ secrets.CI_APP_ID }} | |
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }} | |
- name: Check out repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ needs.precheck.outputs.newBranch }} | |
token: ${{ steps.generate-token.outputs.token }} | |
- name: Setup Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ env.NODE_VERSION }} | |
cache: 'npm' | |
cache-dependency-path: '**/package-lock.json' | |
- name: Install dependencies | |
run: npm ci | |
- name: Import from Lokalise | |
run: | | |
mkdir -p $LOKALISE_TEMP && touch $LOKALISE_TEMP/locales.zip && npm run i18n-update-pull -- $PR_BRANCH && rm -rf $LOKALISE_TEMP | |
env: | |
LOKALISE_TEMP: lokalise_tmp | |
- name: Linting and fixing | |
run: npm run fix | |
- name: Commit changes | |
run: | | |
git config --global user.name "livecodes-ci[bot]" | |
git config --global user.email "186997172+livecodes-ci[bot]@users.noreply.github.com" | |
git add . | |
# Only commit if there are changes | |
git diff-index --quiet HEAD || git commit -m "i18n: pull translation from Lokalise" | |
# Save SHA of the latest commit to locale | |
echo "LAST_COMMIT_SHA=$(git log -n 1 --format="%H" -- src/livecodes/i18n/locales)" >> $GITHUB_ENV | |
- name: Push changes | |
run: git push origin $NEW_BRANCH | |
- name: Create a new i18n PR, comment on source PR and reaction | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ steps.generate-token.outputs.token }} | |
script: | | |
const repoURL = context.payload.repository.html_url; | |
const branchURL = `${repoURL}/tree/${process.env.NEW_BRANCH}`; | |
const prTitle = `i18n: ${{ github.event.issue.title }}`; | |
const prBody = `## What type of PR is this? (check all applicable) | |
- [ ] ✨ Feature | |
- [ ] 🐛 Bug Fix | |
- [ ] 📝 Documentation Update | |
- [ ] 🎨 Style | |
- [ ] ♻️ Code Refactor | |
- [ ] 🔥 Performance Improvements | |
- [ ] ✅ Test | |
- [ ] 🤖 Build | |
- [ ] 🔁 CI | |
- [ ] 📦 Chore (Release) | |
- [ ] ⏩ Revert | |
- [x] 🌐 Internationalization / Translation | |
## Description | |
### i18n Actions: \`.i18n-update-pull\` | |
Localization pulled from Lokalise. | |
| Name | Description | | |
| --- | --- | | |
| **i18n Branch** | [\`${process.env.NEW_BRANCH}\`](${branchURL}) | | |
| **Last Commit SHA** | ${process.env.LAST_COMMIT_SHA} | | |
## Related Tickets & Documents | |
- **Source PR**: #${{ github.event.issue.number }} | |
`; | |
const prInfo = await github.rest.pulls.create({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
title: prTitle, | |
body: prBody, | |
head: process.env.NEW_BRANCH, | |
base: '${{ github.event.repository.default_branch }}' | |
}); | |
const commentBody = `## i18n Actions: \`.i18n-update-pull\` | |
Localization pulled from Lokalise. | |
| Name | Description | | |
| --- | --- | | |
| **i18n Branch** | [\`${process.env.NEW_BRANCH}\`](${branchURL}) | | |
| **Last Commit SHA** | ${process.env.LAST_COMMIT_SHA} | | |
| **i18n PR** | #${prInfo.data.number} | | |
`; | |
github.rest.issues.createComment({ | |
issue_number: context.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: commentBody | |
}) | |
github.rest.reactions.createForIssueComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
comment_id: ${{ github.event.comment.id }}, | |
content: 'rocket' | |
}); | |
exception: | |
name: Exception | |
runs-on: ubuntu-latest | |
needs: precheck | |
if: needs.precheck.outputs.skip == 'true' | |
env: | |
SKIP_REASON: ${{ needs.precheck.outputs.skipReason }} | |
steps: | |
- name: Generate Github Token for CI Bot | |
uses: actions/create-github-app-token@v1 | |
id: generate-token | |
with: | |
app-id: ${{ secrets.CI_APP_ID }} | |
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }} | |
- name: Create reaction on PR | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ steps.generate-token.outputs.token }} | |
script: | | |
const runURL = `${context.payload.repository.html_url}/actions/runs/${process.env.GITHUB_RUN_ID}`; | |
const commentBody = `## i18n Actions: \`.i18n-update-pull\` | |
Failed to perform action due to following reason: **${process.env.SKIP_REASON}** | |
Please check [action logs](${runURL}) for more details. | |
`; | |
github.rest.issues.createComment({ | |
issue_number: context.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: commentBody | |
}) | |
github.rest.reactions.createForIssueComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
comment_id: ${{ github.event.comment.id }}, | |
content: 'confused' | |
}); |