From e68ef7db2a53e830e156c9067a048071197397fa Mon Sep 17 00:00:00 2001 From: Aleksey Khoroshilov Date: Tue, 9 Jul 2024 21:27:59 +0700 Subject: [PATCH] Add PR seed upload workflow. --- .github/workflows/delete-test-seed.yml | 25 +++++ .github/workflows/generate-test-seed.yml | 103 ++++++++++++++++++ .github/workflows/scripts/comment.js | 32 ++++++ src/seed_tools/commands/create_seed.ts | 1 + .../AdBlockComponentUpdateIntervalStudy.json | 35 ++++++ 5 files changed, 196 insertions(+) create mode 100644 .github/workflows/delete-test-seed.yml create mode 100644 .github/workflows/generate-test-seed.yml create mode 100644 .github/workflows/scripts/comment.js create mode 100644 studies/AdBlockComponentUpdateIntervalStudy.json diff --git a/.github/workflows/delete-test-seed.yml b/.github/workflows/delete-test-seed.yml new file mode 100644 index 00000000..00a371c2 --- /dev/null +++ b/.github/workflows/delete-test-seed.yml @@ -0,0 +1,25 @@ +name: Delete Test Seed + +on: + pull_request: + types: [closed] + paths: + - 'studies/**' + +jobs: + build: + runs-on: ubuntu-latest + if: github.event.pull_request.merged == true + env: + REMOTE_SEED_PATH: 'pull/${{ github.event.pull_request.number }}/seed' + + steps: + - name: Delete seed + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PRODUCTION_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PRODUCTION_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} + run: | + aws s3 rm "s3://brave-production-griffin-origin/$REMOTE_SEED_PATH" + aws cloudfront create-invalidation --distribution-id "$CLOUDFRONT_DISTRIBUTION_ID" --paths "/$REMOTE_SEED_PATH" diff --git a/.github/workflows/generate-test-seed.yml b/.github/workflows/generate-test-seed.yml new file mode 100644 index 00000000..3e60b60f --- /dev/null +++ b/.github/workflows/generate-test-seed.yml @@ -0,0 +1,103 @@ +name: Generate Test Seed + +on: + pull_request: + paths: + - 'studies/**' + +jobs: + build: + runs-on: ubuntu-latest + env: + REMOTE_SEED_PATH: 'pull/${{ github.event.pull_request.number }}/seed' + + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + with: + fetch-depth: 0 + + - name: Comment "Generation In Progress" + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const commentBody = + `## 🔄 Generating Test Seed... + + A new test seed file is currently being generated for this pull request. + + ### What's Next? + + - The generation process typically takes a few minutes. + - Once the generation is complete, this comment will provide further instructions. + ` + const comment = require('.github/workflows/scripts/comment.js') + await comment(github, context, commentBody) + + - name: Install + run: | + npm ci + + - name: Build & Test + run: | + npm run typecheck:scripts + npm run build:proto + npm run typecheck + npm run test + + - name: Lint + run: | + npm run lint -- --base origin/${{ github.event.pull_request.base.ref }} + + - name: Generate seed + run: | + npm run seed_tools -- create_seed studies seed.bin + + - name: Upload seed + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PRODUCTION_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PRODUCTION_SECRET_ACCESS_KEY }} + AWS_REGION: us-west-2 + CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} + run: | + gzip -c seed.bin | aws s3 cp - "s3://brave-production-griffin-origin/$REMOTE_SEED_PATH" \ + --content-type application/octet-stream \ + --content-encoding gzip + + INVALIDATION_ID=$(aws cloudfront create-invalidation --distribution-id "$CLOUDFRONT_DISTRIBUTION_ID" --paths "/$REMOTE_SEED_PATH" --query 'Invalidation.Id' --output text) + aws cloudfront wait invalidation-completed --distribution-id "$CLOUDFRONT_DISTRIBUTION_ID" --id "$INVALIDATION_ID" + + - name: Comment "Generation Successful" + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const fs = require('fs'); + const variationsServerURL = `https://griffin.brave.com/${process.env.REMOTE_SEED_PATH}`; + const serialNumberContent = fs.readFileSync('serialnumber', 'utf8'); + const commentBody = + `## 🚀 Test Seed Generated + + To test the new seed, launch the browser with the following command line: + \`\`\` + --accept-empty-variations-seed-signature --variations-server-url=${variationsServerURL} + \`\`\` + + #### Seed Details + - Serial Number: \`${serialNumberContent}\` + - Uploaded: \`${new Date().toISOString()}\` + ` + const comment = require('.github/workflows/scripts/comment.js') + await comment(github, context, commentBody) + + - name: Comment "Generation Failed" + if: failure() + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const actionRunURL = `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`; + const commentBody = + `## ❌ Test Seed Generation Failed + + [Review the workflow logs for more information.](${actionRunURL}) + ` + const comment = require('.github/workflows/scripts/comment.js') + await comment(github, context, commentBody) diff --git a/.github/workflows/scripts/comment.js b/.github/workflows/scripts/comment.js new file mode 100644 index 00000000..f1b03c7d --- /dev/null +++ b/.github/workflows/scripts/comment.js @@ -0,0 +1,32 @@ +// Creates or updates a single comment which is looked up by the workflow name. + +module.exports = async (github, context, commentBody) => { + const uniqueCommentTag = ``; + commentBody = `${commentBody}\n${uniqueCommentTag}`; + + const comments = await github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }); + + const existingComment = comments.data.find((comment) => + comment.body.includes(uniqueCommentTag), + ); + + if (existingComment) { + await github.rest.issues.updateComment({ + comment_id: existingComment.id, + owner: context.repo.owner, + repo: context.repo.repo, + body: commentBody, + }); + } else { + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: commentBody, + }); + } +}; diff --git a/src/seed_tools/commands/create_seed.ts b/src/seed_tools/commands/create_seed.ts index d00da3fe..0b6c5bfa 100644 --- a/src/seed_tools/commands/create_seed.ts +++ b/src/seed_tools/commands/create_seed.ts @@ -24,6 +24,7 @@ export default new Command('create_seed') .option( '--serial_number_path ', 'file path to write the serial number to', + './serialnumber', ) .option('--mock_serial_number ', 'mock serial number') .action(main); diff --git a/studies/AdBlockComponentUpdateIntervalStudy.json b/studies/AdBlockComponentUpdateIntervalStudy.json new file mode 100644 index 00000000..75625453 --- /dev/null +++ b/studies/AdBlockComponentUpdateIntervalStudy.json @@ -0,0 +1,35 @@ +[ + { + "name": "AdBlockComponentUpdateIntervalStudy", + "experiment": [ + { + "name": "Enabled", + "probability_weight": 100, + "feature_association": { + "enable_feature": [ + "AdBlockDefaultResourceUpdateInterval" + ] + }, + "param": [ + { + "name": "update_interval_mins", + "value": "1" + } + ] + } + ], + "filter": { + "channel": [ + "NIGHTLY", + "BETA", + "RELEASE" + ], + "platform": [ + "PLATFORM_WINDOWS", + "PLATFORM_MAC", + "PLATFORM_LINUX", + "PLATFORM_ANDROID" + ] + } + } +]