【问题标题】:How to run same github actions job multiple times?如何多次运行相同的 github 操作作业?
【发布时间】:2022-09-28 22:49:34
【问题描述】:

我正在使用 gradle。我有这样的项目:

project/
--- sub1/
--- sub2/

我想将工件作为 2 个不同的文件上传(即分别为 sub1.jar sub2.jar)。

实际上,我正在使用这份工作:

- uses: actions/upload-artifact@v3
  with:
    name: Artifacts
    path: project*/build/libs/*.jar

但上传的文件只有一个文件,文件有子文件夹。

我尝试运行相同的 upload-artifact 作业,但参数不同。我不能那样做。

我不想复制/粘贴同一个工作,因为将来我会有多个子项目,我不想有 50 行或相同的代码......

如何上传生成的文件,或多次运行相同的作业?

标签: gradle github-actions


【解决方案1】:

因此,使用矩阵策略将允许您对输入列表执行此操作。

您可以在工作流程中执行类似的操作,该工作流程将对矩阵中的每个值执行相同的步骤。

  some-job:
    name: Job 1
    runs-on: ubuntu-latest
    strategy:
      matrix:
        subdir: [sub1, sub2]
    steps:
      - name: Create some files
        run: echo "test data" > /tmp/${{ matrix.subdir }}/.test.jar

      - uses: actions/upload-artifact@v3
        with:
          name: Artifacts
          path: /tmp/${{ matrix.subdir }}/*.jar

【讨论】:

  • 如果我这样做,它将使用 gradle 构建插件 2 次
  • 明白了。也许只是为上传步骤做矩阵部分
  • 是的,但我该怎么做?
  • 我刚刚尝试了多个作业,但文件没有在作业之间保存
【解决方案2】:

这似乎不可能,所以我制作了自己的脚本。我使用与actions/upload-artifact 相同的代码进行上传。

我们应该使用所需的依赖项@actions/artifact 运行 JS 脚本。因此,设置节点和 dep 有 2 个操作。

我的代码是这样的:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16
      - name: Install NPM package
        run: npm install @actions/artifact
      - uses: actions/github-script@v6
        name: Artifact script
        with:
          script: CHECK MY SCRIPT BELOW

我正在使用此脚本上传所有子文件夹中的所有文件:

let artifact = require('@actions/artifact');

const fs = require('fs');
function getContentFrom(path, check) {
   return fs.readdirSync(path).filter(function (file) {
      return check == fs.statSync(path+'/'+file).isDirectory();
   });
}
function getDirectories(path) {
   return getContentFrom(path, true);
}
function getFiles(path) {
   return getContentFrom(path, false);
}
const artifactClient = artifact.create();
for(let sub of getDirectories("./")) { // get all folders
   console.log("Checking for", sub);

   let filesDir = "./" + sub; // if you are using multiples folder
   let files = [];
   for(let build of getFiles(filesDir)) {
       // here you can filter which files to upload
       files.push(filesDir + "/" + build);
   }

   console.log("Uploading", files);

   await artifactClient.uploadArtifact(
      "Project " + sub,
      files,
      filesDir,
      { continueOnError: false }
   )
}

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 2016-07-05
    • 2011-01-16
    • 2015-04-26
    • 2018-09-28
    • 1970-01-01
    • 2020-04-19
    • 2019-03-19
    相关资源
    最近更新 更多