123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /* eslint-disable @typescript-eslint/no-var-requires */
- const { Octokit } = require('@octokit/rest')
- const { get } = require('lodash')
- const ENV_PRODUCTION = 'PRODUCTION'
- const ENV_STAGING = 'STAGING'
- const ENV_DEVELOPMENT = 'DEVELOPMENT'
- module.exports = {
- onPreBuild: async ({ inputs: { production_branch, app_env_prefix }, utils }) => {
- const { CONTEXT, REVIEW_ID, REPOSITORY_URL, SITE_NAME } = process.env
- // === get env based on branch/PR ===
- let env = ENV_PRODUCTION
- if (SITE_NAME === 'atlas-app-mocked') {
- env = ENV_DEVELOPMENT
- } else if (CONTEXT === 'branch-deploy') {
- env = ENV_STAGING
- } else if (CONTEXT === 'deploy-preview') {
- const productionPull = await isProductionPull({
- productionBranch: production_branch,
- repoUrl: REPOSITORY_URL,
- pullNumber: REVIEW_ID,
- })
- if (!productionPull) {
- env = ENV_STAGING
- }
- }
- const pluginSummary = `Using ${env} variables`
- console.log(pluginSummary)
- // === expose all matching env variables ===
- let pluginText = ''
- Object.keys(process.env).forEach((varKey) => {
- if (varKey.startsWith(env)) {
- const varValue = process.env[varKey]
- const appVarKey = app_env_prefix ? `${app_env_prefix}${varKey.replace(`${env}_`, '')}` : varKey
- const varLine = `Exposing ${varKey} as ${appVarKey}=${varValue}`
- pluginText = `${pluginText}\n${varLine}`
- console.log(varLine)
- process.env[appVarKey] = varValue
- }
- })
- // === expose env ===
- const appEnvKey = `${app_env_prefix}ENV`
- const envLine = `Exposing ${appEnvKey}=${env}`
- pluginText = `${pluginText}\n${envLine}`
- console.log(envLine)
- process.env[appEnvKey] = env
- utils.status.show({
- title: 'Env variables set',
- summary: pluginSummary,
- text: pluginText,
- })
- },
- }
- const isProductionPull = async ({ productionBranch, repoUrl, pullNumber }) => {
- try {
- const baseBranch = await getPullBaseBranch({ repoUrl, pullNumber })
- return baseBranch === productionBranch
- } catch (e) {
- console.log("Couldn't load base branch: ", e)
- }
- return true
- }
- const getRepoOwnerAndName = (repoUrl) => {
- const segments = repoUrl.split('/')
- const owner = segments[segments.length - 2]
- const name = segments[segments.length - 1]
- return { owner, name }
- }
- const getPullBaseBranch = async ({ repoUrl, pullNumber, timeout = 2000 }) => {
- const { owner, name } = getRepoOwnerAndName(repoUrl)
- const octokit = new Octokit()
- const response = await octokit.pulls.get({
- owner,
- repo: name,
- pull_number: pullNumber,
- request: {
- timeout,
- },
- })
- if (response.status !== 200) {
- throw new Error('Failed to fetch pull')
- }
- const base = get(response, 'data.base.ref', null)
- if (!base) {
- throw new Error('Failed to access base branch')
- }
- return base
- }
|