CI

검토 환경

검토 환경은 1시간 후에 자동으로 제거됩니다. 검토 환경이 더 오래 유지되어야 하는 경우, 환경 페이지에서 환경을 고정할 수 있습니다.

하지만 작업이 끝나면 Cleanup 단계에서 수동으로 작업을 트리거하는 것을 잊지 마세요. 이렇게 하면 클러스터가 다른 병합 요청을 위한 검토 앱을 실행할 충분한 리소스를 확보할 수 있습니다.

자세한 내용은 환경 문서를 참조하세요.

OpenShift CI 클러스터

우리는 QA 스위트를 포함한 수용 테스트에 사용되는 Google Cloud의 OpenShift 클러스터를 관리합니다.

이 클러스터에 연결하기 위한 kubeconfig 파일은 1Password의 cloud-native 금고에 저장되어 있습니다. ocp-ci를 검색하세요.

CI 클러스터는 이 프로젝트의 scripts/create_openshift_cluster.sh로 시작됩니다. CI 변수 KUBECONFIG_OCP_4_7은 스크립트가 kubeadmin으로 클러스터에 연결할 수 있도록 합니다. 4_7은 타겟 OpenShift 클러스터의 주요 및 부 버전을 나타냅니다.

이 스크립트 사용에 대한 지침은 OpenShift 클러스터 설정 문서를 참조하세요.

“public” 및 “dev” 클러스터

우리는 이 프로젝트를 위해 두 세트의 OpenShift CI 클러스터를 유지합니다:

  • public CI 클러스터는 gitlab.com에서 매일 CI 파이프라인을 책임집니다.
  • dev CI 클러스터는 dev.gitlab.org에서 공식 릴리스를 태그 지정하고 생성하는 책임이 있습니다: https://dev.gitlab.org/gitlab/cloud-native/gitlab-operator/-/pipelines.

모든 클러스터는 설정에 상관없이 OpenShift 클러스터 설정 문서와 스크립트를 사용하여 생성됩니다. public에 배포된 모든 OpenShift 버전은 dev에 동일한 버전으로 배포된 클러스터가 있습니다. 두 클러스터 모두 cloud-native GCP 프로젝트에 배포되며 DNS 기본 도메인에 k8s-ft.win을 사용합니다.

OpenShift 클러스터 확장

OpenShift 클러스터는 리소스를 풀링하기 위해 machineset을 사용합니다. 기본 배포는 4개의 machineset을 가지며, 이 중 2개가 활용됩니다.

우리는 그 접근 방식을 유지하고 2개의 활성 machineset을 2개의 노드로 확장합니다.

다음 OpenShift 확장 문서 를 참조하세요:

$ export KUBECONFIG=~/work/ocp/kubeconfig_4_8
$ oc get machinesets -n openshift-machine-api
이름                                 원하는  현재    준비됨    사용 가능  나이
ocp-ci-4717-abcde-worker-a   1         1         1       1           59d
ocp-ci-4717-abcde-worker-b   1         1         1       1           59d
ocp-ci-4717-abcde-worker-c   0         0                             59d
ocp-ci-4717-abcde-worker-f   0         0                             59d

작업 부하를 처리하기 위해 일시적인 용량을 생성합니다:

$ oc scale --replicas=1 machineset ocp-ci-4717-abcde-worker-c -n openshift-machine-api
machineset.machine.openshift.io/ocp-ci-4717-abcde-worker-c 스케일됨
$ oc get machinesets -n openshift-machine-api
이름                                 원하는  현재    준비됨    사용 가능  나이
ocp-ci-4717-abcde-worker-a   1         1         1       1           59d
ocp-ci-4717-abcde-worker-b   1         1         1       1           59d
ocp-ci-4717-abcde-worker-c   1         1                             59d
ocp-ci-4717-abcde-worker-f   0         0                             59d
$ kubectl get nodes
이름                                                              상태     역할    나이   버전
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-2.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-a-wz8ts.c.cloud-native-123456.internal   준비됨    worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   준비됨    worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   준비되지 않음  worker   15s   v1.20.0+2817867

하나의 machineset의 크기를 줄입니다:

oc scale --replicas=0 machineset ocp-ci-4717-abcde-worker-a -n openshift-machine-api

축소가 완료될 때까지 기다립니다:

$ oc scale --replicas=2 machineset ocp-ci-4717-abcde-worker-a -n openshift-machine-api
$ kubectl get nodes
이름                                                              상태   역할    나이     버전
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         준비됨    master   59d     v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         준비됨    master   59d     v1.20.0+2817867
ocp-ci-4717-abcde-master-2.c.cloud-native-123456.internal         준비됨    master   59d     v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   준비됨    worker   59d     v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   준비됨    worker   7m18s   v1.20.0+2817867

필요한 노드 수로 다시 확장합니다:

$ oc scale --replicas=2 machineset ocp-ci-4717-abcde-worker-a -n openshift-machine-api
machineset.machine.openshift.io/ocp-ci-4717-abcde-worker-a 스케일됨
$ kubectl get nodes
이름                                                              상태   역할    나이   버전
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-2.c.cloud-native-123456.internal         준비됨    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-a-n7qvs.c.cloud-native-123456.internal   준비됨    worker   72s   v1.20.0+2817867
ocp-ci-4717-abcde-worker-a-sqn77.c.cloud-native-123456.internal   준비됨    worker   73s   v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   준비됨    worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   준비됨    worker   11m   v1.20.0+2817867

external-dns

external-dnsBitnami Helm Chart를 사용하여 ci/scripts/install_external_dns.sh로 설치되었습니다. 이 도구는 외부 지향 LoadBalancer로 생성된 NGINX Ingress 컨트롤러 서비스에 대한 DNS 항목을 생성하여 QA 작업이 테스트를 위해 인스턴스에 도달할 수 있도록 합니다.

구성

작업 시간 초과

note
작업에 대한 시간 초과를 구성할 수 있습니다. 시간 초과에 도달하면 GitLab 컨트롤러는 작업을 제 시간에 완료할 수 없다는 오류를 반환합니다.

이를 구성하려면
deploy/chart/values.yaml에서 env 값을 업데이트하세요.

Kubernetes CI 클러스터

우리는 GKE를 사용하여 Google Cloud에서 Kubernetes 클러스터를 관리합니다. 이러한 클러스터는 OpenShift CI 클러스터에서 실행되는 것과 동일한 수용 테스트를 실행하는 데 사용됩니다.

클러스터는 charts/gitlabgke_bootstrap_script.sh 스크립트를 사용하여 생성됩니다.

$ CLUSTER_NAME='gitlab-operator' \
  PROJECT='cloud-native-182609' \
  REGION='europe-west3' \
  ZONE_EXTENSION='a' \
  USE_STATIC_IP='false' \
  EXTRA_CREATE_ARGS='' \
  ./scripts/gke_bootstrap_script.sh up

demo/.kube/config가 생성되며, 개발을 위해 kubectl 또는 k9s를 사용하여 클러스터에 연결할 수 있습니다.

그런 다음 새로운 Cloud DNS 레코드 세트를 생성하여 클러스터 엔드포인트 IP 주소에 연결합니다.

$ ENDPOINT="$(gcloud container clusters describe gitlab-operator --zone europe-west3-a --format='value(endpoint)')"

$ gcloud dns record-sets create gitlab-operator.k8s-ft.win. \
  --rrdatas=$ENDPOINT --type A --ttl 60 --zone k8s-ftw

클러스터가 생성되고 DNS와 연결되면, Letsencrypt TLS 인증서를 설정하기 위해 ./scripts/install_certmanager 스크립트를 실행합니다.

$ KUBECONFIG=demo/.kube/config \
  CLUSTER_NAME=gitlab-operator \
  BASE_DOMAIN=k8s-ft.win \
  GCP_PROJECT_ID=cloud-native-182609 \
  ./scripts/install_certmanager.sh 'kubernetes'

클러스터의 도메인에 대한 와일드카드 인증서가 발급되면, 클러스터는 테스트를 실행할 준비가 완료됩니다.

CI 클러스터의 경우, Google Cloud의 인증 문서를 따라 Google Cloud에 서비스 계정을 생성합니다. 이를 통해 이 프로젝트에 대한 CI 변수 KUBECONFIG_GKEGOOGLE_APPLICATION_CREDENTIALS를 생성할 수 있습니다. 우리는 이를 스크립트화한 것으로, scripts/create_gcloud_sa_kubeconfig.sh를 참조하세요. 이러한 kubeconfigconfig 파일은 1Password 클라우드 네이티브 금고에 저장됩니다. 금고에서 gitlab-operator를 검색하세요.

Kubernetes 클러스터 확장

우리는 gcloud CLI를 사용하여 GKE 클러스터의 작업자 노드를 추가하거나 제거합니다. Google Cloud 웹 UI도 사용할 수 있습니다.

예를 들어, gitlab-operator CI 클러스터를 4 노드로 확장하는 명령은 다음과 같습니다.

$ gcloud container clusters resize \
  gitlab-operator --num-nodes 4

QA 파이프라인

기본적으로, QA 파이프라인에는 기본 기능이 작동하는지 빠르게 확인하기 위해 작은 하위 집합의 빠른 엔드투엔드 기능 테스트인 Smoke suite가 포함됩니다. 추가 테스트가 필요한 경우, 특정 클러스터에 대해 qa_<cluster>_full_suite_manual_trigger 작업을 사용하여 엔드투엔드 테스트의 전체 스위트를 포함한 수동 QA 파이프라인을 트리거할 수 있습니다.

테스트에서 실패를 디버깅하려면 QA 실패 조사 가이드를 참조하세요.

컨테이너 빌드

Operator 이미지는 BUILDX_K8S_* 변수를 사용하여 Kubernetes buildx 드라이버를 구성함으로써 여러 아키텍처에 대해 빌드할 수 있습니다. BUILDX_ARCHS를 목표 아키텍처의 쉼표로 구분된 문자열로 설정하세요 (예: amd64,arm64). BUILDX_K8S_DISABLEtrue로 설정되면, 빌드할 플랫폼의 수가 자동으로 amd64로 줄어듭니다.

Kubernetes 드라이버가 구성되어 있지 않은 경우 (크로스) 컴파일은 한 가지 아키텍처만 가능합니다.