无法使用 Node 从 GitHub Action 中的 repo 加载 json 文件

Posted

技术标签:

【中文标题】无法使用 Node 从 GitHub Action 中的 repo 加载 json 文件【英文标题】:Cannot load json file from repo in GitHub Action with Node 【发布时间】:2021-09-30 17:48:28 【问题描述】:

我正在尝试创建一个 GitHub 操作:

在 repo 中浏览调用该操作的文件夹 将此文件夹中的文件作为 JSON 模式加载到 ajv 实例中 针对实例验证同一 repo 中的文件

我的问题是: 我的 Node 脚本在本地环境中运行良好,但在加载 JSON 文件时显示错误:

Error: Cannot find module './GeoJSON_schemas/LineString.json'
Require stack:
- /home/runner/work/_actions/idrissad/jsonschema_validator/v1.0/dist/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:797:15)
    at Function.Module._load (internal/modules/cjs/loader.js:690:27)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at /home/runner/work/_actions/idrissad/jsonschema_validator/v1.0/dist/index.js:8105:19
    at /home/runner/work/_actions/idrissad/jsonschema_validator/v1.0/dist/index.js:8118:3
    at Object.<anonymous> (/home/runner/work/_actions/idrissad/jsonschema_validator/v1.0/dist/index.js:8121:12)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32) 
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/runner/work/_actions/idrissad/jsonschema_validator/v1.0/dist/index.js'
  ]

这里是动作代码:

const core = require('@actions/core');
const fs = require('fs');
//const path = require('path');


const schema_path = core.getInput('main_schema_path');
const schemas_dir = core.getInput('additional_schemas_dir');
const data = core.getInput('data_path');

const Ajv = require("ajv");
const addFormats = require("ajv-formats");
const ajv = new Ajv(allErrors: true, strict: false);
addFormats(ajv);

let add_schemas = fs.readdirSync(schemas_dir);

for (let add_schema of add_schemas) 
    add_schema_path = schemas_dir + add_schema
    ajv.addSchema(require(add_schema_path), add_schema); //THIS REQUIRE IS THE ONE THAT DOESN'T WORK
;

const schema = require(schema_path);
const validate = ajv.compile(schema);

test(require(data_path));

function test(data) 
  const valid = validate(data);
  if (valid) core.setOutput('validity', "Valid!")
    else core.setOutput('validity', "Invalid: " + ajv.errorsText(validate.errors))
;

GitHub Action repo 的链接:(https://github.com/IdrissaD/jsonschema_validator) 工作流错误链接:(https://github.com/PnX-SI/schema_randonnee/runs/3144851785)

所以我尝试加载的 JSON 文件不是一个模块(至少我相信如此),并且我的脚本在本地使用“相同”代码完美地加载它。不同之处在于我使用来自 yml 工作流文件的输入来构建路径。

我不明白脚本是否只是没有到达正确的位置,因此没有找到任何名为 LineString.json 的文件,或者它是否到达了正确的文件夹但无法加载文件因为它需要一个模块?

我相信这可能与我在 GitHUb 上下文中编写 fs.readDirSync 的方式有关(与本地环境相比),但我很难理解解决方案。

【问题讨论】:

调用脚本和LineString.json的绝对路径是什么? 【参考方案1】:

好的,我知道了,运行脚本的目录实际上是 /home/runner/work/schema_randonnee/schema_randonnee/(在 actions/checkout@v2 运行的工作流日志中可见)。 因此,通过在我的所有输入值(main_schema_pathadditional_schemas_dirdata_path)之前添加 /home/runner/work/schema_randonnee/schema_randonnee/GeoJSON_schemas/,脚本可以访问工作流 repo 中的文件!

结论

操作checkout@v2 检出$GITHUB_WORKSPACE 下的存储库(参见README),并且此环境值默认在/home/runner/work/my-repo-name/my-repo-name 上定义,在this GitHub doc 中可见。在运行 checkout 操作时没有更改,它是指示您正在调用的 GitHub 操作的目录(如果我理解得很好,默认情况下它运行在与 /home 相同的级别)。

编辑: 甚至比以前的解决方案更好,我应该这样使用 generated$GITHUB_WORKSPACE 变量:

steps:
      - name: checking out repo
        uses: actions/checkout@v2
      - name: build the schema and validate the data
        uses: idrissad/jsonschema_validator@main
        id: validation
        with:
          main_schema_path: $ github.workspace /schema.json
          additional_schemas_dir: $ github.workspace /GeoJSON_schemas/
          data_path: $ github.workspace /exemple-valide.json

【讨论】:

以上是关于无法使用 Node 从 GitHub Action 中的 repo 加载 json 文件的主要内容,如果未能解决你的问题,请参考以下文章

Rails Github Action 无法填写动作文本

GitHub Action 无法构建 firebase 应用程序 w9jds/firebase-action

无法在 GitHub 操作中将 Node.js 与 Docker MySQL 数据库连接

Github Action 部署到阿里云ECS

CI/CD 平台迁移实践:从 Travis-CI 转移到 Github Action

从 Github Action 部署到 Github 包注册表