代码之家  ›  专栏  ›  技术社区  ›  Mixchange

从github复合操作输出多行值,以便订阅工作流可以使用它

  •  0
  • Mixchange  · 技术社区  · 1 年前

    在我的GitHub复合操作中,我试图从文件中输出一个多行字符串,以便订阅我的操作的工作流可以将该文本放入问题中。我无法以正常方式将输出设置为多行值:

      FOLDER=$(ls -d */ | grep -E '^my-dynamically-named-artifact-folder-*')
      FILE_PATH="${FOLDER}file.txt"
      echo "FILE_PATH=$FILE_PATH" >> $GITHUB_ENV
      echo "$FILE_PATH"
      # Get contents of files if they exist
      if [ -f "$FILE_PATH" ]; then
        FILE_TEXT=$(cat "$FILE_PATH")
      else
        FILE_TEXT="report.txt does not exist"
      fi
      
      echo "This is the file text:\n$FILE_TEXT"
      
      echo "FILE_TEXT=$FILE_TEXT" >> "$GITHUB_OUTPUT"
      echo "FILE_TEXT=$FILE_TEXT" >> $GITHUB_ENV
    

    控制台使用记录了文件文本的正确输出 echo 你可以看到上面的内容,但我在之后的操作中出现了以下错误:

    Error: Unable to process file command 'env' successfully.
    Error: Value cannot be null. (Parameter 'name')
    Error: Unable to process file command 'output' successfully.
    Error: Value cannot be null. (Parameter 'name')
    

    订阅工作流得到了一个空字符串。我做了一些研究,然后用以下内容创建了变量:

      echo 'FILE_TEXT<<EOF' >> $GITHUB_OUTPUT
      echo $FILE_TEXT >> $GITHUB_OUTPUT
      echo 'EOF' >> $GITHUB_OUTPUT
    

    它完成时没有出现错误,但它将输出转换为一行文本,这不是我想要的。经过更多的研究,我尝试在将其放入变量之前转换为基数64:

      B64=$(echo -n "$DEBUG_LOG" | base64)
      echo "B64=$B64" >> "$GITHUB_OUTPUT"
    

    它将部分文本转换为基数64,然后在中间停止,可能是在一些破折号周围( - ). 紧接着,它又出现了一个错误:

    Error: Unable to process file command 'output' successfully.
    Error: Invalid format 'aVeryShortNumberOfBase64EncodingCharacters'
    

    我编写的订阅工作流确实将部分编码的文本正确地放入了问题中,但这显然还不够好。

    我没有尝试替换换行符,因为我发现当github改变了我们创建输出变量的方式时,响应显示它停止了工作。

    我如何将这些多行文本发送给我的用户,以便他们将其放入自己的问题中?

    1 回复  |  直到 1 年前
        1
  •  0
  •   Mixchange    1 年前

    这是一种横向的解决方案,但它已经足够满足我的需求了。我找不到任何解决方案来取出多行字符串。相反,我将文件的名称放在输出中。这样,订阅工作流就不必担心我对所创建工件的目录结构所做的任何更改。他们也不必担心我的操作会动态生成文件夹名称。然后,他们可以自己使用文件的内容。

    简化(未经测试)的复合动作代码:

    name: "Get file"
    outputs:
      FILEPATH:
        description: 'An empty string ("") or the path to the artifact file. Remember to check for the existence of the file before using it.'
        value: ${{ steps.files.outputs.INFO_FILE_PATH }}
    runs:
      using: "composite"
      steps:
        - uses: actions/checkout@v4
        # other steps
        - name: "Make paths"
          if: ${{ always() }}
          id: files
          shell: bash
          run: |
            # Example value: "files123/"
            FOLDER=$(ls -d */ | grep -E '^files*' || true)
            echo "$FOLDER"
            if [[ "$FOLDER" = "" ]]; then
              echo "No artifacts"
            else
              PATH_TO_MULTILINE_TEXT="${FOLDER}info.txt"
              if [ -f "$PATH_TO_MULTILINE_TEXT" ]; then
                echo "Found info file"
              else
                echo "Missing info file"
                PATH_TO_MULTILINE_TEXT=""
              fi
            fi
            echo "INFO_FILE_PATH=$PATH_TO_MULTILINE_TEXT" >> "$GITHUB_OUTPUT"
    

    然后,订阅工作流会这样使用它(也是未经测试的):

    name: Do stuff
    on:
      push:
    jobs:
      a job name:
        # other stuff
        steps:
          - uses: actions/checkout@v4
          - name: Run the composite action
            id: the_action
            uses: owner/repo@branch
          - name: Make issue with the multi-line info
            env:
              GH_TOKEN: ${{ github.token }}
              INFO_PATH: "${{ steps.the_action.outputs.FILEPATH }}"
            run: |
              if [ -f "${{ env.INFO_PATH }}" ]; then
                INFO_TEXT=$(cat "${{ env.INFO_PATH }}")
              else
                INFO_TEXT="Missing info path"
              fi
    
              gh issue create --repo "$GITHUB_REPOSITORY" --title "Some title" --body "See the action ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}. See the info output below.
    
              $INFO_TEXT"
    

    但不确定这是否真的是公认的答案,因为它不能解决实际问题。