실행 책

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

실행 책은 특정 프로세스를 수행하는 방법을 설명하는 문서화된 절차의 모음입니다.
시작, 중지, 디버깅 또는 특정 시스템 문제 해결이 될 수 있습니다.

Jupyter NotebooksRubix library를 사용하여, 사용자는 자신의 실행 가능 책을 작성하기 시작할 수 있습니다.

역사적으로 실행 책은 조건이나 시스템에 따라 결정 트리 또는 세부 단계별 가이드 형태를 취했습니다.

현대 구현에서는 잘 정의된 프로세스와 함께, 운영자가 특정 환경에 대해 미리 작성된 코드 블록이나 데이터베이스 쿼리를 실행할 수 있는 “실행 가능 책”의 개념을 도입했습니다.

실행 가능 책

GitLab Kubernetes 통합을 통해 제공되는 JupyterHub 앱은 Nurtch의 Rubix 라이브러리와 함께 제공되어 DevOps 실행 책을 쉽게 생성할 수 있는 방법을 제공합니다.
샘플 실행 책이 제공되어 일반적인 작업을 보여줍니다.
Rubix는 일반적인 Kubernetes 및 AWS 워크플로를 생성하는 것을 간단하게 만들지만, Rubix 없이도 수동으로 생성할 수 있습니다.


비디오를 시청하여 GitLab에서 이 작업이 어떻게 수행되는지 살펴보세요!

요구 사항

실행 가능 책을 만들려면 다음이 필요합니다:

  • Kubernetes - 나머지 애플리케이션을 배포하기 위해 Kubernetes 클러스터가 필요합니다.
    시작하는 가장 간단한 방법은 GitLab agent를 사용하여 클러스터에 연결하는 것입니다.
  • Ingress - Ingress는 로드 밸런싱, SSL 종료 및 이름 기반 가상 호스팅을 제공할 수 있습니다.
    이는 애플리케이션을 위한 웹 프록시로 작용합니다.
  • JupyterHub - JupyterHub는 팀 간 노트북 관리를 위한 다중 사용자 서비스입니다.
    Jupyter Notebooks는 데이터 분석, 시각화 및 기계학습에 사용되는 웹 기반 대화형 프로그래밍 환경을 제공합니다.

Nurtch

Nurtch는 Rubix library 뒤에 있는 회사입니다.
Rubix는 Jupyter Notebooks 내에서 일반적인 DevOps 작업을 수행하기 쉽게 만들어주는 오픈 소스 Python 라이브러리입니다.
Cloudwatch 메트릭을 플로팅하고 ECS/Kubernetes 앱을 롤링하는 것과 같은 작업이 몇 줄의 코드로 단순화됩니다.
자세한 내용은 Nurtch Documentation를 참조하세요.

GitLab로 실행 가능 책 구성

위에서 설명한 구성 요소와 미리 로드된 데모 실행 책을 사용하여 GitLab에서 실행 가능 책을 구성하는 단계별 가이드를 따르세요.

  1. JupyterHub용 OAuth 애플리케이션 만들기.

  2. Helm으로 JupyterHub 설치 시 다음 값을 사용하세요:

    #-----------------------------------------------------------------------------
    # hub.config.GitLabOAuthenticator 섹션은 사용자 지정해야 합니다!
    #-----------------------------------------------------------------------------
    
    hub:
      config:
        GitLabOAuthenticator:
          # 특정 프로젝트 또는 그룹의 구성원 또는 특정 사용자로 액세스를 제한합니다:
          # allowedGitlabGroups: [ "my-group-1", "my-group-2" ]
          # allowedProjectIds: [ 12345, 6789 ]
          # allowed_users: ["user-1", "user-2"]
          client_id: <Your OAuth Application ID>
          client_secret: <Your OAuth Application ID>
          enable_auth_state: true
          gitlab_url: https://gitlab.example.com
          oauth_callback_url: http://<Jupyter Hostname>/hub/oauth_callback
          scope:
            - read_user
            - read_api
            - openid
            - profile
            - email
        JupyterHub:
          authenticator_class: gitlab
       extraConfig: 
         gitlab-config: |   
            c.KubeSpawner.cmd = ['jupyter-labhub']
            c.GitLabOAuthenticator.scope = ['api read_repository write_repository']
    
            async def add_auth_env(spawner):
               '''
               JupyterHub의 리포지토리 통합을 활성화하기 위해 단일 사용자 이미지에서 사용자 아이디, 로그인 및 액세스 토큰을 설정합니다.
               참조: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47138#note_154294790
               '''
               auth_state = await spawner.user.get_auth_state()
    
               if not auth_state:
                  spawner.log.warning("No auth state for %s", spawner.user)
                  return
    
               spawner.environment['GITLAB_ACCESS_TOKEN'] = auth_state['access_token']
               spawner.environment['GITLAB_USER_EMAIL'] = auth_state['gitlab_user']['email']
               spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id'])
               spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username']
               spawner.environment['GITLAB_USER_NAME'] = auth_state['gitlab_user']['name']
    
            c.KubeSpawner.pre_spawn_hook = add_auth_env
    
    singleuser:
       defaultUrl: "/lab"
       image:
          name: registry.gitlab.com/gitlab-org/jupyterhub-user-image
          tag: latest
       lifecycleHooks:
          postStart:
             exec:
             command:
                - "sh"
                - "-c"
                - >
                   git clone https://gitlab.com/gitlab-org/nurtch-demo.git DevOps-Runbook-Demo || true;
                   echo "https://oauth2:${GITLAB_ACCESS_TOKEN}@${GITLAB_HOST}" > ~/.git-credentials;
                   git config --global credential.helper store;
                   git config --global user.email "${GITLAB_USER_EMAIL}";
                   git config --global user.name "${GITLAB_USER_NAME}";
                   jupyter serverextension enable --py jupyterlab_git
    
    proxy:
       service:
          type: ClusterIP
    
  3. JupyterHub가 성공적으로 설치된 후, 브라우저에서 Jupyter Hostname을 엽니다. Sign in with GitLab 버튼을 선택하여 JupyterHub에 로그인하고 서버를 시작합니다.
    인증은 OAuth2를 사용하는 GitLab 인스턴스의 모든 사용자에게 활성화되어 있습니다. 이 버튼은 GitLab에 대한 권한 부여를 요청하는 페이지로 리디렉션합니다.

    authorize Jupyter

  4. Authorize를 선택하면 GitLab이 JupyterHub 애플리케이션으로 리디렉션됩니다.
  5. Start My Server를 선택하여 몇 초 내에 서버를 시작합니다.
  6. 실행 책의 GitLab 프로젝트에 대한 액세스를 구성하려면, 데모 실행 책의 Setup 섹션에 GitLab Access Token과 프로젝트 ID를 입력해야 합니다:

    1. 왼쪽 패널에 있는 DevOps-Runbook-Demo 폴더를 선택합니다.

      demo runbook

    2. Nurtch-DevOps-Demo.ipynb 실행 책을 선택합니다.

      sample runbook

      Jupyter는 화면 오른쪽에 실행 책의 내용을 표시합니다.
      Setup 섹션에 PRIVATE_TOKENPROJECT_ID가 표시됩니다. 다음과 같이 값을 입력하세요. 단일 따옴표를 유지합니다:

      PRIVATE_TOKEN = '<your_access_token>'
      PROJECT_ID = '1234567'
      
    3. 이 섹션의 마지막 줄에 있는 VARIABLE_NAME을 액세스 토큰에 사용하는 변수의 이름과 일치하도록 업데이트합니다. 이번 예제에서는 변수 이름이 PRIVATE_TOKEN입니다.

      VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
      
  7. 실행 책의 작동을 구성하려면, 변수를 생성하고 구성합니다.
    이번 예제에서는 샘플 실행 책의 Run SQL queries in Notebook 섹션을 사용하여 PostgreSQL 데이터베이스를 쿼리합니다. 다음 코드 블록의 첫 네 줄은 이 쿼리가 작동하는 데 필요한 변수를 정의합니다:

    %env DB_USER={project.variables.get('DB_USER').value}
    %env DB_PASSWORD={project.variables.get('DB_PASSWORD').value}
    %env DB_ENDPOINT={project.variables.get('DB_ENDPOINT').value}
    %env DB_NAME={project.variables.get('DB_NAME').value}
    
    1. Settings > CI/CD > Variables로 가서 프로젝트에서 변수를 생성합니다.

      GitLab variables

    2. Save variables를 선택합니다.

    3. Jupyter에서 Run SQL queries in Notebook 제목을 선택한 다음 Run을 선택합니다. 결과는 다음과 같이 인라인으로 표시됩니다:

      PostgreSQL query

다른 작업, 예를 들어 셸 스크립트를 실행하거나 Kubernetes 클러스터와 상호 작용하는 작업을 시도해 볼 수 있습니다.
자세한 내용은 Nurtch Documentation를 방문하세요.