如何在GitHub Actions中对Pulumi输出的kubeconfig进行Base64编码?
解决GitHub Actions中Pulumi输出kubeconfig的Base64编码错误
错误原因
你遇到的command not found错误,本质是因为Pulumi输出的kubeconfig是多行YAML结构,直接在shell命令中展开时,换行、冒号等特殊字符会被shell误解析为多个独立命令,比如kubeconfig里的certificate-authority-data:行被当成了要执行的命令,导致报错。
正确解决方案
方案1:用单引号包裹kubeconfig内容(简单直接)
通过单引号将Pulumi输出的kubeconfig内容包裹,避免shell解析其中的换行和特殊字符:
- run: | echo "KUBE_CONFIG=$(echo -n '${{ steps.pulumi.outputs.kubeconfig }}' | base64 -w 0)" >> $GITHUB_ENV
注意:如果你的kubeconfig内容本身包含单引号,这个方法会失效,建议用方案2。
方案2:通过临时文件中转(兼容性最好)
先将kubeconfig写入临时文件,再对文件内容做Base64编码,彻底规避shell解析问题:
- name: 编码kubeconfig并写入环境变量 run: | # 将kubeconfig写入临时文件 echo "${{ steps.pulumi.outputs.kubeconfig }}" > kubeconfig.tmp # 对文件内容做Base64编码(-w 0取消换行) KUBE_CONFIG=$(base64 -w 0 kubeconfig.tmp) # 写入GitHub环境变量 echo "KUBE_CONFIG=$KUBE_CONFIG" >> $GITHUB_ENV # 清理临时文件 rm kubeconfig.tmp
方案3:在Pulumi代码中提前编码(最简洁)
如果可以修改Pulumi代码,直接在pulumi中对kubeconfig做Base64编码后再输出,省去Actions中的编码步骤:
// TypeScript示例 import * as pulumi from "@pulumi/pulumi"; import * as k8s from "@pulumi/kubernetes"; const cluster = new k8s.Cluster("my-cluster", {/* 你的集群配置 */}); // 直接输出Base64编码后的kubeconfig export const kubeconfigBase64 = pulumi.output(cluster.kubeconfig).apply(k => Buffer.from(k).toString('base64'));
然后在GitHub Actions中直接引用该输出:
- run: echo "KUBE_CONFIG=${{ steps.pulumi.outputs.kubeconfigBase64 }}" >> $GITHUB_ENV
内容的提问来源于stack exchange,提问作者JuChom
相关产品推荐
相关产品推荐

