Windows 버전에 대한 Docker 실행기 지원 추가
GitLab은 특정 Windows 버전을 지원합니다.
새로운 Windows 버전에 대한 도커 실행기를 지원하려면, 동일한 Windows 버전의 도우미 이미지를 릴리스해야 합니다. 그런 다음 도우미 이미지를 Windows 호스트 OS에서 실행할 수 있습니다.
해당 버전을 위한 도우미 이미지를 빌드하려면, 해당 Windows 버전에 GitLab 러너가 설치되어 있어야 합니다. 왜냐하면 Windows는 호스트 OS와 컨테이너 OS 버전이 일치해야 하기 때문입니다.
인프라
사용자 작업에 사용하기 위해 도우미 이미지를 빌드해야 합니다.
인프라 사용을 위한 기본 이미지 생성
Windows는 호스트 OS 버전이 컨테이너 OS와 일치해야 하므로, ‘Windows Server Core 2004’ 이미지를 빌드할 경우 ‘Windows Server Core 2004’에 ‘gitlab-runner’가 설치되어 있어야 합니다.
이를 위해 windows-containers 리포지터리를 업데이트하여 기본 이미지를 빌드해야 합니다. 기본 이미지는 CI의 자동확장기에 의해 사용될 것입니다. 새로운 기본 이미지는 GitLab 러너 도우미 이미지를 빌드하는 데 사용될 것입니다.
예를 들어, 13.7 마일스톤에 ‘Windows Server Core 2004’를 지원하려면 다음 Merge Request을 참고할 수 있습니다. GCP에서 제공하는 기본 이미지에 따라 빌드 프로세스 중에 Docker를 설치해야 할 수도 있고 아니면 불필요할 수도 있습니다. 이 Merge Request에서 다음 파일을 업데이트합니다:
.gitlab-ci.yml
.gitlab/ci/build.gitlab-ci.yml
생성된 이미지 테스트
생성된 이미지를 dev
단계에서 테스트하는 것을 권장합니다. 이는 dev xxx
로 이름이 지어질 가능성이 높습니다. 여기서 xxx
는 Windows 서버 버전을 나타냅니다.
다음 단계를 통해 이미지를 테스트할 수 있습니다:
-
GitLab Runner 프로젝트
에 새로운 Windows 서버 버전을 추가하고gitlab-runner-helper.x86_64-windows.exe
바이너리를 생성합니다. -
dev
단계 동안 생성된 디스크 이미지를 사용하여 VM을 생성합니다. ‘Windows Server LTSC2022’를 지원하기 위해 디스크 이미지 이름은runners-windows-21h1-core-containers-dev-40-mr
였습니다. - 이 VM에서
gitlab-runner-helper.x86_64-windows.exe
바이너리를 다운로드해야 하므로,gitlab-runner-helper
Docker 이미지를 생성합니다.Invoke-WebRequest
PowerShell 명령이 사용할 수 없을 수 있으므로, 대신Start-BitsTransfer
명령을 사용해야 합니다. - 새로운 GCP Windows 서버 이미지를 지원하기 위해 다른 VM을 생성합니다.
- 이전에 업데이트한
GitLab-Runner
프로젝트에 대한gitlab-runner
실행 파일을 설치하고 프로젝트에 등록합니다. - 작업을 성공적으로 시작합니다.
이 절차의 예는 이 코멘트에 요약되어 있습니다.
이미지 게시
이전 단계에서 생성된 Merge Request을 Merge한 후, 이미지를 우리의 프로덕션 GCP 프로젝트에 게시하려면 게시 작업을 매뉴얼으로 실행해야 합니다.
게시
작업에서 생성된 이미지 이름을 메모해 두어야 합니다. 예를 들어, 이 작업에서 runners-windows-2019-core-containers-2020-07-17
라는 이름의 이미지를 생성했습니다. 이는 설치 부분에 사용될 것입니다.
두 개의 새로운 러너 매니저 추가
이 시점에서 프로덕션 환경에 준비된 기본 이미지가 있어야 하므로, GitLab Runner 프로젝트의 CI 파이프라인에서 이를 사용할 수 있습니다. 남은 것은 러너 매니저를 설정하는 것뿐입니다.
등록
새로운 러너를 등록하기 위해 두 개의 새로운 러너에 대해 gitlab-runner register
를 실행합니다. 이러한 러너는 프로젝트별 러너이어야 하므로, 프로젝트 설정에서 등록 토큰을 사용해야 합니다. 러너의 이름은 기존 러너와 동일한 명명 규칙을 따라야 합니다.
예를 들어, ‘Windows Server Core 2004’의 경우, 러너 매니저의 이름은 다음과 같아야 합니다:
windows-2004-private-runner-manager-1
windows-2004-private-runner-manager-2
등록된 후에는 config.toml
파일에서 찾은 러너 토큰을 안전하게 보관해야 합니다. 왜냐하면 이것들은 설치 단계에서 필요하기 때문입니다.
마지막으로, 새로운 러너 매니저를 security fork 프로젝트와 ‘liveness’ test support 프로젝트에 할당해야 합니다. 따라서 각각의 새로운 러너 매니저에 대해 다음을 수행합니다:
- Runner 프로젝트 CI/CD 설정 페이지의 러너 섹션으로 이동합니다;
- 해당 프로젝트에 대해 러너를 활성화합니다.
-
security fork 프로젝트의 경우:
- 프로젝트의 CI/CD 설정 페이지의 러너 섹션으로 이동합니다.
- 이 프로젝트에 대한 러너를 활성화합니다.
-
‘liveness’ test support 프로젝트의 경우:
- 프로젝트의 CI/CD 설정 페이지의 러너 섹션으로 이동합니다.
- 이 프로젝트에 대한 러너를 활성화합니다.
- 러너 프로젝트 CI/CD 설정 페이지로 돌아가서 다시 러너를 잠그세요.
설치
새로운 인스턴스를 설치하려면 autoscaler에 해당 Windows 버전용 config.toml
을 추가해야 합니다. 새로운 Windows 버전을 포함하도록 Ansible 리포지터리를 업데이트해야 합니다.
예를 들어, 13.7 마일스톤에서 Windows Server Core 2004
를 지원하고 싶은 경우, 다음 Merge Request에서 다음 파일을 업데이트합니다:
ansible/roles/runner/tasks/main.yml
ansible/roles/runner/tasks/autoscaler.yml
ansible/group_vars/gcp_role_runner_manager.yml
ansible/host_vars/windows-shared-runners-manager-1.yml
ansible/host_vars/windows-shared-runners-manager-2.yml
Merge Request을 올릴 때 유의하세요. 관리자가 등록하여 새로운 러너 2개를 저장하고, ansible/host_vars
에서 정의된 키로 CI/CD 변수에 저장되어야 합니다.
registry.gitlab.com/gitlab-org/ci-cd/tests/liveness
게시
이미지 registry.gitlab.com/gitlab-org/ci-cd/tests/liveness
는 GitLab Runner의 CI 프로세스의 일부로 사용됩니다. 새로운 Windows 버전을 기반으로 한 이미지가 게시되었는지 확인하세요.
예를 들어, 13.7 마일스톤에서 Windows Server Core 2004
를 지원하고 싶은 경우, 다음 Merge Request에서 다음 파일을 업데이트합니다:
.gitlab-ci.yml
Makefile
특정 Windows 버전 지원하기 위한 GitLab Runner 업데이트
사용자가 도커 실행자를 사용할 수 있도록 도우미 이미지를 제공해야 하므로 코드 기반 내에서 특정 확인 사항이 있습니다. 새로운 Windows 버전을 허용해야 합니다.
다음을 업데이트해야 합니다:
- 지원 버전 디렉터리 및 해당 테스트
- 베이스 이미지 디렉터리 및 해당 테스트
- GitLab CI의 기본 브랜치에서 테스트 실행 업데이트
- 릴리스 단계 업데이트
예를 들어, 13.7 마일스톤에서 Windows Server Core 2004
를 지원하고 싶은 경우, 다음 Merge Request에서 다음 파일을 업데이트합니다:
helpers/container/helperimage/windows_info.go
helpers/container/helperimage/windows_info_test.go
helpers/container/windows/version.go
helpers/container/windows/version_test.go
.gitlab/ci/test.gitlab-ci.yml
.gitlab/ci/coverage.gitlab-ci.yml
.gitlab/ci/_common.gitlab-ci.yml
.gitlab/ci/release.gitlab-ci.yml
ci/.test-failures.servercore2004.txt
docs/executors/docker.md