diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml new file mode 100644 index 00000000..db0c31f2 --- /dev/null +++ b/.github/workflows/beta.yml @@ -0,0 +1,40 @@ +name: Deploy Beta + +on: + workflow_dispatch: + pull_request: + types: [edited] + +jobs: + deploy-beta: + name: Deploy + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node.js version from .nvmrc + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + + - name: Write service account + run: | + mkdir private + echo "$BETA_FIREBASE_SERVICE_ACCOUNT" > ./private/service-account.json + echo '${{ secrets.BETA_FIREBASE_SERVICE_ACCOUNT }}' > gcloud.json + env: + BETA_FIREBASE_SERVICE_ACCOUNT: ${{ secrets.BETA_FIREBASE_SERVICE_ACCOUNT }} + shell: bash + + - name: Install + run: | + npm install + shell: bash + + - name: Deploy + env: + GOOGLE_APPLICATION_CREDENTIALS: gcloud.json + run: | + npm run deploy + shell: bash diff --git a/functions/index.js b/functions/index.js index 2c2d8b53..283deb0b 100644 --- a/functions/index.js +++ b/functions/index.js @@ -6,7 +6,7 @@ const firebase = require('firebase-admin'); firebase.initializeApp({ credential: firebase.credential.cert(require('./build/service-account.json')), - databaseURL: `https://parallel-cf800.firebaseio.com`, + databaseURL: `https://parallel-beta-31dc4.firebaseio.com`, }); const fs = require('fs'); diff --git a/functions/views/_layout.pug b/functions/views/_layout.pug index be83dbb9..62840d1a 100644 --- a/functions/views/_layout.pug +++ b/functions/views/_layout.pug @@ -33,6 +33,10 @@ html body #vue + .beta + div You are on our Beta Testing Site! + div The information & events on this page are for testing purposes and should not be followed. + a(href="https://parallel.org.uk") Click here to return to the production site. .headerWrapper .header if !sidebarDisabled diff --git a/package.json b/package.json index 7eec7931..f6263a91 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,10 @@ }, "scripts": { "start": "grunt build && npm run serve", - "serve": "grunt concurrent & GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase serve --project prod", - "export-users": "GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase auth:export ./private/tmp-users.json --format=json --project prod", - "deploy": "grunt && GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase deploy --project prod", + "serve-old": "grunt concurrent && GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase serve --project beta", + "serve": "concurrently \"grunt concurrent\" \"cross-env GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase emulators:start --project beta\"", + "export-users": "GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase auth:export ./private/tmp-users.json --format=json --project beta", + "deploy": "grunt && GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase deploy --project beta", "convert-teachers": "node scripts/convert-teachers.js", "convert-students": "node scripts/convert-students.js", "get-users": "node scripts/get-users.js", @@ -19,6 +20,7 @@ "get-pg-meta-json": "grunt build && node scripts/get-pg-meta-json.js", "get-tts-results": "node scripts/get-tts-results.js", "update-results": "node scripts/update-results.js", + "postinstall": "npx firebase logout && echo 'Logging out, no longer using firebase login, use service accounts instead.'" "start-marsh": "grunt build && concurrently \"grunt concurrent\" \"GOOGLE_APPLICATION_CREDENTIALS=private/service-account.json firebase serve --project prod\"" }, "devDependencies": { @@ -28,7 +30,9 @@ "@mathigon/hilbert": "^0.6.8", "babel-polyfill": "^6.26.0", "babel-preset-minify": "^0.5.1", + "concurrently": "^7.6.0", "cookie-parser": "^1.4.6", + "cross-env": "^10.0.0", "firebase-admin": "^13.2.0", "grunt": "^1.4.1", "grunt-autoprefixer": "^3.0.3", @@ -62,7 +66,6 @@ "@firebase/app": "^0.7.0", "aws-sdk": "^2.1252.0", "caniuse-lite": "^1.0.3", - "concurrently": "^7.3.0", "firebase": "^9.0.0", "firebase-functions": "^6.3.2", "firebase-tools": "^13.33.0", @@ -72,5 +75,6 @@ "> 1%", "not ie <= 11", "not ios < 10" - ] + ], + "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748" } diff --git a/pages/troubleshooting.md b/pages/troubleshooting.md index cde0d5b1..ab4513cc 100644 --- a/pages/troubleshooting.md +++ b/pages/troubleshooting.md @@ -4,8 +4,8 @@ In order for pupils to receive the weekly email reminder to take part in the latest Parallelograms and successfully manage their account and password, you may need your school's IT department to whitelist the following addresses: -* noreply@parallel-cf800.firebaseapp.com -* https://parallel-cf800.firebaseapp.com +* noreply@parallel-beta-31dc4.firebaseapp.com +* https://parallel-beta-31dc4.firebaseapp.com * contact@parallel.org.uk * https://parallel.org.uk/ diff --git a/scripts/change-email.js b/scripts/change-email.js index be036f77..e318e25b 100644 --- a/scripts/change-email.js +++ b/scripts/change-email.js @@ -8,7 +8,7 @@ const to = 'abianchi@sunburymanor.surrey.sch.uk' fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: "https://parallel-cf800.firebaseio.com", + databaseURL: "https://parallel-beta-31dc4.firebaseio.com", }); const run = () => diff --git a/scripts/convert-students.js b/scripts/convert-students.js index d55c3a4e..c04d48e0 100644 --- a/scripts/convert-students.js +++ b/scripts/convert-students.js @@ -9,7 +9,7 @@ const STUDENTS = [ fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const file = path.join(__dirname, `../private/tmp-users.json`); diff --git a/scripts/convert-teachers.js b/scripts/convert-teachers.js index 48e6e096..73166f69 100644 --- a/scripts/convert-teachers.js +++ b/scripts/convert-teachers.js @@ -10,7 +10,7 @@ const TEACHERS = [ fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const file = path.join(__dirname, `../private/tmp-users.json`); diff --git a/scripts/delete-accounts.js b/scripts/delete-accounts.js index 2b6bafbb..433b6b1e 100644 --- a/scripts/delete-accounts.js +++ b/scripts/delete-accounts.js @@ -7,7 +7,7 @@ const USERS = [ fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); async function deleteAccount(email) { diff --git a/scripts/recover-account.js b/scripts/recover-account.js index 0b2b5967..5abba614 100644 --- a/scripts/recover-account.js +++ b/scripts/recover-account.js @@ -27,7 +27,7 @@ const makePassword = () => { fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: "https://parallel-cf800.firebaseio.com", + databaseURL: "https://parallel-beta-31dc4.firebaseio.com", }); const updateUserPassword = (email) => diff --git a/scripts/set-account-level.js b/scripts/set-account-level.js index 500d681e..b8b62061 100644 --- a/scripts/set-account-level.js +++ b/scripts/set-account-level.js @@ -11,7 +11,7 @@ const isEuclidAdmin = true; fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: "https://parallel-cf800.firebaseio.com", + databaseURL: "https://parallel-beta-31dc4.firebaseio.com", }); const setAdmin = () => { diff --git a/scripts/update-euclid-data.js b/scripts/update-euclid-data.js index d724d5a5..99d86e26 100644 --- a/scripts/update-euclid-data.js +++ b/scripts/update-euclid-data.js @@ -16,7 +16,7 @@ const dryRun = true; // when true, will just log what it will write, but not sav fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const userDb = fb.firestore().collection('users'); diff --git a/scripts/update-results.js b/scripts/update-results.js index d4b77d42..33738aff 100644 --- a/scripts/update-results.js +++ b/scripts/update-results.js @@ -13,7 +13,7 @@ const ADD_POINTS = 2; fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const userDb = fb.firestore().collection('users'); diff --git a/scripts/utils/downloadUsers.js b/scripts/utils/downloadUsers.js index 9147c293..d73aed64 100644 --- a/scripts/utils/downloadUsers.js +++ b/scripts/utils/downloadUsers.js @@ -7,7 +7,7 @@ const serviceAccount = require('../../private/service-account.json'); fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const cacheFilePath = path.join(__dirname, `../../private/cache-users.json`); diff --git a/scripts/yearly-updates/delete-old-users.js b/scripts/yearly-updates/delete-old-users.js index 3e795d14..a0f914f4 100644 --- a/scripts/yearly-updates/delete-old-users.js +++ b/scripts/yearly-updates/delete-old-users.js @@ -5,7 +5,7 @@ const serviceAccount = require("../../private/service-account.json"); fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: "https://parallel-cf800.firebaseio.com", + databaseURL: "https://parallel-beta-31dc4.firebaseio.com", }); const keysToRemove = [ diff --git a/scripts/yearly-updates/update-users-upload.js b/scripts/yearly-updates/update-users-upload.js index 6210dfea..a64e59e1 100644 --- a/scripts/yearly-updates/update-users-upload.js +++ b/scripts/yearly-updates/update-users-upload.js @@ -8,7 +8,7 @@ const limit = promiseLimit(400); fb.initializeApp({ credential: fb.credential.cert(serviceAccount), - databaseURL: 'https://parallel-cf800.firebaseio.com' + databaseURL: 'https://parallel-beta-31dc4.firebaseio.com' }); const userDb = fb.firestore().collection('users'); diff --git a/static/pages.yaml b/static/pages.yaml index 5c6d87af..d8926297 100644 --- a/static/pages.yaml +++ b/static/pages.yaml @@ -1300,7 +1300,7 @@ test: title: Parallel Academy Year 7 Summer Term Test postSubmissionMessage: Thank you, we have received your answers. Please await further instructions from your tutor in Zoom. available: 2024-01-15T13:00:00 - answersVisibleFrom: 2025-07-21T09:00:00 + answersVisibleFrom: 2024-07-21T09:00:00 deadline: 2025-08-31T21:00:00 - url: academy-8sum-test title: Parallel Academy Year 8 Summer Term Test diff --git a/static/scripts/main.js b/static/scripts/main.js index 83af11d6..57abd152 100755 --- a/static/scripts/main.js +++ b/static/scripts/main.js @@ -59,9 +59,9 @@ document.addEventListener("wheel", function(event){ document.addEventListener('DOMContentLoaded', function() { firebase.initializeApp({ - apiKey: "AIzaSyCrQ_PdH-05lcNWETGvGfiwO3MBXk_WeVU", - projectId: "parallel-cf800", - authDomain: "parallel-cf800.firebaseapp.com", + apiKey: "AIzaSyDk4_ME-Uy1D3Yjg94Af7Gzhg3I1xNYWp8", + projectId: "parallel-beta-31dc4", + authDomain: "parallel-beta-31dc4.firebaseapp.com", }); const user = getUser(); diff --git a/static/styles/layout.less b/static/styles/layout.less index c9b84f26..96759e61 100644 --- a/static/styles/layout.less +++ b/static/styles/layout.less @@ -23,6 +23,17 @@ html { line-height: 1.8; } +.beta { + background-color: orange; + margin: 0px -1rem; + text-align: center; + + a { + color: blue; + text-decoration: underline; + } +} + #logo { background: url('/images/logo.png'); background-size: cover;