update_ci_variables.js 2.4 KB
Newer Older
1 2 3 4 5 6
const fs = require('fs');
const path = require('path');
const fetch = require('cross-fetch');

const VARIABLE_JSON_PATH = path.join(__dirname, '../src/completion/ci_variables.json');

K
Kev 已提交
7 8
const docsLinkBasePath = 'https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/ci/variables/';

9 10 11 12 13 14
async function fetchDocumentation() {
  return fetch(
    'https://gitlab.com/gitlab-org/gitlab/-/raw/master/doc/ci/variables/predefined_variables.md',
  ).then(res => res.text());
}

15 16 17
const headerLineRegex = /^\|\s+Variable/;
const dividerLineRegex = /^\|-+/;
const tableLineRegex = /^\|.+\|.+\|.+\|.+\|$/;
K
Kev 已提交
18
const descriptionLinkRegex = /\]\((?!https?:\/\/)([^)]+)\)/;
19

20 21
function parseDocumentation(variableMarkdown) {
  const lines = variableMarkdown.split('\n');
22 23 24 25 26
  const tableLines = lines.filter(l => l.match(tableLineRegex));
  const tableLinesWithoutHeaders = tableLines.filter(
    l => !l.match(headerLineRegex) && !l.match(dividerLineRegex),
  );
  const variables = tableLinesWithoutHeaders.map(l => {
27 28 29 30
    const [, nameSegment, , , descriptionSegment] = l.split('|');

    if (!nameSegment) return undefined;

K
Kev 已提交
31 32 33 34
    const description = descriptionSegment
      .trim()
      .replace(descriptionLinkRegex, `](${docsLinkBasePath}$1)`);

35 36
    return {
      name: nameSegment.trim().replace(/`/g, ''),
K
Kev 已提交
37
      description,
38 39 40
    };
  });

41 42 43
  // avoid computing a difference based on order in the docs
  variables.sort((a, b) => (a.name < b.name ? -1 : 1));

44 45 46 47 48 49 50 51 52
  const json = JSON.stringify(variables.filter(Boolean), undefined, 2);
  return `${json}\n`;
}

function loadExistingVariablesJson() {
  return fs.readFileSync(VARIABLE_JSON_PATH).toString();
}

function writeVariablesJson(json) {
53
  return fs.writeFileSync(VARIABLE_JSON_PATH, json);
54 55 56 57 58 59 60 61 62
}

async function run() {
  const onlineDoc = await fetchDocumentation();
  const onlineVariablesJson = parseDocumentation(onlineDoc);
  const existingVariablesJson = loadExistingVariablesJson();

  if (process.env.CI && onlineVariablesJson !== existingVariablesJson) {
    console.error(
T
Tomas Vik 已提交
63
      '❌ ./src/utils/ci_variables.json has changed, go to https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/blob/main/docs/developer/ci-variables.md.',
64 65 66 67 68 69 70 71 72 73 74 75
    );
    process.exit(1);
  }
  if (onlineVariablesJson !== existingVariablesJson) {
    writeVariablesJson(onlineVariablesJson);
    console.log('✅ ./src/utils/ci_variables.json was updated successfully.');
  } else {
    console.log('ℹ️ No changes to ./src/utils/ci_variables.json.');
  }
}

run();