Sobes.tech
Middle

როგორ კოდირებთ ცვლადებს CI-ში?

sobes.tech AI

პასუხი AI-სგან

CI სისტემасының ішкі мүмкіндіктерін пайдалана отырып, мен айнымалыларды шифрлеп жатырмын. Әрбір CI жүйесі, ол GitLab CI/CD, GitHub Actions немесе Jenkins болсын, қауіпсіз құпияларды сақтау функциясына ие. Бұл айнымалылар тек құрастыру процесінің белгілі бір кезеңдерінде ғана қол жетімді және журналдарда көрсетілмейді.

Мысалы, GitLab CI-де:

  • Қоршаған орта айнымалылары: Топ немесе жоба деңгейінде айнымалыларды сақтауға болады. Олар "қорғалған" және "маскировкаланған" деп белгіленеді. "Қорғалған" тек қорғалған тармақтар мен тегтерде пайдаланылады, "маскировкаланған" мәні журналдарда толық сәйкес келсе жасырын болады.

    # .gitlab-ci.yml
    # Айнымалыға қоршаған орта арқылы қол жеткізу
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Сыртқы құпия сақтау қоймасымен интеграция, мысалы HashiCorp Vault. GitLab CI Vault-қа аутентификациялана алады және орындалу кезінде құпияларды ала алады.

    # .gitlab-ci.yml
    variables:
      VAULT_SERVER: "https://vault.example.com"
      VAULT_AUTH_ROLE: "gitlab-ci"
      VAULT_AUTH_PATH: "auth/kubernetes"
      VAULT_SECRETS: |
        MY_SECRET_KEY: vault/path/to/secret:key
    script:
      - echo $MY_SECRET_KEY # Айнымалы автоматты түрде Vault-тан жүктеледі
    

GitHub Actions-те:

  • Құпия сөздер: Дегенмен, репозиторий немесе ұйым деңгейінде құпия сөздерді сақтау мүмкіндігі бар. Олар ${{ secrets.MY_SECRET }} арқылы жұмыс процесінде қол жетімді. Мәндер журналдарда көрсетілмейді және API арқылы алуға болмайды.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Құпия сөзді пайдалану
          run: echo ${{ secrets.MY_SECRET }}
    

Jenkins-те:

  • Credentials Plugin: Әр түрлі типтегі куәліктерді (қолданушы аты/құпия сөз, құпия мәтін, SSH кілті) шифрланған түрде сақтауға мүмкіндік береді. Оларға Jenkinsfile-да немесе графикалық интерфейсте қол жеткізуге болады.

    // Jenkinsfile (Декларативті Pipeline)
    pipeline {
        agent any
        stages {
            Ашу процесінде, қайда қолданылатын айнымалылар, әдетте, орта айнымалылары ретінде қол жетімді.
            stage('Use Secret') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Жалпы принциптер:

  • Мінімдеу ауқымы: Құпиялар тек қажетті кезеңдерде және ортада қол жетімді.
  • Логтарды маскалау: Құпия мәндер орындалу логтарында жасырын.
  • Рөлдерді бөлу: Тек рұқсат етілген пайдаланушылар немесе жүйелер құпияларды қосуға/өзгертуді жүзеге асыра алады.
  • Сыртқы сақтау қоймаларын пайдалану: Күрделі сценарийлер және орталықтандырылған құпия басқару үшін Vault немесе ұқсас шешімдер пайдаланылады.