用 github 秘密值替换文件文本

问题描述 投票:0回答:1

我有一个 github 项目,其中包含一个配置文件,其中包含一些应该在构建时替换的设置

#some_config_file
some_setting=foo
url=http://<secret_url>:8080/path
username=<secret_user>
password=<secret_pass>
other_setting=bar

值应该替换为 Github 操作中的正确值:

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/

彻底打破它。

密码已提供,我们无法自行更改,并且可能会也可能不会更改为包含其他特殊字符。

如何进行此替换,同时仍然满足可能成为密码一部分的任何特殊字符?

linux bash ubuntu github
1个回答
1
投票

问题是,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

© www.soinside.com 2019 - 2024. All rights reserved.