CI

리뷰 환경

리뷰 환경은 1시간 후에 자동으로 제거됩니다. 리뷰 환경을 더 오래 유지해야하는 경우 환경 페이지에서 환경을 고정할 수 있습니다. 그러나 작업을 마치면 Cleanup 단계에서 작업을 수동으로 트리거해야 합니다. 이는 클러스터가 다른 병합 요청을 위한 리뷰 앱을 실행하는 데 충분한 리소스를 보유하도록 하는 데 도움이 됩니다.

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

OpenShift CI 클러스터

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

이러한 클러스터에 연결하기 위한 kubeconfig 파일은 1Password 클라우드 네이티브 보관함에 저장되어 있습니다. ocp-ci를 검색하세요.

CI 클러스터는 이 프로젝트에서 scripts/create_openshift_cluster.sh를 사용하여 시작되었습니다. KUBECONFIG_OCP_4_7라는 CI 변수는 스크립트가 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.

모든 클러스터는 cloud-native GCP 프로젝트에 배포되고 DNS 기본 도메인으로 k8s-ft.win을 사용하여, 그들이 속한 집합에 관계없이 OpenShift 클러스터 설정 문서 및 스크립트를 사용하여 생성됩니다.

OpenShift 클러스터 확장

OpenShift 클러스터는 리소스를 모으기 위해 machineset을 사용합니다. 기본 배포에서는 4개의 machineset이 있고, 이 중 2개가 활용됩니다. 우리는 그 접근방식을 유지하고 2개의 활성 machineset을 2개의 노드로 확장합니다.

다음은 OpenShift 확장 문서의 일부입니다:

$ export KUBECONFIG=~/work/ocp/kubeconfig_4_8
$ oc get machinesets -n openshift-machine-api
NAME                         DESIRED   CURRENT   READY   AVAILABLE   AGE
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 scaled
$ oc get machinesets -n openshift-machine-api
NAME                         DESIRED   CURRENT   READY   AVAILABLE   AGE
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
NAME                                                              STATUS     ROLES    AGE   VERSION
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         Ready      master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         Ready      master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-2.c.cloud-native-123456.internal         Ready      master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-a-wz8ts.c.cloud-native-123456.internal   Ready      worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   Ready      worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   NotReady   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
NAME                                                              STATUS   ROLES    AGE     VERSION
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         Ready    master   59d     v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         Ready    master   59d     v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   Ready    worker   59d     v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   Ready    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 scaled
$ kubectl get nodes
NAME                                                              STATUS   ROLES    AGE   VERSION
ocp-ci-4717-abcde-master-0.c.cloud-native-123456.internal         Ready    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-master-1.c.cloud-native-123456.internal         Ready    master   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-b-shnf4.c.cloud-native-123456.internal   Ready    worker   59d   v1.20.0+2817867
ocp-ci-4717-abcde-worker-c-5gq6r.c.cloud-native-123456.internal   Ready    worker   11m   v1.20.0+2817867

external-dns

external-dnsci/scripts/install_external_dns.sh을 사용하여 Bitnami Helm Chart로 설치되었습니다. 이 도구는 외부로 노출된 로드 밸런서로 생성된 NGINX Ingress 컨트롤러 서비스를 위한 DNS 항목을 만들어서 QA 작업이 인스턴스에 도달할 수 있도록 보장합니다.

구성

작업 시간 초과

참고: 작업 시간 초과는 구성할 수 있습니다. 시간 제한에 도달할 경우, GitLab 컨트롤러는 작업이 제때 완료되지 못했다는 오류를 반환합니다.

이를 구성하려면, deploy/chart/values.yamlenv 값을 업데이트하세요.

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와 연결되면 ./scripts/install_certmanager 스크립트를 실행하여 Letsencrypt TLS 인증서를 설정합니다.

$ 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를 참조하세요. 이러한 kubeconfig 파일은 1Password의 cloud-native 보관함에 저장됩니다. ‘gitlab-operator’로 보관함을 검색하세요.

Kubernetes 클러스터 확장

GKE 클러스터에서 워커 노드를 추가하거나 제거하기 위해 gcloud CLI를 사용합니다. 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 실패 조사 가이드를 따르세요.

컨테이너 빌드

Kubernetes buildx 드라이버를 구성하여 여러 아키텍처용으로 Operator 이미지를 빌드할 수 있습니다. 대상 아키텍처의 쉼표로 구분된 문자열을 BUILDX_ARCHS로 설정하세요(예: amd64,arm64). BUILDX_K8S_DISABLEtrue로 설정된 경우 - 빌드할 플랫폼 수를 자동으로 amd64로 줄입니다.

구성된 Kubernetes 드라이버가 없는 경우 하나의 아키텍처만 (교차로) 컴파일할 수 있습니다.