GitLab을 사용한 시스템 간 솔루션 연속 제공 - 섹션 8: ICM CD 사용

21796 단어
In this series of articles, InterSystems technologies와 GitLab을 사용하여 소프트웨어 개발을 진행할 수 있는 몇 가지 가능한 방법을 소개하고 토론하고자 합니다.다음 항목에 대해 설명합니다.
  • 기트 101
  • 기트 트래픽(개발 프로세스)
  • GitLab 설치
  • GitLab 워크플로
  • 순차 제공
  • GitLab 설치 및 구성
  • GitLab CI/CD
  • 왜 컨테이너예요?
  • 컨테이너 인프라
  • CD 사용 컨테이너
  • ICM 의
  • CD 사용
    이 문서에서는 InterSystems Cloud Manager를 사용하여 지속적인 배송을 구축합니다.ICM은 InterSystems IRIS 기반 어플리케이션 클라우드 프로비저닝 및 배포 솔루션입니다.필요한 배포 구성을 정의할 수 있으며 ICM은 이를 자동으로 구성합니다.자세한 내용은 First Look: ICM을 참조하십시오.
    작업흐름
    지속적인 제공 구성에서는 다음을 수행합니다.
  • GitLab 저장소에 코드 밀어넣기
  • docker 이미지 구축
  • 이미지를 docker 등록표
  • 에 발표
  • 테스트 서버
  • 에서 테스트
  • 테스트가 통과되면 운영 서버
  • 에 배포
    또는 그래픽 형식:

    보시다시피 Docker 컨테이너를 수동으로 관리하지 않고 ICM을 사용할 것입니다.
    ICM 구성
    우리가 용기를 업그레이드하기 전에 그것들을 준비해야 한다.이를 위해 기본값을 정의해야 합니다.json과 정의.json, 우리의 구조를 묘사합니다.나는 실시간 서버에 이 두 파일을 제공할 것이다. 테스트 서버의 정의는 같고 기본값은 같지만, 태그와 시스템 모드 값은 제외된다.
    기본값입니다.json:
    {
        "Provider": "GCP",
        "Label": "gsdemo2",
        "Tag": "LIVE",
        "SystemMode": "LIVE",
        "DataVolumeSize": "10",
        "SSHUser": "sample",
        "SSHPublicKey": "/icmdata/ssh/insecure.pub",
        "SSHPrivateKey": "/icmdata/ssh/insecure",
        "DockerImage": "eduard93/icmdemo:master",
        "DockerUsername": "eduard93",
        "DockerPassword": "...",
        "TLSKeyDir": "/icmdata/tls",
        "Credentials": "/icmdata/gcp.json",
        "Project": "elebedyu-test",
        "MachineType": "n1-standard-1",
        "Region": "us-east1",
        "Zone": "us-east1-b",
        "Image": "rhel-cloud/rhel-7-v20170719",
        "ISCPassword": "SYS",
        "Mirror": "false"
    }
    
    정의json
    [
        {
        "Role": "DM",
        "Count": "1",
        "ISCLicense": "/icmdata/iris.key"
        }
    ]
    
    ICM 컨테이너 내에서 호스트에서 /icmdata 폴더를 마운트하고 다음을 수행합니다.
  • 테스트 서버 정의는 /icmdata/test 폴더
  • 라이브 서버 정의는 /icmdata/live 폴더
  • 에 있음
    필요한 모든 키를 확보한 후:
    keygenSSH.sh /icmdata/ssh
    keygenTLS.sh /icmdata/tls
    
    필요한 파일을 /icmdata에 넣습니다.
  • 엘리스.열쇠
  • gcp.json(곡가운 플랫폼에 배치하는 데 사용)
  • 인스턴스를 구성하려면 ICM에 전화하십시오.
    cd /icmdata/test
    icm provision
    icm run
    cd /icmdata/live
    icm provision
    icm run
    
    이것은 테스트와 실시간 서버에 독립된 InterSystems IRIS 실례를 제공합니다.
    자세한 지침은 ICM First Look을 참조하십시오.
    짓다
    우선, 우리는 자신의 이미지를 세워야 한다.
    코드는 gitlab-ci.yml의 라이브러리, CD 구성에 평소와 같이 저장되지만 보안을 강화하기 위해 구축 서버에 서버별 파일 몇 개를 저장합니다.
    에리스.열쇠.
    라이센스 키.또는 서버에 저장하지 않고 용기를 구축하는 동안 다운로드할 수 있습니다.저장소에 저장하는 것은 상당히 안전하지 않다.
    pwd.txt
    기본 암호가 포함된 파일입니다.마찬가지로 이를 저장소에 저장하는 것은 상당히 안전하지 않다.또한, 단독 서버에서prod 환경을 위탁 관리하면 기본 비밀번호가 다를 수 있습니다.
    ci icm을 로드합니다.각본
    초기 스크립트:
  • 설치 프로그램 로드
  • 설치 어플리케이션 초기화
  • 로드 코드
  • 
    set dir = ##class(%File).NormalizeDirectory($system.Util.GetEnviron("CI_PROJECT_DIR"))
    do ##class(%SYSTEM.OBJ).Load(dir _ "Installer/Global.cls","cdk")
    do ##class(Installer.Global).init()
    halt
    
    첫 번째 줄은 일부러 비워 두었으니 주의하세요.
    앞의 예와 다른 몇 가지 일이 있다.먼저 ICM은 GitLab과 직접 상호 작용하는 대신 컨테이너와 상호 작용하기 때문에 OS 인증을 활성화하지 않았습니다.그 다음에, 나는 설치 프로그램 목록을 사용하여 우리의 프로그램을 초기화하여 서로 다른 초기화 방법을 보여 준다.설치 프로그램 in this article에 대한 자세한 내용을 참조하십시오.마지막으로 Docher Hub에서 개인 재구매 형식으로 이미지를 발표하겠습니다.
    설치/전 세계.cls
    설치 프로그램 목록은 다음과 같습니다.
    <Manifest>
        <Log Text="Creating namespace ${Namespace}" Level="0"/>
        <Namespace Name="${Namespace}" Create="yes" Code="${Namespace}" Ensemble="" Data="IRISTEMP">
            <Configuration>
                <Database Name="${Namespace}" Dir="${MGRDIR}/${Namespace}" Create="yes" MountRequired="true" Resource="%DB_${Namespace}" PublicPermissions="RW" MountAtStartup="true"/>
            </Configuration>
    
            <Import File="${Dir}MyApp" Recurse="1" Flags="cdk" IgnoreErrors="1" />
        </Namespace>
    
        <Log Text="Mapping to USER" Level="0"/>
        <Namespace Name="USER" Create="no" Code="USER" Data="USER" Ensemble="0">
            <Configuration>
                <Log Text="Mapping MyApp package to USER namespace" Level="0"/>
                <ClassMapping From="${Namespace}" Package="MyApp"/>
            </Configuration>
    
            <CSPApplication  Url="/"      Directory="${Dir}client" AuthenticationMethods="64" IsNamespaceDefault="false" Grant="%ALL"  />
            <CSPApplication  Url="/myApp" Directory="${Dir}"       AuthenticationMethods="64" IsNamespaceDefault="false" Grant="%ALL"  />
        </Namespace>
    </Manifest>
    
    다음과 같이 변경되었습니다.
  • 애플리케이션 네임스페이스를 만듭니다.
  • 은 응용 프로그램 코드 데이터베이스를 생성한다(데이터는 사용자 데이터베이스에 저장된다).
  • 은 코드를 응용 프로그램 코드 데이터베이스에 불러옵니다.
  • 은 MyApp 패키지를 사용자 이름 공간에 매핑합니다.
  • 은 HTML과 REST 두 개의 웹 응용 프로그램을 만듭니다.
  • gitlab ci.yml
    이제 구성이 순차적으로 제공됩니다.
    build image:
      stage: build
      tags:
        - master
      script:
        - cp -r /InterSystems/mount ci
        - cd ci
        - echo 'SuperUser' | cat - pwd.txt load_ci_icm.script > temp.txt
        - mv temp.txt load_ci.script
        - cd ..
        - docker build --build-arg CI_PROJECT_DIR=$CI_PROJECT_DIR -t eduard93/icmdemo:$CI_COMMIT_REF_NAME .
    
    이게 어떻게 된 일입니까?
    먼저, docker build은 기본 빌드 디렉토리의 하위 디렉토리에만 액세스할 수 있으므로 저장소 루트 디렉토리에서 클론 저장소에 iris.key, pwd.txtload_ci_icm.script을 포함하는 기밀 디렉토리를 복제해야 합니다.
    다음에 첫 번째 터미널 접근은 사용자/통행증이 필요하기 때문에 load_ci.script에 추가해야 한다(이것이 load_ci.script에서 시작하는 공행이 btw에 대한 의미이다).
    마지막으로, 우리는 docker 이미지를 구축하고 적절하게 표시합니다: eduard93/icmdemo:$CI_COMMIT_REF_NAME이 중 $CI_COMMIT_REF_NAME은 현재 분기의 이름입니다.그림 표시의 첫 번째 부분은 GitLab의 항목 이름과 같아야 GitLab 등록표 옵션 카드에서 볼 수 있습니다. (표시에 대한 설명은 등록표 옵션 카드에서 찾을 수 있습니다.)
    Dockerfile
    다음과 같이 Dockerfile을 사용하여 docker 이미지를 만듭니다.
    FROM intersystems/iris:2018.1.1-released
    
    ENV SRC_DIR=/tmp/src
    ENV CI_DIR=$SRC_DIR/ci
    ENV CI_PROJECT_DIR=$SRC_DIR
    
    COPY ./ $SRC_DIR
    
    RUN cp $CI_DIR/iris.key $ISC_PACKAGE_INSTALLDIR/mgr/ \
     && cp $CI_DIR/GitLab.xml $ISC_PACKAGE_INSTALLDIR/mgr/ \
     && $ISC_PACKAGE_INSTALLDIR/dev/Cloud/ICM/changePassword.sh $CI_DIR/pwd.txt \
     && iris start $ISC_PACKAGE_INSTANCENAME \
     && irissession $ISC_PACKAGE_INSTANCENAME -U%SYS < $CI_DIR/load_ci.script \
     && iris stop $ISC_PACKAGE_INSTANCENAME quietly
    
    우리는 기본적인 무지개 용기부터 시작한다.
    우선, 우리는 저장소 (그리고 '기밀' 디렉터리) 를 용기에 복사할 것이다.
    다음에 허가증 키를mgr 디렉터리로 복사합니다.
    그리고 비밀번호를 pwd의 값으로 변경합니다.txt.pwd를 주의하십시오.이 작업에서 txt를 삭제합니다.
    그런 다음 인스턴스를 시작하고 ci를 로드합니다.스크립트가 실행됩니다.
    마지막으로 아이리스 실례를 멈추겠습니다.
    Docker executor가 아닌 GitLab Shell executor을 사용하고 있습니다.Docker executor는 그림 내부의 일부 내용을 필요로 할 때 사용합니다. 예를 들어 자바 용기에 안드로이드 프로그램을 만들고 있습니다. apk만 있으면 됩니다.우리의 예에서, 우리는 완전한 용기가 필요하다. 이를 위해, 우리는 Shell executor가 필요하다.GitLab Shell executor를 통해 Docker 명령을 실행합니다.
    발표하다.
    이제 Docker Hub에서 이미지를 게시합니다.
    publish image:
      stage: publish
      tags:
        - master
      script:
        - docker login -u eduard93 -p ${DOCKERPASSWORD}
        - docker push eduard93/icmdemo:$CI_COMMIT_REF_NAME
    
    ${DOCKERPASSWORD} 변수는 GitLab secret variable입니다.GitLab > 프로젝트 > 설정 > CI/CD > 변수에 추가할 수 있습니다.

    작업 로그에도 암호 값이 없습니다.
    Running with gitlab-runner 10.6.0 (a3543a27)
      on icm 82634fd1
    Using Shell executor...
    Running on docker...
    Fetching changes...
    Removing ci/
    HEAD is now at 8e24591 Add deploy to LIVE
    Checking out 8e245910 as master...
    Skipping Git submodules setup
    $ docker login -u eduard93 -p ${DOCKERPASSWORD}
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    Login Succeeded
    $ docker push eduard93/icmdemo:$CI_COMMIT_REF_NAME
    The push refers to repository [docker.io/eduard93/icmdemo]
    master: digest: sha256:d1612811c11154e77c84f0c08a564a3edeb7ddbbd9b7acb80754fda97f95d101 size: 2620
    Job succeeded
    
    Docker Hub에서는 다음과 같은 새로운 이미지를 볼 수 있습니다.

    뛰어다니다
    이미지가 생겼습니다. 다음은 테스트 서버에서 그것을 실행합시다.대본입니다.
    run image:
      stage: run
      environment:
        name: $CI_COMMIT_REF_NAME
      tags:
        - master
      script:
        - docker exec icm sh -c "cd /icmdata/test && icm upgrade -image eduard93/icmdemo:$CI_COMMIT_REF_NAME"
    
    ICM을 사용하면 하나의 명령(icm upgrade)만 실행하면 기존 배치를 업그레이드할 수 있습니다.icm 용기에서 지정한 명령을 실행하는 docker exec icm sh -c ...을 실행합니다.우선, 우리는 /icmdata/test 모델에 들어갔는데 그 중에서 우리의 ICM 배치 정의는 테스트 서버를 위한 것이다.이후, 우리는 icm upgrade에 전화를 걸어 기존의 용기를 새로운 용기로 교체했다.
    테스트
    테스트를 좀 해보겠습니다.
    test image:
      stage: test
      tags:
        - master
      script:
        - docker exec icm sh -c "cd /icmdata/test && icm session -namespace USER -command 'do \$classmethod(\"%UnitTest.Manager\",\"RunTest\",\"MyApp/Tests\",\"/nodelete\")' | tee /dev/stderr | grep 'All PASSED' && exit 0 || exit 1"
    
    마찬가지로, 우리는 icm 용기에서 명령을 실행합니다.icm 세션은 배치된 노드에서 명령을 실행합니다.이 명령은 단위 테스트를 실행합니다.이후, 단원 테스트 결과를 찾기 위해 모든 출력을 화면과grep로 전송하고, 프로세스를 성공적으로 종료하거나 오류가 발생했습니다.
    배치하다
    생산 서버에 배치하는 것은 테스트에 배치하는 것과 완전히 같지만 라이브 deployment가 정의한 다른 디렉터리는 다르다.테스트에 실패하면 이 단계를 실행하지 않습니다.
    deploy image:
      stage: deploy
      environment:
        name: $CI_COMMIT_REF_NAME
      tags:
        - master
      script:
        - docker exec icm sh -c "cd /icmdata/live && icm upgrade -image eduard93/icmdemo:$CI_COMMIT_REF_NAME"
    
    결론
    ICM은 귀하께 간단하고 직관적인 방식으로 클라우드 인프라를 제공하고 그 위에 서비스를 배치하여 귀하가 중대한 개발이나 재배치를 하지 않고 클라우드로 진입할 수 있도록 도와드립니다.코드로서의 인프라(IaC)와 컨테이너화 배치의 장점은 Google, Amazon, Azure) 또는 사용자의 개인 VMware vSphere 클라우드에 시스템 간 IRIS 기반 응용 프로그램을 배치하는 것을 쉽게 합니다.필요한 내용을 정의하고, 몇 개의 명령을 실행하고, ICM은 나머지 작업을 완료합니다.
    비록 클라우드 인프라 시설과/또는 용기를 사용하고 있더라도 ICM은 많은 수동 절차를 자동으로 실행하여 응용 프로그램의 공급과 배치에 필요한 시간과 정력을 크게 줄일 수 있다.
    링크
  • Code for the article
  • Test project
  • ICM Documentation
  • First Look: ICM
  • 좋은 웹페이지 즐겨찾기