GitTub秘密と行動を結合すること


Aを探している間CI/CD 私のサイドプロジェクトの解決策はGitHub Secrets 機能.使用GitHub Actions , あなたは様々なカスタマイズ可能な方法でトリガ自動ビルドを設定できます.あなたのオートメーションパイプラインの一部が展開または第三者への配送を含むならば、あなたは何らかの種類の承認トークンを使用しているでしょう.一般的な知識は、プレーンテキストで超秘密の認証ファイルを格納することは大きなnoであるので、Github秘密は、一日を保存する来る!

目次

  • Actions
  • Secrets
  • Credits
  • アクション


    Githubアクションは単純であるか複雑である必要があります.しかし、ここでは、コミットが直接行われるたびに、ターゲットリポジトリからbashスクリプトを実行するアクションがありますmain
    name: Deploy Instance
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      deploy:
        runs-on: ubuntu-18.04
        steps:
          - uses: actions/checkout@v2
    
          - name: Deploy
            run: ./script/deploy
    
    この場合、アクションはリポジトリにGitチェックアウトを実行し、配備スクリプトを実行します.

    秘密


    GitHub秘密を定義するためには、特定のリポジトリのいずれかの設定>秘密のアクションページに移動する必要があります.このページの命名規則は少し奇妙です.Githubはそれを呼び出します<GitHub repository url>/settings/secrets/actions . 🤔

    ドキュメントは、以下のような秘密に関する規則については非常に明確です.
  • 名前は英数字とアンダースコアのみを含むことができます.A-Z , a-z , 0-9 or _ )
  • 名前はGITHUB_ , この接頭辞
  • 秘密の値は
    他にいくつかの規則がありますが、このポストには関係ありません.
  • アクションワークフロー(パイプライン)で秘密を使用するには、次のようにします.${{ secrets.NAME }} , ここでNAME あなたが秘密と呼んだものは何でも.
    たとえば、リポジトリの秘密を作成すると、MY_SECRET , そして、それに価値を与えてください.helloworld , によって出力される値${{ secrets.MY_SECRET }} どんな行動でもhelloworld .
    秘密はGitHubのログ出力で検閲されているので、ワークフローが実行されたときに値が解釈されることを明示的に表示できません.しかし、実行することによってif ワークフローによって実行されるbashスクリプト内のステートメントでは、秘密の実際の値を確認することができます.😎
    参照check.sh 下記
    #!/usr/bin/env bash
    
    if [ "$MY_SECRET" == "helloworld" ]; then
      echo "that's the one!"
    else
      echo "secret does not match"
    fi
    
    上記のbashスクリプトをコミットすることによって、以前からの動作ワークフローを新しい秘密を使用して、その値が予想通りであることをチェックするために更新されることができます.参照check.yml :
    name: Check
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      check:
        runs-on: ubuntu-18.04
        steps:
          - uses: actions/checkout@v2
    
          - name: chmod
            run: chmod +x ./scripts/*
    
          - name: Check
            run: MY_SECRET="${{ secrets.MY_SECRET }}" ./scripts/check.sh
    
    上記ワークフローをmain ブランチ、アクションをトリガーし、現在の秘密値をcheck.sh 検証用スクリプトです.秘密の値は簡単ですので、チェックは成功する必要があります!

    さあ、ちょっとスパイスしましょう.いくつかの認証キー、例えばsshキー、azure devops/Google cloud認証トークン、パスワードなどをパスしようとしているとします.見ましょう.
    MY_SECRET より複雑なものに再割り当てされます.apple_microsoft_$123 , the check.sh したがって、スクリプトを更新する必要があります.
    #!/usr/bin/env bash
    
    if [ "$MY_SECRET" == 'apple_microsoft_$123' ]; then
      echo "that's the one!"
    else
      echo "secret does not match"
    fi
    
    新しい値の引用符を覚えておいてくださいcheck.sh 単一引用符でなければなりません( ) スクリプトが解釈しないように$123 完全な値の一部の代わりに変数として.
    おっ!チェックが失敗しました.😕 秘密は、それが再割り当てされた値に等しくありません.

    では、どうなったの?さて、ワークフローに埋め込まれた秘密は、実際にはジョブコマンドとは別のものと解釈されます.だから、${{ secrets.MY_SECRET }} が実行されると、Githubは既に秘密の値を解釈し、ジョブコマンドに挿入します.仕事が終わる.MY_SECRET=”apple_microsoft$123” ./scripts/check.sh の代わりにMY_SECRET=apple_microsoft$123 ./scripts/check.sh . 秘密は最初に解釈されるので、同じ変更をするcheck.sh ワークフローにする必要があります.ダブル引用符の代わりにシングル引用符を使用してください!
    name: Check
    
    on:
      push:
        branches: [ main ]
    
    jobs:
      check:
        runs-on: ubuntu-18.04
        steps:
          - uses: actions/checkout@v2
    
          - name: chmod
            run: chmod +x ./scripts/*
    
          - name: Check
            run: MY_SECRET='${{ secrets.MY_SECRET }}' ./scripts/check.sh
    
    今、チェックは成功し、秘密の特殊文字は意図した動作を中断しません!
    それは、最も微妙な変化です、しかし、Wow ...😅 私の間違いy ' allから学んでください.

    あなたがより学びたいならばGitHub Secrets and the limits they have , どのようにGPGで大きな秘密を暗号化する方法について説明ドキュメントページの下部をチェックしてください.次回まで、読んでくれてありがとう!

    クレジット


    カバーイメージStefan Steinbauer on Unsplash ! :ディー