From cdf252448fb8519fb80c60c06736f237598c47b3 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/pr-seed-upload.yml | 189 ++++++++++++++++++ src/seed_tools/commands/create_seed.ts | 1 + .../AdBlockComponentUpdateIntervalStudy.json | 35 ++++ 3 files changed, 225 insertions(+) create mode 100644 .github/workflows/pr-seed-upload.yml create mode 100644 studies/AdBlockComponentUpdateIntervalStudy.json diff --git a/.github/workflows/pr-seed-upload.yml b/.github/workflows/pr-seed-upload.yml new file mode 100644 index 00000000..ad8f7d5e --- /dev/null +++ b/.github/workflows/pr-seed-upload.yml @@ -0,0 +1,189 @@ +name: PR Seed Upload + +on: + pull_request: + paths: + - 'studies/**' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + + - name: Comment PR with upload in progress status + uses: actions/github-script@v7 + with: + script: | + const uniqueCommentId = '${{github.workflow_ref}}'; + const commentBody = + `## 🔄 Seed Upload In Progress + + A new seed file is currently being uploaded for this pull request. + + ### What's Next? + + - The upload process typically takes a few minutes. + - Once the upload is complete, a follow-up comment will provide the seed details and testing instructions. + + Stay tuned for updates! + + ` + + 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(uniqueCommentId)); + + 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, + }); + } + + - name: Comment PR with failure status + if: failure() + uses: actions/github-script@v7 + with: + script: | + const uniqueCommentId = '${{github.workflow_ref}}'; + const failureCommentBody = + `## ❌ Seed Upload Failed + + Unfortunately, the seed file upload process failed. + + ### What's Next? + + - Please check the pull request **Checks list** for more details on the failure. + - Review the error logs to identify what went wrong. + - Once the issue is resolved, please re-trigger the workflow. + + + ` + + 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(uniqueCommentId)); + + if (existingComment) { + await github.rest.issues.updateComment({ + comment_id: existingComment.id, + owner: context.repo.owner, + repo: context.repo.repo, + body: failureCommentBody, + }); + } else { + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: failureCommentBody, + }); + } + + - name: Install dependencies and run tests + run: | + npm install + npm run typecheck:scripts + npm run build:proto + npm run typechecka + npm run test + + - 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 }} + REMOTE_SEED_PATH: 'pull/${{github.event.pull_request.number}}/seed' + 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 PR with uploaded status + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const variationsServerURL = `https://griffin.brave.com/pull/${{github.event.pull_request.number}}/seed`; + const serialNumberContent = fs.readFileSync('serialnumber', 'utf8'); + const uniqueCommentId = '${{github.workflow_ref}}'; + const commentBody = + `## 🚀 Seed Upload Successful + + The latest seed file has been successfully uploaded and is ready for testing. + + ### Seed Details + - **Serial Number:** \`${serialNumberContent}\` + - **Upload Timestamp:** \`${new Date().toISOString()}\` + + ### Testing Instructions + + To test the new seed, launch the Brave browser with the following command line: + + \`\`\`bash + brave --accept-empty-variations-seed-signature --variations-server-url=${variationsServerURL} + \`\`\` + + This will configure the browser to use the uploaded seed for variations. + + ### Use the following service pages for more information: + + - \`brave://version\` + + --- + + Please report any issues or feedback to the development team. Happy testing! + + ` + + 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(uniqueCommentId)); + + 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..816851c8 --- /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" + ] + } + } +]