YAML 빌드팩: 구성 리포지토리 자동 유효성 검사

Git은 시스템/서비스 구성을 관리하는 가장 일반적인 버킷 중 하나이며, 이는 Git이 제공하는 이점(예: 변경 사항 추적 및 롤백)으로 인해 명백합니다.

우리 회사에서는 Git을 사용하여 서비스 및 도구를 원격으로 구성합니다. 700개 이상의 구성 저장소가 있습니다 🚀

다음 사항에 유의하세요.

Configuration changes are error-prone. Making sure any change in configuration doesn’t break the system is important to avoid critical incidents[1].



그래서:

사용자로서 변경 사항이 올바른 형식인지 확인하여 잘못된 구성 파일로 인해 시스템 문제가 발생하지 않도록 합니다.

CI/CD는 변경 사항을 *main *브랜치에 병합하기 전에 모든 종류의 검사를 적용하는 데 사용할 수 있지만, 이를 만들기 위해 Action 또는 GitLab-CI(사용하는 도구에 따라 다름)를 도입하는 비용이 발생합니다. 일어나다. 여기서 큰 비용은 적절한 CI 정의를 갖도록 모든 리포지토리를 업데이트하려는 것입니다.

YAML 검사기



최근에 우리는 BitBucket에서 GitLab으로 마이그레이션했습니다. BitBucket에서는 작업을 수행하는 YAML Validator Pre-Receive hook[2]를 사용하고 있었지만 안타깝게도 GitLab에서 유사한 기능을 쉽게 사용할 수 있는 방법이 없습니다.

GitLab의 대안
  • 👎 Global server-hook (GitLab Server의 Docker 컨테이너에서 관리가 쉽지 않음)
  • 👎 클라이언트 쪽 커밋 후크(실용적이지 않음)
  • 👎 모든 리포지토리에 .gitlab-ci.yml을 통한 유효성 검사 작업 도입(유지 관리를 위해 구성 리포지토리가 필요한 것 외에도 많은 구성 리포지토리에 도입하는 데 높은 비용)
  • 👍 자동 DevOps! (중앙집중식 설정 및 유지보수 용이😎)

  • GitLab 자동 DevOps



    GitLab Auto DevOps[4]는 구성 리포지토리를 변경할 필요가 없기 때문에 문제를 해결하는 데 사용할 수 있는 좋은 후보였습니다.

    GitLab Auto DevOps is a collection of pre-configured features and integrations that work together to support your software delivery process.



    GitLab DevOps는 빌드팩[5]을 기반으로 합니다.

    A Buildpack is a set of executables that inspects your app source code and creates a plan to build and run your application.



    기존 Buildpack에는 중간에 YAML 유효성 검사기가 없으므로 일부 사용자 지정 없이는 기본 GitLab DevOps가 자동으로 적합하지 않습니다[6]

    자동 테스트: YAML 유효성 검사기 빌드팩



    GitLab Auto DevOps — Auto Test[7]를 사용하려면 구성 파일(Yaml 기반)을 검증하기 위한 Buildpack이 필요합니다. 이 작업을 수행하기 위해 Yamllint-buildpack[8]이 도입되었습니다 💻



    발각

    YAML 빌드팩을 실행하려면 저장소가 일치하는지 먼저 확인합니다. 리포지토리에 YAML 파일이 포함되어 있으면 Buildpack 이름을 인쇄하고 그렇지 않으면 스크립트를 종료합니다.

    #!/usr/bin/env bash
    set -eo pipefail
    
    ymlFilesArray=$(find "${1:?}" -maxdepth 1 -regex ".*.[yml|yaml]" | grep -v '^$')
    
    if [ ${#ymlFilesArray[@]} -gt 0 ]; then
      echo "freenow/yamllint"
      exit 0
    else
      (>&2 echo "Could not find yaml/yml files")
      exit 1
    fi
    


    테스트 컴파일

    이 단계는 테스트를 위한 저장소를 준비하는 것입니다. 테스트를 실행하기 전에 필요한 컴파일이 없으므로 테스트 컴파일 스크립트가 비어 있습니다. Herokuish가 성공적으로 실행되려면 파일이 반드시 존재해야 합니다.

    테스트

    이 스크립트는 yamllint를 사용하여 YAML 유효성 검사를 적용하는 것입니다.

    yamllint 검사를 실행하려면:
  • Python 다운로드 및 설치
  • 설치 Pip
  • 설치 yamllint
  • 실행 yamllint 확인

  • 전체 스크립트:

    #!/usr/bin/env bash
    # bin/test <build-dir> <env-dir>
    
    set -eo pipefail 
    
    echo "---> yamllint check..."   
    
    # GET ARGS
    BP_DIR=$(cd $(dirname $0)/..; pwd) 
    
    # absolute path
    BUILD_DIR=$1
    ENV_DIR=$2  
    
    # CREATE THE LAYER DIRECTORY
    pythonlayer="$ENV_DIR"/python
    mkdir -p "$pythonlayer" 
    
    # DOWNLOAD PYTHON
    echo "---> Downloading and extracting Python"
    python_url=https://s3-external-1.amazonaws.com/heroku-buildpack-python/heroku-18/runtimes/python-3.10.0.tar.gzwget -q -O - "$python_url" | tar -xzf - -C "$pythonlayer" 
    
    # MAKE PYTHON AVAILABLE TO THIS SCRIPT
    export PATH="$pythonlayer"/bin:$PATH
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}"$pythonlayer/lib" 
    
    # INSTALL PIP
    echo "---> Installing pip"
    python -m ensurepip --upgrade 
    
    # INSTALL YAMLLINT
    echo "---> Installing yamllint"
    pip3 install yamllint 
    
    # RUN YAMLLINT
    echo "---> Validating yaml/yml files"
    yamllint -c "$BP_DIR/config/yamllint-config" $BUILD_DIR 
    
    echo "---> [success] yaml/yml validation"
    
    


    추가 구성



    GitLab은 기본적으로 필요하지 않은 작업을 기본적으로 활성화합니다. 이로 인해 GitLabvariables을 사용하여 이러한 작업을 비활성화하고 아래 변수를 false로 설정해야 합니다.
  • BUILD_DISABLED
  • CODE_QUALITY_DISABLED
  • CONTAINER_SCANNING_DISABLED
  • SECRET_DETECTION_DISABLED

  • 그리고 가장 중요한 변수는 Buildpack URL을 참조하는 BUILDPACK_URL입니다 :-)

    참조:

    [1] https://surfingcomplexity.blog/2021/05/29/why-do-config-changes-keep-coming-up-in-major-incidents/

    [2] https://marketplace.atlassian.com/apps/1213552/yaml-validator-hook

    [3] https://docs.gitlab.com/ee/administration/server_hooks.html

    [4] https://docs.gitlab.com/ee/topics/autodevops/

    [5] https://buildpacks.io/

    [6] https://docs.gitlab.com/ee/topics/autodevops/customize.html

    [7] https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-test

    [8] https://github.com/freenowtech/yamllint-buildpack

    좋은 웹페이지 즐겨찾기