Documentation
¶
Overview ¶
Package gitlab 은 GitLab API v4 를 통해 그룹·프로젝트·파일을 프로비저닝한다.
GitLab 의 Container Registry 와 Package Registry 는 프로젝트 단위로 존재한다. 따라서 공용 베이스 이미지나 npm/maven 패키지를 두려면 그것을 소유할 프로젝트가 반드시 필요하다 — 이 어댑터가 그 프로젝트를 만드는 경로다.
Index ¶
- Constants
- func TokenSecretPath(env, orgID string) string
- type BuildReader
- func (r *BuildReader) ArtifactWebURL(ref port.CIArtifactRef) string
- func (r *BuildReader) ListBuilds(ctx context.Context, jobName, branch string, limit int) ([]port.CIBuild, error)
- func (r *BuildReader) ReadArtifact(ctx context.Context, ref port.CIArtifactRef) ([]byte, bool, error)
- func (r *BuildReader) WithWebBaseURL(base string) *BuildReader
- type Client
- func (c *Client) BaseURL() string
- func (c *Client) CommitFiles(ctx context.Context, projectID string, spec port.CommitSpec) error
- func (c *Client) CreateProjectAccessToken(ctx context.Context, projectID string, spec port.AccessTokenSpec) (string, error)
- func (c *Client) DeleteProject(ctx context.Context, projectID string) error
- func (c *Client) EnsureGroup(ctx context.Context, spec port.GroupSpec) (*port.SCMGroup, error)
- func (c *Client) EnsureProject(ctx context.Context, spec port.ProjectSpec) (*port.SCMProject, error)
- func (c *Client) EnsureWebhook(ctx context.Context, projectID, targetURL, secret string) error
- func (c *Client) Ping(ctx context.Context) error
- func (c *Client) SetPipelineVariable(ctx context.Context, projectID, key, value string) error
- func (c *Client) SetProjectVariable(ctx context.Context, projectID string, v port.ProjectVariable) error
- func (c *Client) WithHTTPClient(h *http.Client) *Client
- func (c *Client) WithRegistryHost(host string) *Client
- type KubectlRunner
- type PipelineTrigger
- type SecretStore
- type TokenIssuer
Constants ¶
const ( // SecretProvider 는 토큰을 보관할 시크릿 백엔드다. SecretProvider = "openbao" // AutomationTokenName 은 Nullus 가 발급하는 PAT 의 이름이다. // 사람이 만든 토큰과 구분되어야 정리(revoke) 대상을 특정할 수 있다. AutomationTokenName = "nullus-automation" )
Variables ¶
This section is empty.
Functions ¶
func TokenSecretPath ¶
TokenSecretPath 는 API 토큰의 시크릿 경로다.
스택 모듈의 규약(kv/nullus/{env}/{org}/{module}/{provider}/...)을 따른다.
Types ¶
type BuildReader ¶ added in v0.6.0
type BuildReader struct {
// contains filtered or unexported fields
}
BuildReader 는 GitLab CI 파이프라인 실행 이력을 읽는다.
스택의 파이프라인은 그룹 아래 앱 이름의 프로젝트에서 돈다(ProvisionAppProject). port.CIBuildReader 는 job 이름으로 묻기 때문에 그룹 경로를 쥐고 프로젝트를 찾는다.
func NewBuildReader ¶ added in v0.6.0
func NewBuildReader(client *Client, groupPath string) *BuildReader
NewBuildReader 는 groupPath 아래 프로젝트의 실행 이력을 읽는 BuildReader 를 만든다.
func (*BuildReader) ArtifactWebURL ¶ added in v0.6.0
func (r *BuildReader) ArtifactWebURL(ref port.CIArtifactRef) string
ArtifactWebURL 은 잡 산출물 파일을 GitLab 화면에서 여는 주소다.
func (*BuildReader) ListBuilds ¶ added in v0.6.0
func (r *BuildReader) ListBuilds(ctx context.Context, jobName, branch string, limit int) ([]port.CIBuild, error)
ListBuilds 는 최근 파이프라인과 그 잡을 읽어 정규화한다.
프로젝트가 없으면(프로비저닝 전) 빈 목록이다 — 실행 기록이 없는 것이지 오류가 아니다.
func (*BuildReader) ReadArtifact ¶ added in v0.6.0
func (r *BuildReader) ReadArtifact(ctx context.Context, ref port.CIArtifactRef) ([]byte, bool, error)
ReadArtifact 는 잡이 artifacts.paths 로 남긴 파일 하나를 읽는다.
GitLab 은 산출물을 잡 단위로 보관한다. 단계의 잡 id 가 없으면 물을 곳이 없다 — 추측해서 다른 잡의 산출물을 읽지 않는다.
func (*BuildReader) WithWebBaseURL ¶ added in v0.6.0
func (r *BuildReader) WithWebBaseURL(base string) *BuildReader
WithWebBaseURL 은 리포트 링크에 쓸 외부 주소를 정한다.
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client 는 port.SCMProvisioner 의 GitLab 구현체다.
func NewClient ¶
NewClient 는 GitLab API v4 클라이언트를 만든다.
baseURL 은 API 접두사를 뺀 인스턴스 주소다 (예: http://gitlab-webservice-default.ns.svc:8181). token 은 api 스코프를 가진 Personal/Project Access Token 이다.
func (*Client) CommitFiles ¶
CommitFiles 는 여러 파일을 한 커밋으로 올린다.
GitLab 커밋 API 에는 upsert 액션이 없고, action 은 파일마다 지정한다. 새 프로젝트는 initialize_with_readme 로 README.md 만 있는 상태라 스캐폴딩은 "이미 있는 파일 + 없는 파일" 이 섞인다. 커밋 전체에 하나의 action 을 쓰면 어느 쪽으로 보내도 실패하므로, 트리를 한 번 읽어 파일별로 정한다.
func (*Client) CreateProjectAccessToken ¶
func (c *Client) CreateProjectAccessToken( ctx context.Context, projectID string, spec port.AccessTokenSpec, ) (string, error)
CreateProjectAccessToken 은 프로젝트 범위 토큰을 발급한다.
값은 발급 응답에만 담기므로 호출자가 즉시 보관해야 한다.
func (*Client) DeleteProject ¶
get 은 200 이면 true, 404 면 false 를 돌려준다. 그 외는 오류다. DeleteProject 는 프로젝트를 지운다.
이미 없으면 성공으로 본다 — 삭제의 목표는 "없는 상태" 이고, 404 를 오류로 올리면 앞선 시도가 절반쯤 성공한 뒤 재시도할 때 영영 끝나지 않는다.
GitLab 은 기본적으로 지연 삭제(휴지통)로 동작할 수 있다. 그룹 설정에 따라 즉시 지워지지 않고 보존 기간이 지나야 사라지므로, 호출이 성공해도 프로젝트가 잠시 조회될 수 있다.
func (*Client) EnsureGroup ¶
EnsureGroup 은 그룹을 조회하고 없으면 만든다.
func (*Client) EnsureProject ¶
func (c *Client) EnsureProject(ctx context.Context, spec port.ProjectSpec) (*port.SCMProject, error)
EnsureProject 는 프로젝트를 조회하고 없으면 만든다.
func (*Client) EnsureWebhook ¶ added in v0.6.0
EnsureWebhook 은 프로젝트에 push webhook 을 건다(멱등).
대상이 클러스터 안 주소면 먼저 그 호스트를 허용 목록에 더한다. GitLab 은 webhook 을 만들 때 주소를 검사하므로 순서가 바뀌면 생성이 "local network" 로 거부된다. 허용 목록을 바꾸려면 관리자 토큰이어야 한다(플랫폼 토큰은 root 의 자동화 PAT 다).
func (*Client) Ping ¶
Ping 은 현재 토큰이 실제로 인증되는지 확인한다.
보관된 토큰은 폐기·만료될 수 있어, 쓰기 전에 한 번 확인하지 않으면 이후 모든 호출이 401 로 죽는다.
func (*Client) SetPipelineVariable ¶ added in v0.6.0
SetPipelineVariable 은 비밀이 아닌 프로젝트 CI/CD 변수를 등록하거나 갱신한다.
프로젝트 변수는 .gitlab-ci.yml 의 variables 보다 앞선다 — 이미 스캐폴딩한 파이프라인도 다시 커밋하지 않고 값이 바뀐다.
가리지도 보호하지도 않는다. GitLab 은 8자 미만 값(true·allow)의 마스킹 등록을 통째로 거부하고, 보호(protected)를 켜면 보호 브랜치 밖의 실행이 정책 없이 돈다.
func (*Client) SetProjectVariable ¶
func (c *Client) SetProjectVariable(ctx context.Context, projectID string, v port.ProjectVariable) error
SetProjectVariable 은 CI/CD 변수를 등록하거나 이미 있으면 갱신한다.
GitLab 변수 API 에는 upsert 가 없다. POST 로 시도하고 키 충돌이면 PUT 한다 — 재프로비저닝에서 자격증명이 바뀌었는데 예전 값이 남으면 빌드가 계속 실패한다.
func (*Client) WithHTTPClient ¶
WithHTTPClient 는 타임아웃·전송 계층을 교체한다.
func (*Client) WithRegistryHost ¶
WithRegistryHost 는 응답에 container_registry_url 이 없을 때 쓸 폴백 호스트를 설정한다.
type KubectlRunner ¶
KubectlRunner 는 kubectl 실행을 추상화한다.
다른 모듈의 동일 타입을 재사용하지 않는다 — 모듈 간 직접 import 를 피하기 위해 CI/CD 컨텍스트가 자기 계약을 소유한다.
type PipelineTrigger ¶ added in v0.6.0
type PipelineTrigger struct {
// contains filtered or unexported fields
}
PipelineTrigger 는 port.CIBuildTrigger 의 GitLab CI 구현체다.
스택에 묶인 파이프라인의 "실행" 은 플랫폼이 빌드하지 않고 CI 에 넘긴다. GitLab 은 커밋이 있을 때만 파이프라인을 돌리므로, 커밋 없이 지금 실행하려면 API 로 만들어야 한다.
func NewPipelineTrigger ¶ added in v0.6.0
func NewPipelineTrigger(client *Client, groupPath string) *PipelineTrigger
NewPipelineTrigger 는 groupPath 아래 앱 프로젝트의 파이프라인을 시작시키는 트리거를 만든다.
func (*PipelineTrigger) TriggerBuild ¶ added in v0.6.0
TriggerBuild 는 jobName(앱 프로젝트)의 branch 에 파이프라인을 만들고 그 주소를 돌려준다.
그 브랜치의 최신 파이프라인이 아직 돌고 있으면 새로 만들지 않고 그 실행에 붙는다. 화면은 파이프라인을 만든 직후 "실행" 을 한 번 더 부르는데, 스캐폴딩 커밋이 이미 파이프라인을 시작한 뒤라 또 만들면 같은 커밋의 배포 잡 둘이 같은 브랜치에 되커밋을 밀어 둘째가 non-fast-forward 로 실패한다. 최신 것이 돌고 있다는 것은 곧 최신 코드가 실행 중이라는 뜻이므로 거기에 붙는 것이 사용자가 바란 일과 같다.
func (*PipelineTrigger) WithWebBaseURL ¶ added in v0.6.0
func (t *PipelineTrigger) WithWebBaseURL(base string) *PipelineTrigger
WithWebBaseURL 은 실행 링크에 쓸 외부 주소를 정한다.
type SecretStore ¶
type SecretStore interface {
GetTokenForStack(ctx context.Context, provider, stackID, path string) (string, error)
PutTokenForStack(ctx context.Context, provider, stackID, path, value string) error
}
SecretStore 는 토큰 보관에 필요한 최소 동작만 노출한다.
스택 범위 접근을 쓴다 — OpenBao 는 스택마다 배포되므로 전역 주소가 하나일 수 없고, 해당 스택의 저장소에 넣어야 ESO 와 같은 곳을 본다.
type TokenIssuer ¶
type TokenIssuer struct {
// contains filtered or unexported fields
}
TokenIssuer 는 GitLab API 토큰을 확보한다.
GitLab 을 외부에 노출하지 않고도 동작해야 하므로 API 가 아니라 toolbox 파드의 gitlab-rails 콘솔로 PAT 를 발급한다. Runner 등록 토큰 발견과 같은 방식이다. PAT 값은 생성 시점에만 읽을 수 있어 발급 즉시 시크릿 저장소에 보관한다.
func NewTokenIssuer ¶
func NewTokenIssuer(kubeconfig port.KubeconfigProvider, runKubectl KubectlRunner, secrets SecretStore) *TokenIssuer
NewTokenIssuer 는 TokenIssuer 를 만든다.
func (*TokenIssuer) EnsureToken ¶
func (t *TokenIssuer) EnsureToken(ctx context.Context, spec port.SCMTokenSpec) (string, error)
EnsureToken 은 보관된 토큰을 돌려주고, 없거나 Force 면 새로 발급한다.