需要一种方法将docker参数中的单个字符串转换为多个参数



我编写了一个小的Golang程序,它从GitHub PR中获取N个参数(具有资源分配请求的K8s的文件),并写入一个带有请求的CPU和内存总量的文件,然后在下一步中导出为GHA输出。

不能做go run main.go /path/to/file1 /path/to/file2,因为显然我在actions/setup-go中遇到了一个bug,所以我不得不把它容器化。

我对这些都不熟悉,所以我的同事告诉我从一个自制的GitHub动作中导入docker程序,当PR中只有一个文件被更改时(只有一个参数需要处理),所有的工作都像一个魅力。

问题是当传递2个或更多的参数时,因为使用:tj-actions/changed-files的操作输出一个包含所有文件名的字符串,我真的不知道如何解决它。

我是这样称呼自制动作的:

- name: Capture request values actions
uses: ./goCapacityCheck
with:
files: ${{ steps.changed-files.outputs.all_changed_files }}

goCapacityCheck action.yml

name: 'goCapacityCheck'
description: 'Capture requests CPU and Memory values from all files in the PR'
inputs:
files:
description: 'files changed in the PR.'
required: false
runs:
using: 'docker'
image: './Dockerfile'
args:
- ${{ inputs.files }}

是否有一种方法来分割字符串时,传递给动作?或者给Docker什么的?

当我遇到这个问题时,我没有尝试太多,但我希望看起来像"/path/to/file1 /path/to/file2"的刺在某个时候被分裂,以便能够做到docker run --name mygocap gocap /path/to/file1 /path/to/file2

我最终不得不在go程序中处理它,因为我永远不会知道有多少参数会进来,所以我从os.Args[]调用getFileNames(),然后我用filenames而不是直接使用os.Args[1:]执行例程的其余部分。

func main() {
filenames := getFileNames(os.Args[1:]) {
for _, file := range filenames {
// handling of the file data
fmt.Println(file)
}

func getFileNames(s []string) []string {
var filenames []string
for _, file := range s {
if strings.Contains(file, " ") {
filenames = append(filenames, strings.Split(file, " ")...)
} else {
filenames = append(filenames, file)
}
}
return filenames
}

您可以尝试使用一些bash技巧进行分割,例如:


string="/path/to/file1 /path/to/file2"
echo "$(echo $string | cut -d' ' -f1)" "$(echo $string | cut -d' ' -f2)"

将打印

"/path/to/file1" "/path/to/file2"

所以你可以在GitHub的动作工作流中尝试这样的东西:

- name: run
run: |
string=${{ steps.changed-files.outputs.all_changed_files }}
first=$(echo $string | cut -d' ' -f1)
second=$(echo $string | cut -d' ' -f2)
docker run --name mygocap gocap $first $second

相关内容

最新更新