Merge pull request #405 from Shopify/version-changelog #128
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: Generate distribution files for all locales | |
on: | |
workflow_dispatch: | |
push: | |
branches: | |
- main | |
concurrency: | |
group: "full_dist" | |
cancel-in-progress: true | |
permissions: | |
contents: write | |
pull-requests: write | |
jobs: | |
generate_locales: | |
if: github.repository_owner == 'Shopify' | |
runs-on: ubuntu-latest | |
outputs: | |
LOCALES: ${{ steps.retrieve_locales.outputs.locales }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Retrieve Locales | |
id: retrieve_locales | |
run: | | |
locales=$(ls data/localizations/categories/ | grep -Eo '^[a-z]{2,3}(-[A-Z]{2})?' | uniq | xargs) | |
locales_json=$(echo -n "["; for locale in $locales; do echo -n "\"$locale\","; done | sed 's/,$//'; echo -n "]") | |
echo "locales=$locales_json" >> $GITHUB_OUTPUT | |
generate_distribution_files: | |
needs: generate_locales | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
locale: ${{ fromJson(needs.generate_locales.outputs.LOCALES) }} | |
steps: | |
- uses: actions/checkout@v4 | |
# Setup dependencies | |
- uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- uses: cue-lang/setup-cue@v1.0.0 | |
with: | |
version: 'v0.7.0' | |
- name: Install b3sum | |
run: | | |
curl -L https://github.com/BLAKE3-team/BLAKE3/releases/download/1.5.3/b3sum_linux_x64_bin -o b3sum | |
chmod +x b3sum | |
sudo mv b3sum /usr/local/bin/ | |
# Generate distribution files | |
- name: Generate local-specific distribution files | |
run: VERBOSE=1 LOCALES=${{ matrix.locale }} make --file=Makefile build | |
# Create manifest and upload everything | |
- name: Create distribution manifest | |
run: | | |
target="dist/${{ matrix.locale }}" | |
manifest="${{ matrix.locale }}_manifest.b3" | |
manifest_sig="${manifest}.sig" | |
find "$target" -type f -print0 | sort -z | xargs -0 b3sum > "$manifest" | |
echo -n "${{ secrets.MANIFEST_KEY }}" | b3sum --keyed "$manifest" > "$manifest_sig" | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.locale }} | |
path: | | |
dist/${{ matrix.locale }}/ | |
${{ matrix.locale }}_manifest.b3 | |
${{ matrix.locale }}_manifest.b3.sig | |
create_pull_request: | |
needs: generate_distribution_files | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
path: . | |
merge-multiple: true | |
- name: Install b3sum | |
run: | | |
curl -L https://github.com/BLAKE3-team/BLAKE3/releases/download/1.5.3/b3sum_linux_x64_bin -o b3sum | |
chmod +x b3sum | |
sudo mv b3sum /usr/local/bin/ | |
- name: Verify file integrity | |
run: | | |
find dist -maxdepth 1 -mindepth 1 -type d | while read -r locale_path; do | |
locale=$(basename "$locale_path") | |
manifest="${locale}_manifest.b3" | |
manifest_sig="${manifest}.sig" | |
verify_sig="${locale}_verify.b3.sig" | |
echo -n "${{ secrets.MANIFEST_KEY }}" | b3sum --keyed "$manifest" > "$verify_sig" | |
echo "Vetting $manifest_sig with generated $verify_sig" | |
if ! (cmp -s "$manifest_sig" "$verify_sig"); then | |
echo "Error: Integrity failure for ${locale}. Invalid key used to generate ${verify_sig}." | |
exit 1 | |
fi | |
rm -f "$manifest_sig" "$verify_sig" | |
echo "Vetting $manifest" | |
if ! (b3sum --check "$manifest"); then | |
echo "Error: Integrity failure for ${locale}. Files are inconsistent with ${manifest}." | |
exit 1 | |
fi | |
rm -f "$manifest" | |
done | |
# Check for any remaining manifest files | |
unchecked_manifests=$(find . -maxdepth 1 -name '*_manifest.b3') | |
if [ -n "$unchecked_manifests" ]; then | |
echo "Error: Unchecked manifest files found:" | |
echo "$unchecked_manifests" | |
exit 1 | |
fi | |
- name: Set up short SHA | |
id: short_sha | |
run: echo "sha=$(git rev-parse --short ${{ github.sha }})" >> $GITHUB_OUTPUT | |
- name: Get last commit author username | |
id: last_committer | |
run: | | |
LAST_COMMIT_SHA=$(git log -1 --pretty=format:'%H') | |
API_URL="https://api.github.com/repos/${{ github.repository }}/commits/${LAST_COMMIT_SHA}" | |
AUTHOR_LOGIN=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" $API_URL | jq -r '.author.login') | |
echo "username=$AUTHOR_LOGIN" >> $GITHUB_OUTPUT | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Commit changes and create PR | |
uses: peter-evans/create-pull-request@v6 | |
with: | |
commit-message: "🤖 Update localization files for ${{ github.sha }}" | |
branch: "localization-dist" | |
title: "🤖 Update localization files" | |
body: | | |
Update `dist/` localization files. Triggered by ${{ steps.short_sha.outputs.sha }}. | |
cc @${{ steps.last_committer.outputs.username }} | |
labels: automated-pr, localization | |
reviewers: ${{ steps.last_committer.outputs.username }} |