我有一个 github 项目,其中包含一个配置文件,其中包含一些应该在构建时替换的设置
#some_config_file
some_setting=foo
url=http://<secret_url>:8080/path
username=<secret_user>
password=<secret_pass>
other_setting=bar
name: CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
...
- name: Update Secret URL
run: sed -i 's/<secret_url>/${{secrets.SECRET_URL}}/' some_config_file
- name: Update Secret Username
run: sed -i 's/<secret_user>/${{secrets.SECRET_USER}}/' some_config_file
- name: Update Secret Username
run: sed -i 's/<secret_pass>/${{secrets.SECRET_USER}}/' some_config_file
...
这适用于简单的字符串,但是当涉及到由几个特殊字符随机生成的密码时,它经常会失败或以意外的方式中断或输出错误的密码值
例如。将密码设置为
just$Some.p*s&w[0R\d
或
$ome_|n&3cureV@l*e.\o/
彻底打破它。
密码已提供,我们无法自行更改,并且可能会也可能不会更改为包含其他特殊字符。
如何进行此替换,同时仍然满足可能成为密码一部分的任何特殊字符?
问题是,sed 试图将特殊字符解释为替换字符串的一部分。你需要的是一个“愚蠢的替代品”。这是一个单行代码,可以将
bash -c 'replace_pw () { pw="$1"; while read line; do var=$(echo $line | cut -d= -f1); value=$(echo $line | cut -d= -f2); if [ "$value" == "<secret_pass>" ]; then echo "$var=$pw"; else echo "$var=$value"; fi; done }; cat config.txt | replace_pw '\''${{secrets.SECRET_PASSWORD}}'\' > junk.$$; mv junk.$$ config.txt
顺便说一句,我注意到你有:
run: sed -i 's/<secret_pass>/${{secrets.SECRET_USER}}/' some_config_file
我假设你还想使用除
secrets.SECRET_USER
之外的其他东西。我在上面的示例中使用了 secrets.SECRET_PASSWORD
。