From 1454cfab9bfadbc0334d1cebeb6cc1acaf8d9544 Mon Sep 17 00:00:00 2001 From: Sergei Dorogin Date: Fri, 14 Jun 2024 13:06:16 +0400 Subject: [PATCH] create-gaart-wf@1.11: shell scripts now use gcp/setup.sh for all operation with settings.ini which created during generation workflow arguments are saved in data.json and not hard-coded in shell scripts anymore support of custom service account - additional question in wizard and it's saved in settings.ini if provided Change-Id: I5ad4d6a81fe1906cb2b98dd82af5467141f0075e --- .gitignore | 2 - gcp/create-gaarf-wf/build/index.js | 248 ++++++++++---------- gcp/create-gaarf-wf/build/index.js.map | 2 +- gcp/create-gaarf-wf/package.json | 2 +- gcp/create-gaarf-wf/src/index.ts | 308 ++++++++++++------------- gcp/functions/deploy.sh | 24 +- gcp/functions/setup.sh | 1 + gcp/setup.sh | 229 +++++++++++++++++- gcp/workflow/deploy.sh | 16 +- gcp/workflow/setup.sh | 1 + js/package-lock.json | 8 +- js/package.json | 2 +- 12 files changed, 542 insertions(+), 301 deletions(-) diff --git a/.gitignore b/.gitignore index 5a4a1bbd..153e5973 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,6 @@ tags .idea/ *eggs *egg-info -build -dist .tox .coverage .python-version diff --git a/gcp/create-gaarf-wf/build/index.js b/gcp/create-gaarf-wf/build/index.js index 8a72c2a4..4283c7d0 100755 --- a/gcp/create-gaarf-wf/build/index.js +++ b/gcp/create-gaarf-wf/build/index.js @@ -34,6 +34,7 @@ const argv = minimist(process.argv.slice(2)); const is_diag = argv.diag; const is_debug = argv.debug || argv.diag; const ignore_errors = argv.ignore_errors; +const settings_file = argv.settingsFile || 'settings.ini'; const cwd = get_cwd(argv); function get_cwd(argv) { // First argument (optional) is a path where the tool run in. @@ -54,10 +55,10 @@ function get_cwd(argv) { } function deploy_shell_script(fileName, content) { fs.writeFileSync(fileName, content); - execSync(`chmod +x ${fileName}`); + exec_sync(`chmod +x ${fileName}`); console.log(chalk.gray(`Created ${fileName}`)); } -function execSync(cmd, options) { +function exec_sync(cmd, options) { options = Object.assign(options || {}, { stdio: 'pipe', shell: true, @@ -142,7 +143,7 @@ function exec_cmd(cmd, spinner, options) { }); }); } -async function get_gcp_regions(answers) { +async function ask_for_gcp_region(answers) { if (answers && answers.gcp_region) { return answers.gcp_region; } @@ -180,7 +181,6 @@ async function get_gcp_regions(answers) { value: item, }; })); - //options = [{title: 'Enter manually', value: MANUAL_ITEM}].concat(options); const response = await prompts({ type: 'autocomplete', name: 'gcp_region', @@ -200,7 +200,7 @@ async function initialize_gcp_project(answers) { process.exit(-1); } // now check for authentication in gcloud - const auth_output = execSync('gcloud auth print-access-token') + const auth_output = exec_sync('gcloud auth print-access-token') .toString() .trim(); if (auth_output.includes('ERROR: (gcloud.auth.print-access-token)')) { @@ -208,7 +208,7 @@ async function initialize_gcp_project(answers) { chalk.white('gcloud auth login')); process.exit(-1); } - let gcp_project_id = execSync('gcloud config get-value project 2> /dev/null') + let gcp_project_id = exec_sync('gcloud config get-value project 2> /dev/null') .toString() .trim(); if (gcp_project_id) { @@ -222,7 +222,7 @@ async function initialize_gcp_project(answers) { } } // otherwise let the user to choose a project - const projects_csv = execSync('gcloud projects list --format="csv(projectId,name)" --sort-by=projectId --limit=500').toString(); + const projects_csv = exec_sync('gcloud projects list --format="csv(projectId,name)" --sort-by=projectId --limit=500').toString(); const rows = projects_csv.split('\n').map(row => row.split(',')); rows.splice(0, 1); // remove header row let options = rows @@ -249,7 +249,7 @@ async function initialize_gcp_project(answers) { message: 'Please enter a GCP project id:', }); // make sure the entered project does exist - const describe_output = execSync(`gcloud projects describe ${response.project_id}`).toString(); + const describe_output = exec_sync(`gcloud projects describe ${response.project_id}`).toString(); if (describe_output.includes('ERROR:')) { console.log(chalk.red('Could not set current project')); console.log(describe_output); @@ -258,7 +258,7 @@ async function initialize_gcp_project(answers) { } gcp_project_id = response.project_id; if (gcp_project_id) { - execSync('gcloud config set project ' + gcp_project_id); + exec_sync('gcloud config set project ' + gcp_project_id); } return gcp_project_id; } @@ -269,6 +269,8 @@ async function initialize_gcp_project(answers) { */ function read_dir(dirpath) { let results = []; + if (!fs.existsSync(dirpath)) + return results; const entries = fs.readdirSync(dirpath, { withFileTypes: true }); entries.forEach((entry) => { const entry_path = path.resolve(dirpath, entry.name); @@ -531,6 +533,16 @@ refresh_token: ${refresh_token} } return path_to_googleads_config; } +async function validate_googeads_config(gaarf_folder, path_to_googleads_config) { + await exec_cmd('npm install --prod', new clui.Spinner('Installing dependencies...'), { + cwd: `./${gaarf_folder}/js`, + }); + const res = await exec_cmd(`./gaarf validate --ads-config=../../${path_to_googleads_config}`, new clui.Spinner(`Validating Ads credentials from ${path_to_googleads_config}...`), { cwd: `./${gaarf_folder}/js` }); + if (res.code !== 0 && !ignore_errors) { + console.log(chalk.red(res.stderr || res.stdout)); + process.exit(res.code); + } +} function get_answers() { let answers = {}; if (argv.answers) { @@ -565,6 +577,50 @@ function getMultiRegion(region) { function sanitizeCustomerId(cid) { return cid.toString().replaceAll('-', '').replaceAll(' ', ''); } +async function git_clone_repo(url, gaarf_folder) { + if (!fs.existsSync(gaarf_folder)) { + await exec_cmd(`git clone ${url} --depth 1 ${gaarf_folder}`, new clui.Spinner(`Cloning Gaarf repository (${url}), please wait...`)); + } + else { + let git_user_name = ''; + try { + git_user_name = exec_sync('git config --get user.name', { + cwd: path.join(cwd, gaarf_folder), + }) + .toString() + .trim(); + // eslint-disable-next-line no-empty + } + catch (e) { + // no user identity in git, that's ok + } + if (!git_user_name) { + // there's no user identity, git pull -ff can fail, let's set some arbitrary identity + const git_user_name = exec_sync('echo $USER').toString().trim() || 'user'; + const git_user_email = exec_sync('echo $USER_EMAIL').toString().trim() || 'user@example.com'; + exec_sync(`git config --local user.name ${git_user_name}`, { + cwd: path.join(cwd, gaarf_folder), + }); + exec_sync(`git config --local user.email ${git_user_email}`, { + cwd: path.join(cwd, gaarf_folder), + }); + } + exec_sync('git pull --ff', { cwd: path.join(cwd, gaarf_folder) }); + } +} +function dump_settings(settings) { + let content = ''; + for (const name of Object.keys(settings)) { + content += `[${name}]\n`; + const section = settings[name]; + for (const key of Object.keys(section)) { + if (section[key]) { + content += ` ${key}=${section[key]}\n`; + } + } + } + return content; +} async function init() { const answers = get_answers(); const status_log = `Running create-gaarf-wf in ${cwd}`; @@ -574,7 +630,7 @@ async function init() { console.log(chalk.gray(status_log)); console.log(chalk.yellow(figlet.textSync('Gaarf Workflow', { horizontalLayout: 'full' }))); console.log(`Welcome to interactive generator for Gaarf Workflow (${chalk.redBright('G')}oogle ${chalk.redBright('A')}ds ${chalk.redBright('A')}PI ${chalk.redBright('R')}eport ${chalk.redBright('F')}etcher Workflow)`); - console.log('You will be asked a bunch of questions to prepare and initialize your cloud infrastructure'); + console.log('You will be asked a bunch of questions to prepare and initialize your Cloud infrastructure'); console.log('It is best to run this script in a folder that is a parent for your queries'); const gcp_project_id = await initialize_gcp_project(answers); const PATH_ADS_QUERIES = 'ads-queries'; @@ -621,6 +677,11 @@ async function init() { : value; }, }, + { + type: 'input', + name: 'service_account', + message: 'Custom service account name (leave blank to use the default one):', + }, { type: 'input', name: 'custom_ids_query_path', @@ -633,6 +694,7 @@ async function init() { const path_to_bq_queries = answers1.path_to_bq_queries; const path_to_bq_queries_abs = path.join(cwd, path_to_bq_queries); let gcs_bucket = answers1.gcs_bucket; + const service_account = answers1.service_account; if (!fs.existsSync(path_to_ads_queries_abs)) { fs.mkdirSync(path_to_ads_queries_abs); console.log(chalk.grey(`Created '${path_to_ads_queries_abs}' folder`)); @@ -642,50 +704,26 @@ async function init() { console.log(chalk.grey(`Created '${path_to_bq_queries_abs}' folder`)); } const custom_ids_query_path = answers1.custom_ids_query_path; - gcs_bucket = (gcs_bucket || gcp_project_id).trim(); const path_to_googleads_config = await initialize_googleads_config(answers); - // clone gaarf repo - const gaarf_folder = 'ads-api-fetcher'; - if (!fs.existsSync(gaarf_folder)) { - await exec_cmd(`git clone ${GIT_REPO} --depth 1 ${gaarf_folder}`, new clui.Spinner(`Cloning Gaarf repository (${GIT_REPO}), please wait...`)); + const has_ads_queries = !!fs.readdirSync(path_to_ads_queries).length; + const has_adsconfig = fs.existsSync(path_to_googleads_config); + // TODO: + if (!has_ads_queries) { + console.log(chalk.red(`Please place your ads scripts into '${path_to_ads_queries}' folder`)); } - else { - let git_user_name = ''; - try { - git_user_name = execSync('git config --get user.name', { - cwd: path.join(cwd, gaarf_folder), - }) - .toString() - .trim(); - // eslint-disable-next-line no-empty - } - catch (_a) { } - if (!git_user_name) { - // there's no user identity, git pull -ff can fail, let's set some arbitrary identity - const git_user_name = execSync('echo $USER').toString().trim() || 'user'; - const git_user_email = execSync('echo $USER_EMAIL').toString().trim() || 'user@example.com'; - execSync(`git config --local user.name ${git_user_name}`, { - cwd: path.join(cwd, gaarf_folder), - }); - execSync(`git config --local user.email ${git_user_email}`, { - cwd: path.join(cwd, gaarf_folder), - }); - } - execSync('git pull --ff', { cwd: path.join(cwd, gaarf_folder) }); + if (!has_adsconfig) { + console.log(chalk.red(`Please put your Ads API config into '${path_to_googleads_config}' file`)); } + gcs_bucket = (gcs_bucket || gcp_project_id).trim(); + // clone gaarf repo + const gaarf_folder = 'ads-api-fetcher'; + await git_clone_repo(GIT_REPO, gaarf_folder); // call the gaarf cli tool from the cloned repo to validate the ads credentials if (fs.existsSync(path_to_googleads_config) && !answers.disable_ads_validation) { - await exec_cmd('npm install --prod', new clui.Spinner('Installing dependencies...'), { - cwd: `./${gaarf_folder}/js`, - }); - const res = await exec_cmd(`./gaarf validate --ads-config=../../${path_to_googleads_config}`, new clui.Spinner(`Validating Ads credentials from ${path_to_googleads_config}...`), { cwd: `./${gaarf_folder}/js` }); - if (res.code !== 0 && !ignore_errors) { - console.log(chalk.red(res.stderr || res.stdout)); - process.exit(res.code); - } + await validate_googeads_config(gaarf_folder, path_to_googleads_config); } - const gcp_region = await get_gcp_regions(answers); + const gcp_region = await ask_for_gcp_region(answers); // create a bucket const res = await exec_cmd(`gsutil mb -l ${getMultiRegion(gcp_region)} -b on gs://${gcs_bucket}`, new clui.Spinner(`Creating a GCS bucket ${gcs_bucket}`), { silent: true }); if (res.code !== 0 && @@ -694,7 +732,7 @@ async function init() { console.log(res.stderr || res.stdout); } const gcs_base_path = `gs://${gcs_bucket}/${name}`; - // Create deploy-scripts.sh + // Create deploy-queries.sh let deploy_custom_query_snippet = ''; let custom_query_gcs_path; if (custom_ids_query_path) { @@ -724,9 +762,7 @@ if ls ./${path_to_bq_queries}/* 1> /dev/null 2>&1; then fi `); // Create deploy-wf.sh - const workflow_name = name + '-wf'; - const function_name = name; - let cf_memory = (await prompt([ + const cf_memory = (await prompt([ { type: 'list', message: 'Memory limit for the Cloud Functions:', @@ -743,29 +779,24 @@ fi ], }, ], answers)).cf_memory; - deploy_shell_script('deploy-wf.sh', `# Deploy Cloud Functions and Cloud Workflow + // create settings.ini: + const settings = { + common: { + name: name, + region: gcp_region, + 'service-account': service_account, + }, + functions: { + memory: cf_memory, + }, + }; + deploy_shell_script('deploy-wf.sh', `# Deploy Cloud Functions and Cloud Workflows set -e cd ./${gaarf_folder} git pull --ff -cd ./gcp/workflow -./setup.sh --name ${workflow_name} --region ${gcp_region} -cd ./../functions -./setup.sh --name ${function_name} --memory ${cf_memory} --region ${gcp_region} +cd .. +./${gaarf_folder}/gcp/setup.sh deploy_all --settings $(readlink -f "./${settings_file}") `); - const has_ads_queries = !!fs.readdirSync(path_to_ads_queries).length; - const has_bq_queries = !!fs.readdirSync(path_to_bq_queries).length; - const has_adsconfig = fs.existsSync(path_to_googleads_config); - if (!has_ads_queries) { - console.log(chalk.red(`Please place your ads scripts into '${path_to_ads_queries}' folder`)); - } - if (!has_adsconfig) { - console.log(chalk.red(`Please put your Ads API config into '${path_to_googleads_config}' file`)); - } - const progress = { - scripts_deployed: false, - wf_created: false, - wf_scheduled: false, - }; // now we need parameters for running the WF let ads_customer_id; if (fs.existsSync(path_to_googleads_config)) { @@ -777,6 +808,12 @@ cd ./../functions yamldoc['login_customer_id']; } const answers2 = await prompt([ + { + type: 'input', + name: 'customer_id', + message: 'Ads account id (customer id, or a list of ids via ","):', + default: ads_customer_id, + }, { type: 'input', name: 'output_dataset', @@ -786,12 +823,6 @@ cd ./../functions return input.replace(/[ -]/g, '_'); }, }, - { - type: 'input', - name: 'customer_id', - message: 'Ads account id (customer id, or a list of ids via ","):', - default: ads_customer_id, - }, ], answers); // now we detect macro used in queries and ask for their values const macro_ads = await get_macro_values(path.join(cwd, path_to_ads_queries), answers, 'ads_macro'); @@ -814,19 +845,12 @@ cd ./../functions bq_writer_options: bq_writer_options, ads_macro: macro_ads, bq_macro: macro_bq, - bq_sql: {}, }; + const wf_data_file = 'data.json'; + fs.writeFileSync(wf_data_file, JSON.stringify(wf_data, null, 2)); // Create run-wf.sh deploy_shell_script('run-wf.sh', `set -e -state=$(gcloud workflows run ${workflow_name} --location=${gcp_region} \ ---data='${JSON.stringify(wf_data, null, 2)}' --format="get(state)") -if [[ $state == 'FAILED' ]]; then - echo 'Execution failed' - exit -1 -else - echo 'Execution succeeded' - exit 0 -fi +./ads-api-fetcher/gcp/setup.sh run_wf --settings $(readlink -f "./${settings_file}") --data $(readlink -f "./${wf_data_file}") `); // now execute some scripts // deploying queries and ads config to GCS @@ -843,7 +867,6 @@ fi console.log(chalk.red('Queries deployment (deploy-queries.sh) failed, breaking')); process.exit(res.code); } - progress.scripts_deployed = true; } else { console.log(chalk.yellow("Please note that before you deploy queries to GCS (deploy-queries.sh) you can't run the workflow (it'll fail)")); @@ -860,13 +883,11 @@ fi console.log(chalk.red('Cloud components deployment (deploy-wf.sh) failed, breaking')); process.exit(res.code); } - progress.wf_created = true; } else { console.log(chalk.yellow("Please note that before you deploy cloud components (deploy-wf.sh) there's no sense in running a scheduler job")); } const answers3 = await prompt({ - //when: progress.scripts_deployed && progress.wf_created, type: 'confirm', name: 'schedule_wf', message: 'Do you want to schedule a job for executing workflow:', @@ -893,47 +914,21 @@ fi schedule_cron = `${time_parts.length > 1 ? time_parts[1] : 0} ${time_parts[0]} * * *`; answers3.run_job = answers_schedule.run_job; } + settings['scheduler'] = settings['scheduler'] || {}; + settings['scheduler']['schedule'] = schedule_cron; + fs.writeFileSync(settings_file, dump_settings(settings)); // Create schedule-wf.sh deploy_shell_script('schedule-wf.sh', `# Create Scheduler Job to execute Cloud Workflow -PROJECT_ID=${gcp_project_id} -PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="csv(projectNumber)" | tail -n 1) -# be default Cloud Worflows run under the Compute Engine default service account: -SERVICE_ACCOUNT=$PROJECT_NUMBER-compute@developer.gserviceaccount.com - -REGION=${gcp_region} -WORKFLOW_NAME=${workflow_name} -JOB_NAME=$WORKFLOW_NAME - -data='${JSON.stringify(wf_data, null, 2).replaceAll('"', '\\"')}' - -JOB_EXISTS=$(gcloud scheduler jobs list --location=$REGION --format="value(ID)" --filter="ID:'$JOB_NAME'") -if [[ -n $JOB_EXISTS ]]; then - gcloud scheduler jobs delete $JOB_NAME --location $REGION --quiet -fi - -# run the job daily at midnight -gcloud scheduler jobs create http $JOB_NAME \\ - --schedule="${schedule_cron}" \\ - --uri="https://workflowexecutions.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/workflows/$WORKFLOW_NAME/executions" \ - --location=$REGION \\ - --message-body="{\\"argument\\": \\"$data\\"}" \\ - --oauth-service-account-email="$SERVICE_ACCOUNT" \\ - --time-zone="Etc/UTC" - -# --time-zone="TIME_ZONE" \ -# timezone: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - -# to run the job: -#gcloud scheduler jobs run ${workflow_name} --location=${gcp_region} +./${gaarf_folder}/gcp/setup.sh schedule_wf --settings $(readlink -f "./${settings_file}") --data $(readlink -f "./${wf_data_file}") `); if (answers3.schedule_wf) { const res = await exec_cmd(path.join(cwd, './schedule-wf.sh'), new clui.Spinner('Creating a Scheduler Job, please wait...')); if (res.code === 0) { console.log('Created a Scheduler Job. You can recreate it with different settings by running schedule-wf.sh'); } - progress.wf_scheduled = true; if (answers3.run_job) { // running the job + const workflow_name = name + '-wf'; const res = await exec_cmd(`gcloud scheduler jobs run ${workflow_name} --location=${gcp_region}`, null, { realtime: true }); if (res.code !== 0 && !ignore_errors) { console.log(chalk.red('Starting the Scheduler Job has failed, breaking')); @@ -981,20 +976,23 @@ gcloud scheduler jobs create http $JOB_NAME \\ await exec_cmd(`gsutil cp ${DASHBOARD_LINK_FILE} ${gcs_base_path}/`, new clui.Spinner(`Copying ${DASHBOARD_LINK_FILE} to GCS ${gcs_base_path}/`), { silent: true }); } // at last stage we'll copy all shell scripts to same GCS bucket in scrips folders, so another users could manage the project easily - await exec_cmd(`gsutil -m cp *.sh ${gcs_base_path}/scripts/`, new clui.Spinner(`Copying all shell scripts to GCS ${gcs_base_path}/scripts`), { silent: true }); + await exec_cmd(`gsutil -m cp *.sh ${gcs_base_path}/scripts/;gsutil -m cp ${settings_file} ${gcs_base_path}/scripts/;gsutil -m cp ${wf_data_file} ${gcs_base_path}/scripts/`, new clui.Spinner(`Copying all shell scripts to GCS ${gcs_base_path}/scripts`), { silent: true }); // create download-script.sh shell script to download scripts back from GCS deploy_shell_script('download-scripts.sh', `for file in *.sh; do [ -e "$file" ] || continue - cp -- "$file" "$\{file\}.bak" + cp -- "$file" "$\{file}.bak" done -gsutil -m cp ${gcs_base_path}/scripts/*.sh .`); +gsutil -m cp ${gcs_base_path}/scripts/*.sh . +gsutil -m cp ${gcs_base_path}/scripts/${settings_file} . +gsutil -m cp ${gcs_base_path}/scripts/${wf_data_file} . +`); console.log(`All generated shell scripts were uploaded to GCS ${chalk.cyan(gcs_base_path + '/scripts')}`); console.log(chalk.green('All done')); console.log(chalk.yellow('Tips for using the generated scripts:')); console.log(` 🔹 ${chalk.cyan('deploy-queries.sh')} - redeploy queries and google-ads.yaml to GCS`); console.log(` 🔹 ${chalk.cyan('deploy-wf.sh')} - redeploy Cloud Functions and Workflow`); - console.log(` 🔹 ${chalk.cyan('run-wf.sh')} - execute workflow directly, see arguments inside`); - console.log(` 🔹 ${chalk.cyan('schedule-wf.sh')} - reschedule workflow execution, see arguments inside`); + console.log(` 🔹 ${chalk.cyan('run-wf.sh')} - execute workflow directly, see arguments in ${wf_data_file}`); + console.log(` 🔹 ${chalk.cyan('schedule-wf.sh')} - reschedule workflow execution, see arguments in ${wf_data_file}`); console.log(` 🔹 ${chalk.cyan('run-gaarf-*.sh')} - scripts for direct query execution via gaarf (via command line)`); const saveAnswers = argv.save || argv.saveAnswers; if (saveAnswers) { diff --git a/gcp/create-gaarf-wf/build/index.js.map b/gcp/create-gaarf-wf/build/index.js.map index 8a1ac59c..ef41b63f 100644 --- a/gcp/create-gaarf-wf/build/index.js.map +++ b/gcp/create-gaarf-wf/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/gcp/create-gaarf-wf/package.json b/gcp/create-gaarf-wf/package.json index fd4a97fa..837455f8 100644 --- a/gcp/create-gaarf-wf/package.json +++ b/gcp/create-gaarf-wf/package.json @@ -1,6 +1,6 @@ { "name": "create-gaarf-wf", - "version": "1.10.4", + "version": "1.11.0", "description": "Interactive generator for Gaarf (Google Ads API Report Fetcher) Workflow", "type": "module", "bin": { diff --git a/gcp/create-gaarf-wf/src/index.ts b/gcp/create-gaarf-wf/src/index.ts index 2efad159..6356851f 100644 --- a/gcp/create-gaarf-wf/src/index.ts +++ b/gcp/create-gaarf-wf/src/index.ts @@ -37,6 +37,7 @@ const argv = minimist(process.argv.slice(2)); const is_diag = argv.diag; const is_debug = argv.debug || argv.diag; const ignore_errors = argv.ignore_errors; +const settings_file = argv.settingsFile || 'settings.ini'; const cwd = get_cwd(argv); @@ -59,11 +60,11 @@ function get_cwd(argv: minimist.ParsedArgs) { function deploy_shell_script(fileName: string, content: string) { fs.writeFileSync(fileName, content); - execSync(`chmod +x ${fileName}`); + exec_sync(`chmod +x ${fileName}`); console.log(chalk.gray(`Created ${fileName}`)); } -function execSync(cmd: string, options?: CommonOptions): string { +function exec_sync(cmd: string, options?: CommonOptions): string { options = Object.assign(options || {}, { stdio: 'pipe', shell: true, @@ -159,7 +160,7 @@ function exec_cmd( }); } -async function get_gcp_regions(answers: Partial) { +async function ask_for_gcp_region(answers: Partial): Promise { if (answers && answers.gcp_region) { return answers.gcp_region; } @@ -199,7 +200,6 @@ async function get_gcp_regions(answers: Partial) { }; }) ); - //options = [{title: 'Enter manually', value: MANUAL_ITEM}].concat(options); const response = await prompts({ type: 'autocomplete', name: 'gcp_region', @@ -224,7 +224,7 @@ async function initialize_gcp_project(answers: Partial) { process.exit(-1); } // now check for authentication in gcloud - const auth_output = execSync('gcloud auth print-access-token') + const auth_output = exec_sync('gcloud auth print-access-token') .toString() .trim(); if (auth_output.includes('ERROR: (gcloud.auth.print-access-token)')) { @@ -234,7 +234,7 @@ async function initialize_gcp_project(answers: Partial) { ); process.exit(-1); } - let gcp_project_id = execSync('gcloud config get-value project 2> /dev/null') + let gcp_project_id = exec_sync('gcloud config get-value project 2> /dev/null') .toString() .trim(); if (gcp_project_id) { @@ -257,7 +257,7 @@ async function initialize_gcp_project(answers: Partial) { } } // otherwise let the user to choose a project - const projects_csv = execSync( + const projects_csv = exec_sync( 'gcloud projects list --format="csv(projectId,name)" --sort-by=projectId --limit=500' ).toString(); const rows = projects_csv.split('\n').map(row => row.split(',')); @@ -286,7 +286,7 @@ async function initialize_gcp_project(answers: Partial) { message: 'Please enter a GCP project id:', }); // make sure the entered project does exist - const describe_output = execSync( + const describe_output = exec_sync( `gcloud projects describe ${response.project_id}` ).toString(); if (describe_output.includes('ERROR:')) { @@ -297,7 +297,7 @@ async function initialize_gcp_project(answers: Partial) { } gcp_project_id = response.project_id; if (gcp_project_id) { - execSync('gcloud config set project ' + gcp_project_id); + exec_sync('gcloud config set project ' + gcp_project_id); } return gcp_project_id; } @@ -309,6 +309,7 @@ async function initialize_gcp_project(answers: Partial) { */ function read_dir(dirpath: string) { let results: string[] = []; + if (!fs.existsSync(dirpath)) return results; const entries = fs.readdirSync(dirpath, {withFileTypes: true}); entries.forEach((entry: fs.Dirent) => { const entry_path = path.resolve(dirpath, entry.name); @@ -655,6 +656,30 @@ refresh_token: ${refresh_token} return path_to_googleads_config; } +async function validate_googeads_config( + gaarf_folder: string, + path_to_googleads_config: string +) { + await exec_cmd( + 'npm install --prod', + new clui.Spinner('Installing dependencies...'), + { + cwd: `./${gaarf_folder}/js`, + } + ); + const res = await exec_cmd( + `./gaarf validate --ads-config=../../${path_to_googleads_config}`, + new clui.Spinner( + `Validating Ads credentials from ${path_to_googleads_config}...` + ), + {cwd: `./${gaarf_folder}/js`} + ); + if (res.code !== 0 && !ignore_errors) { + console.log(chalk.red(res.stderr || res.stdout)); + process.exit(res.code); + } +} + function get_answers(): Partial { let answers: Partial = {}; if (argv.answers) { @@ -690,8 +715,56 @@ function getMultiRegion(region: string) { return region; } -function sanitizeCustomerId(cid: string|number) { - return cid.toString().replaceAll('-', '').replaceAll(' ',''); +function sanitizeCustomerId(cid: string | number) { + return cid.toString().replaceAll('-', '').replaceAll(' ', ''); +} + +async function git_clone_repo(url: string, gaarf_folder: string) { + if (!fs.existsSync(gaarf_folder)) { + await exec_cmd( + `git clone ${url} --depth 1 ${gaarf_folder}`, + new clui.Spinner(`Cloning Gaarf repository (${url}), please wait...`) + ); + } else { + let git_user_name = ''; + try { + git_user_name = exec_sync('git config --get user.name', { + cwd: path.join(cwd, gaarf_folder), + }) + .toString() + .trim(); + // eslint-disable-next-line no-empty + } catch (e: unknown) { + // no user identity in git, that's ok + } + if (!git_user_name) { + // there's no user identity, git pull -ff can fail, let's set some arbitrary identity + const git_user_name = exec_sync('echo $USER').toString().trim() || 'user'; + const git_user_email = + exec_sync('echo $USER_EMAIL').toString().trim() || 'user@example.com'; + exec_sync(`git config --local user.name ${git_user_name}`, { + cwd: path.join(cwd, gaarf_folder), + }); + exec_sync(`git config --local user.email ${git_user_email}`, { + cwd: path.join(cwd, gaarf_folder), + }); + } + exec_sync('git pull --ff', {cwd: path.join(cwd, gaarf_folder)}); + } +} + +function dump_settings(settings: Record>): string { + let content = ''; + for (const name of Object.keys(settings)) { + content += `[${name}]\n`; + const section = settings[name]; + for (const key of Object.keys(section)) { + if (section[key]) { + content += ` ${key}=${section[key]}\n`; + } + } + } + return content; } async function init() { @@ -712,7 +785,7 @@ async function init() { )}PI ${chalk.redBright('R')}eport ${chalk.redBright('F')}etcher Workflow)` ); console.log( - 'You will be asked a bunch of questions to prepare and initialize your cloud infrastructure' + 'You will be asked a bunch of questions to prepare and initialize your Cloud infrastructure' ); console.log( 'It is best to run this script in a folder that is a parent for your queries' @@ -777,6 +850,12 @@ async function init() { : value; }, }, + { + type: 'input', + name: 'service_account', + message: + 'Custom service account name (leave blank to use the default one):', + }, { type: 'input', name: 'custom_ids_query_path', @@ -792,6 +871,7 @@ async function init() { const path_to_bq_queries = answers1.path_to_bq_queries; const path_to_bq_queries_abs = path.join(cwd, path_to_bq_queries); let gcs_bucket = answers1.gcs_bucket; + const service_account = answers1.service_account; if (!fs.existsSync(path_to_ads_queries_abs)) { fs.mkdirSync(path_to_ads_queries_abs); @@ -802,69 +882,39 @@ async function init() { console.log(chalk.grey(`Created '${path_to_bq_queries_abs}' folder`)); } const custom_ids_query_path = answers1.custom_ids_query_path; + const path_to_googleads_config = await initialize_googleads_config(answers); - gcs_bucket = (gcs_bucket || gcp_project_id).trim(); + // some warnings to users if queries and ads config don't exist + if (!fs.readdirSync(path_to_ads_queries).length) { + console.log( + chalk.red( + `Please place your ads scripts into '${path_to_ads_queries}' folder` + ) + ); + } + if (!fs.existsSync(path_to_googleads_config)) { + console.log( + chalk.red( + `Please put your Ads API config into '${path_to_googleads_config}' file` + ) + ); + } - const path_to_googleads_config = await initialize_googleads_config(answers); + gcs_bucket = (gcs_bucket || gcp_project_id).trim(); // clone gaarf repo const gaarf_folder = 'ads-api-fetcher'; - if (!fs.existsSync(gaarf_folder)) { - await exec_cmd( - `git clone ${GIT_REPO} --depth 1 ${gaarf_folder}`, - new clui.Spinner(`Cloning Gaarf repository (${GIT_REPO}), please wait...`) - ); - } else { - let git_user_name = ''; - try { - git_user_name = execSync('git config --get user.name', { - cwd: path.join(cwd, gaarf_folder), - }) - .toString() - .trim(); - // eslint-disable-next-line no-empty - } catch {} - if (!git_user_name) { - // there's no user identity, git pull -ff can fail, let's set some arbitrary identity - const git_user_name = execSync('echo $USER').toString().trim() || 'user'; - const git_user_email = - execSync('echo $USER_EMAIL').toString().trim() || 'user@example.com'; - execSync(`git config --local user.name ${git_user_name}`, { - cwd: path.join(cwd, gaarf_folder), - }); - execSync(`git config --local user.email ${git_user_email}`, { - cwd: path.join(cwd, gaarf_folder), - }); - } - execSync('git pull --ff', {cwd: path.join(cwd, gaarf_folder)}); - } + await git_clone_repo(GIT_REPO, gaarf_folder); // call the gaarf cli tool from the cloned repo to validate the ads credentials if ( fs.existsSync(path_to_googleads_config) && !answers.disable_ads_validation ) { - await exec_cmd( - 'npm install --prod', - new clui.Spinner('Installing dependencies...'), - { - cwd: `./${gaarf_folder}/js`, - } - ); - const res = await exec_cmd( - `./gaarf validate --ads-config=../../${path_to_googleads_config}`, - new clui.Spinner( - `Validating Ads credentials from ${path_to_googleads_config}...` - ), - {cwd: `./${gaarf_folder}/js`} - ); - if (res.code !== 0 && !ignore_errors) { - console.log(chalk.red(res.stderr || res.stdout)); - process.exit(res.code); - } + await validate_googeads_config(gaarf_folder, path_to_googleads_config); } - const gcp_region = await get_gcp_regions(answers); + const gcp_region = await ask_for_gcp_region(answers); // create a bucket const res = await exec_cmd( @@ -872,7 +922,8 @@ async function init() { new clui.Spinner(`Creating a GCS bucket ${gcs_bucket}`), {silent: true} ); - if (res.code !== 0 && + if ( + res.code !== 0 && !res.stderr.includes( `ServiceException: 409 A Cloud Storage bucket named '${gcs_bucket}' already exists` ) @@ -882,7 +933,7 @@ async function init() { } const gcs_base_path = `gs://${gcs_bucket}/${name}`; - // Create deploy-scripts.sh + // Create deploy-queries.sh let deploy_custom_query_snippet = ''; let custom_query_gcs_path; if (custom_ids_query_path) { @@ -918,9 +969,7 @@ fi ); // Create deploy-wf.sh - const workflow_name = name + '-wf'; - const function_name = name; - let cf_memory = ( + const cf_memory = ( await prompt( [ { @@ -942,46 +991,28 @@ fi answers ) ).cf_memory; + // create settings.ini: + const settings: Record> = { + common: { + name: name, + region: gcp_region, + 'service-account': service_account, + }, + functions: { + memory: cf_memory, + }, + }; deploy_shell_script( 'deploy-wf.sh', - `# Deploy Cloud Functions and Cloud Workflow + `# Deploy Cloud Functions and Cloud Workflows set -e cd ./${gaarf_folder} git pull --ff -cd ./gcp/workflow -./setup.sh --name ${workflow_name} --region ${gcp_region} -cd ./../functions -./setup.sh --name ${function_name} --memory ${cf_memory} --region ${gcp_region} - -# to enable debug logging -#gcloud functions deploy ${function_name} --update-env-vars LOG_LEVEL=debug --region ${gcp_region} +cd .. +./${gaarf_folder}/gcp/setup.sh deploy_all --settings $(readlink -f "./${settings_file}") ` ); - const has_ads_queries = !!fs.readdirSync(path_to_ads_queries).length; - const has_bq_queries = !!fs.readdirSync(path_to_bq_queries).length; - const has_adsconfig = fs.existsSync(path_to_googleads_config); - - if (!has_ads_queries) { - console.log( - chalk.red( - `Please place your ads scripts into '${path_to_ads_queries}' folder` - ) - ); - } - if (!has_adsconfig) { - console.log( - chalk.red( - `Please put your Ads API config into '${path_to_googleads_config}' file` - ) - ); - } - const progress = { - scripts_deployed: false, - wf_created: false, - wf_scheduled: false, - }; - // now we need parameters for running the WF let ads_customer_id; if (fs.existsSync(path_to_googleads_config)) { @@ -996,6 +1027,12 @@ cd ./../functions } const answers2 = await prompt( [ + { + type: 'input', + name: 'customer_id', + message: 'Ads account id (customer id, or a list of ids via ","):', + default: ads_customer_id, + }, { type: 'input', name: 'output_dataset', @@ -1006,12 +1043,6 @@ cd ./../functions return input.replace(/[ -]/g, '_'); }, }, - { - type: 'input', - name: 'customer_id', - message: 'Ads account id (customer id, or a list of ids via ","):', - default: ads_customer_id, - }, ], answers ); @@ -1046,22 +1077,15 @@ cd ./../functions bq_writer_options: bq_writer_options, ads_macro: macro_ads, bq_macro: macro_bq, - bq_sql: {}, }; + const wf_data_file = 'data.json'; + fs.writeFileSync(wf_data_file, JSON.stringify(wf_data, null, 2)); // Create run-wf.sh deploy_shell_script( 'run-wf.sh', `set -e -state=$(gcloud workflows run ${workflow_name} --location=${gcp_region} \ ---data='${JSON.stringify(wf_data, null, 2)}' --format="get(state)") -if [[ $state == 'FAILED' ]]; then - echo 'Execution failed' - exit -1 -else - echo 'Execution succeeded' - exit 0 -fi +./ads-api-fetcher/gcp/setup.sh run_wf --settings $(readlink -f "./${settings_file}") --data $(readlink -f "./${wf_data_file}") ` ); @@ -1089,7 +1113,6 @@ fi ); process.exit(res.code); } - progress.scripts_deployed = true; } else { console.log( chalk.yellow( @@ -1122,7 +1145,6 @@ fi ); process.exit(res.code); } - progress.wf_created = true; } else { console.log( chalk.yellow( @@ -1133,7 +1155,6 @@ fi const answers3 = await prompt( { - //when: progress.scripts_deployed && progress.wf_created, type: 'confirm', name: 'schedule_wf', message: 'Do you want to schedule a job for executing workflow:', @@ -1168,40 +1189,16 @@ fi } * * *`; answers3.run_job = answers_schedule.run_job; } + + settings['scheduler'] = settings['scheduler'] || {}; + settings['scheduler']['schedule'] = schedule_cron; + fs.writeFileSync(settings_file, dump_settings(settings)); + // Create schedule-wf.sh deploy_shell_script( 'schedule-wf.sh', `# Create Scheduler Job to execute Cloud Workflow -PROJECT_ID=${gcp_project_id} -PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="csv(projectNumber)" | tail -n 1) -# be default Cloud Worflows run under the Compute Engine default service account: -SERVICE_ACCOUNT=$PROJECT_NUMBER-compute@developer.gserviceaccount.com - -REGION=${gcp_region} -WORKFLOW_NAME=${workflow_name} -JOB_NAME=$WORKFLOW_NAME - -data='${JSON.stringify(wf_data, null, 2).replaceAll('"', '\\"')}' - -JOB_EXISTS=$(gcloud scheduler jobs list --location=$REGION --format="value(ID)" --filter="ID:'$JOB_NAME'") -if [[ -n $JOB_EXISTS ]]; then - gcloud scheduler jobs delete $JOB_NAME --location $REGION --quiet -fi - -# run the job daily at midnight -gcloud scheduler jobs create http $JOB_NAME \\ - --schedule="${schedule_cron}" \\ - --uri="https://workflowexecutions.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/workflows/$WORKFLOW_NAME/executions" \ - --location=$REGION \\ - --message-body="{\\"argument\\": \\"$data\\"}" \\ - --oauth-service-account-email="$SERVICE_ACCOUNT" \\ - --time-zone="Etc/UTC" - -# --time-zone="TIME_ZONE" \ -# timezone: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - -# to run the job: -#gcloud scheduler jobs run ${workflow_name} --location=${gcp_region} +./${gaarf_folder}/gcp/setup.sh schedule_wf --settings $(readlink -f "./${settings_file}") --data $(readlink -f "./${wf_data_file}") ` ); @@ -1215,10 +1212,10 @@ gcloud scheduler jobs create http $JOB_NAME \\ 'Created a Scheduler Job. You can recreate it with different settings by running schedule-wf.sh' ); } - progress.wf_scheduled = true; if (answers3.run_job) { // running the job + const workflow_name = name + '-wf'; const res = await exec_cmd( `gcloud scheduler jobs run ${workflow_name} --location=${gcp_region}`, null, @@ -1304,7 +1301,7 @@ gcloud scheduler jobs create http $JOB_NAME \\ // at last stage we'll copy all shell scripts to same GCS bucket in scrips folders, so another users could manage the project easily await exec_cmd( - `gsutil -m cp *.sh ${gcs_base_path}/scripts/`, + `gsutil -m cp *.sh ${gcs_base_path}/scripts/;gsutil -m cp ${settings_file} ${gcs_base_path}/scripts/;gsutil -m cp ${wf_data_file} ${gcs_base_path}/scripts/`, new clui.Spinner( `Copying all shell scripts to GCS ${gcs_base_path}/scripts` ), @@ -1315,9 +1312,12 @@ gcloud scheduler jobs create http $JOB_NAME \\ 'download-scripts.sh', `for file in *.sh; do [ -e "$file" ] || continue - cp -- "$file" "$\{file\}.bak" + cp -- "$file" "$\{file}.bak" done -gsutil -m cp ${gcs_base_path}/scripts/*.sh .` +gsutil -m cp ${gcs_base_path}/scripts/*.sh . +gsutil -m cp ${gcs_base_path}/scripts/${settings_file} . +gsutil -m cp ${gcs_base_path}/scripts/${wf_data_file} . +` ); console.log( @@ -1340,12 +1340,12 @@ gsutil -m cp ${gcs_base_path}/scripts/*.sh .` console.log( ` 🔹 ${chalk.cyan( 'run-wf.sh' - )} - execute workflow directly, see arguments inside` + )} - execute workflow directly, see arguments in ${wf_data_file}` ); console.log( ` 🔹 ${chalk.cyan( 'schedule-wf.sh' - )} - reschedule workflow execution, see arguments inside` + )} - reschedule workflow execution, see arguments in ${wf_data_file}` ); console.log( ` 🔹 ${chalk.cyan( diff --git a/gcp/functions/deploy.sh b/gcp/functions/deploy.sh index 101587e6..57b78a9b 100755 --- a/gcp/functions/deploy.sh +++ b/gcp/functions/deploy.sh @@ -24,10 +24,13 @@ CYAN='\033[0;36m' RED='\033[0;31m' NC='\033[0m' +SCRIPT_PATH=$(readlink -f "$0" | xargs dirname) +pushd $SCRIPT_PATH > /dev/null + FUNCTION_NAME=gaarf -REGION=us-central1 +REGION= MEMORY=1024MB -RETRIES=5 +RETRIES=10 MAX_INSTANCES= while :; do @@ -38,7 +41,7 @@ while :; do ;; -r|--region) shift - REGION=$1 + REGION=--region=$1 ;; -m|--memory) shift @@ -59,6 +62,10 @@ while :; do shift MAX_INSTANCES=--max-instances=$1 ;; + --service-account) + shift + SERVICE_ACCOUNT=--service-account=$1 + ;; *) break esac @@ -78,10 +85,11 @@ function execute_deploy() { --runtime=nodejs18 \ --timeout=3600s \ --memory=$memory \ - --region=$REGION \ + $REGION \ --quiet \ --gen2 \ $MAX_INSTANCES \ + $SERVICE_ACCOUNT \ --source=. echo $? > $statusfile } @@ -94,7 +102,7 @@ function redeploy_cf() { memory='512MB' # default memory for CF Gen2 usually not enough to build them, with 512 it works fine fi # it's ok if it fails: - gcloud functions delete $deployable_function --gen2 --region=$REGION --quiet 2> /dev/null + gcloud functions delete $deployable_function --gen2 $REGION --quiet 2> /dev/null echo -e "${CYAN}Deploying $deployable_function Cloud Function${NC}" if [[ $NO_RETRY ]]; then @@ -117,6 +125,10 @@ function redeploy_cf() { break else if [[ $output == *"OperationError: code=7, message=Unable to retrieve the repository metadata"* ]]; then + if [[ $i -eq $RETRIES ]]; then + echo -e "${RED}Breaking script as maximum number of retries ($RETRIES) exceeded${NC}" + exit $exitcode + fi echo -e "${CAYN}Retrying the deployment ($i)...${NC}" continue else @@ -140,3 +152,5 @@ redeploy_cf $FUNCTION_NAME-getcids main_getcids $MEMORY_GETCIDS redeploy_cf $FUNCTION_NAME-bq main_bq redeploy_cf $FUNCTION_NAME-bq-view main_bq_view + +popd > /dev/null diff --git a/gcp/functions/setup.sh b/gcp/functions/setup.sh index f0316a2f..3860f65a 100755 --- a/gcp/functions/setup.sh +++ b/gcp/functions/setup.sh @@ -18,6 +18,7 @@ # causes the shell to exit if any subcommand or pipeline returns a non-zero status # (free us of checking exitcode after every command) set -e +echo -e "\033[0;31mWARNING: this script is obsolete, please use gcp/setup.sh.\033[0m" enable_api() { gcloud services enable compute.googleapis.com diff --git a/gcp/setup.sh b/gcp/setup.sh index f6269220..a5a10b60 100755 --- a/gcp/setup.sh +++ b/gcp/setup.sh @@ -1,5 +1,226 @@ -cd ./functions -./setup.sh -n $1 -cd ../workflow -./setup.sh -n $1-wf +#!/bin/bash +# +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------ +SETTING_FILE="./settings.ini" +SCRIPT_PATH=$(readlink -f "$0" | xargs dirname) +SETTING_FILE="${SCRIPT_PATH}/settings.ini" +# changing the cwd to the script's contining folder so all pathes inside can be local to it +# (important as the script can be called via absolute path and as a nested path) +pushd $SCRIPT_PATH > /dev/null + +args=() +started=0 +for ((i=1; i<=$#; i++)); do + if [[ ${!i} == --* ]]; then started=1; fi + if [ ${!i} = "--settings" ]; then + ((i++)) + SETTING_FILE=${!i} + elif [ $started = 1 ]; then + args+=("${!i}") + fi +done +echo "Using settings from $SETTING_FILE" + +PROJECT_ID=$(gcloud config get-value project 2> /dev/null) +PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="csv(projectNumber)" | tail -n 1) +# be default Cloud Worflows run under the Compute Engine default service account: +SERVICE_ACCOUNT=$(git config -f $SETTING_FILE common.service-account || echo $PROJECT_NUMBER-compute@developer.gserviceaccount.com) +NAME=$(git config -f $SETTING_FILE common.name || echo "gaarf") +REGION=$(git config -f $SETTING_FILE common.region || echo "europe-west1") +WORKFLOW_NAME=$NAME-wf + +enable_apis() { + gcloud services enable compute.googleapis.com + # apis for workflow + gcloud services enable workflows.googleapis.com + gcloud services enable workflowexecutions.googleapis.com + gcloud services enable cloudscheduler.googleapis.com + # apis for cloud functions + gcloud services enable artifactregistry.googleapis.com # required for Gen2 GCF + gcloud services enable run.googleapis.com # required for Gen2 GCF + gcloud services enable cloudresourcemanager.googleapis.com + gcloud services enable iamcredentials.googleapis.com + gcloud services enable cloudbuild.googleapis.com + gcloud services enable bigquery.googleapis.com + gcloud services enable cloudfunctions.googleapis.com + gcloud services enable googleads.googleapis.com +} + + +set_iam_permissions() { + # Permissions for Workflow: + # grant the default service account with read permissions on Cloud Storage + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/storage.objectViewer + # grant the default service account with execute permissions on Cloud Functions gen2 (CF) + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/run.invoker + # grant the default service account with write permissions on Cloud Logging + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/logging.logWriter + # grant the default service account with view permissions (cloudfunctions.functions.get) on CF + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/cloudfunctions.viewer + # grant the default service account with execute permissions on Cloud Workflow (this is for Scheduler which also runs under the default GCE SA) + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role roles/workflows.invoker + # grant the default service account with permissions on to publish pubsub messages + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role roles/pubsub.admin #topics.publish + # Permissions for Cloud Functions: + # Required for calling Cloud Function Gen2 + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/cloudfunctions.serviceAgent + # Grant the default service account with read permissions on Cloud Storage + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/storage.objectViewer + # Grant the default service account with admin permissions in BigQuery + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/bigquery.admin + # For deploying Gen2 CF 'artifactregistry.repositories.list' and 'artifactregistry.repositories.get' permissions are required + gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/artifactregistry.repoAdmin +} + + +create_wf_completion_topic() { + # create completion topic + TOPIC=$(git config -f $SETTING_FILE workflows.topic || echo "gaarf_wf_completed") + TOPIC_EXISTS=$(gcloud pubsub topics list --filter="name.scope(topic):'$TOPIC'" --format="get(name)") + if [[ ! -n $TOPIC_EXISTS ]]; then + gcloud pubsub topics create $TOPIC + fi +} + + +deploy_functions() { + CF_MEMORY=$(git config -f $SETTING_FILE functions.memory) + if [[ -n $CF_MEMORY ]]; then + CF_MEMORY="--memory $CF_MEMORY" + fi + + ./functions/deploy.sh --name $NAME $CF_MEMORY --region $REGION --service-account $SERVICE_ACCOUNT +} + + +enable_debug_logging() { + gcloud functions deploy $NAME --update-env-vars LOG_LEVEL=debug --region $REGION + gcloud functions deploy $NAME-getcids --update-env-vars LOG_LEVEL=debug --region $REGION + gcloud functions deploy $NAME-bq --update-env-vars LOG_LEVEL=debug --region $REGION + gcloud functions deploy $NAME-bq-view --update-env-vars LOG_LEVEL=debug --region $REGION +} + + +deploy_wf() { + ./workflow/deploy.sh --name $WORKFLOW_NAME --region $REGION --service-account $SERVICE_ACCOUNT +} + + +_get_data() { + # we'll get a path to data json file with job's args from --data cli argument + local DATA_FILE + for ((i=1; i<=$#; i++)); do + if [ ${!i} = "--data" ]; then + ((i++)) + DATA_FILE=${!i} + break + fi + done + data=$(<${DATA_FILE}) + echo $data +} + +schedule_wf() { + JOB_NAME=$WORKFLOW_NAME + SCHEDULE=$(git config -f $SETTING_FILE scheduler.schedule || echo "0 0 * * *") + SCHEDULE_TZ=$(git config -f $SETTING_FILE scheduler.schedule-timezone|| echo "Etc/UTC") + + data=$(_get_data $@) + + JOB_EXISTS=$(gcloud scheduler jobs list --location=$REGION --format="value(ID)" --filter="ID:'$JOB_NAME'") + if [[ -n $JOB_EXISTS ]]; then + gcloud scheduler jobs delete $JOB_NAME --location $REGION --quiet + fi + + # run the job daily at midnight + gcloud scheduler jobs create http $JOB_NAME \ + --schedule="$SCHEDULE" \ + --uri="https://workflowexecutions.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/workflows/$WORKFLOW_NAME/executions" --location=$REGION \ + --message-body="{\"argument\": \"$data\"}" \ + --oauth-service-account-email="$SERVICE_ACCOUNT" \ + --time-zone="$SCHEDULE_TZ" +} + + +run_wf() { + data=$(_get_data $@) + state=$(gcloud workflows run $WORKFLOW_NAME --location=$REGION --data="$data" --format="get(state)") + if [[ $state == 'FAILED' ]]; then + echo 'Execution failed' + exit 1 + else + echo 'Execution succeeded' + exit 0 + fi +} + + +delete_all() { + echo "Deleting Functions" + # delete functions + gcloud functions delete $NAME --region $REGION --quiet 2> /dev/null + gcloud functions delete $NAME-getcids --region $REGION --quiet 2> /dev/null + gcloud functions delete $NAME-bq --region $REGION --quiet 2> /dev/null + gcloud functions delete $NAME-bq-view --region $REGION --quiet 2> /dev/null + # delete workflows + echo "Deleting Worflows" + gcloud workflows delete $WORKFLOW_NAME --location=$REGION --quiet 2> /dev/null + gcloud workflows delete $WORKFLOW_NAME-ads --location=$REGION --quiet 2> /dev/null + # delete schedule job + echo "Deleting Scheduler Job" + gcloud scheduler jobs delete $WORKFLOW_NAME --location $REGION --quiet 2> /dev/null +} + + +deploy_all() { + enable_apis + set_iam_permissions + deploy_functions + create_wf_completion_topic + deploy_wf +} + + +_list_functions() { + # list all functions in this file not starting with "_" + declare -F | awk '{print $3}' | grep -v "^_" +} + + +if [[ $# -eq 0 ]]; then + echo "USAGE: $0 target1 target2 ... [--settings /path/to/settings.ini]" + echo " where supported targets:" + _list_functions +else + for i in "$@"; do + if [[ $i == --* ]]; then + break + fi + if declare -F "$i" > /dev/null; then + "$i" ${args[@]} + exitcode=$? + if [ $exitcode -ne 0 ]; then + echo "Breaking script as command '$i' failed" + exit $exitcode + fi + else + echo -e "\033[0;31mFunction '$i' does not exist.\033[0m" + fi + done +fi + +popd > /dev/null diff --git a/gcp/workflow/deploy.sh b/gcp/workflow/deploy.sh index 9b2c3935..3eeb3218 100755 --- a/gcp/workflow/deploy.sh +++ b/gcp/workflow/deploy.sh @@ -14,9 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. #------------------------------------------------------------------------------ +SCRIPT_PATH=$(readlink -f "$0" | xargs dirname) +pushd $SCRIPT_PATH > /dev/null WORKFLOW_NAME=gaarf-wf -REGION=us-central1 +REGION= +SERVICE_ACCOUNT= while :; do case $1 in @@ -26,7 +29,11 @@ while :; do ;; -r|--region) shift - REGION=$1 + REGION=--location=$1 + ;; + -sa|--service-account) + shift + SERVICE_ACCOUNT=--service-account=$1 ;; *) break @@ -34,7 +41,8 @@ while :; do shift done -gcloud workflows deploy ${WORKFLOW_NAME}-ads --source=workflow-ads.yaml --location=$REGION +gcloud workflows deploy ${WORKFLOW_NAME}-ads --source=workflow-ads.yaml $REGION $SERVICE_ACCOUNT -gcloud workflows deploy ${WORKFLOW_NAME} --source=workflow.yaml --location=$REGION +gcloud workflows deploy ${WORKFLOW_NAME} --source=workflow.yaml $REGION $SERVICE_ACCOUNT +popd > /dev/null diff --git a/gcp/workflow/setup.sh b/gcp/workflow/setup.sh index 4012add4..6f7fa853 100755 --- a/gcp/workflow/setup.sh +++ b/gcp/workflow/setup.sh @@ -18,6 +18,7 @@ # causes the shell to exit if any subcommand or pipeline returns a non-zero status # (free us of checking exitcode after every command) set -e +echo -e "\033[0;31mWARNING: this script is obsolete, please use gcp/setup.sh.\033[0m" enable_api() { gcloud services enable compute.googleapis.com diff --git a/js/package-lock.json b/js/package-lock.json index b86a6a82..aa0f8f66 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@types/async": "^3.2.20", + "@types/async": "^3.2.24", "@types/mocha": "^10.0.1", "@types/nunjucks": "^3.2.3", "mocha": "^10.2.0", @@ -1123,9 +1123,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.20", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.20.tgz", - "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", + "version": "3.2.24", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.24.tgz", + "integrity": "sha512-8iHVLHsCCOBKjCF2KwFe0p9Z3rfM9mL+sSP8btyR5vTjJRAqpBYD28/ZLgXPf0pjG1VxOvtCV/BgXkQbpSe8Hw==", "dev": true }, "node_modules/@types/caseless": { diff --git a/js/package.json b/js/package.json index 7be7bdc1..37e44650 100644 --- a/js/package.json +++ b/js/package.json @@ -67,7 +67,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@types/async": "^3.2.20", + "@types/async": "^3.2.24", "@types/mocha": "^10.0.1", "@types/nunjucks": "^3.2.3", "mocha": "^10.2.0",