젠킨스와 CI 파이프 라인
(섹션: 기술 및 인프라)
간략한 요약
Jenkins는 하이브리드 iGaming 인프라에서 CI의 범용 "엔진" 으로 남아 있습니다. 응용 프로그램 어셈블리, 컨테이너화, 테스트, 보안 검증 및 아티팩트 게시를 통합합니다. 성공은 코드 (선언/멀티 브랜치), 공유 라이브러리, Kubernetes의 임시 에이전트, 하드 보안 및 비밀, GitOps 설정 관리, 성능 및 비용 지표와 같은 파이프 라인입니다.
1) iGaming을위한 Jenkins 아키텍처
컨트롤러 (LTS) + 에이전트: 컨트롤러의 최소 플러그인; 작업은 에이전트에게 전달됩니다.
Ephemeral 에이전트: K8/동적 'jnlp' (빠른 시작, 깨끗한 환경) 에서 실행됩니다.
작업 격리: 폴더/권리 (폴더 + 역할 기반 전략), 가장 작은 권리에 대한 크레딧.
관찰 가능성: 메트릭 (대기 시간, 대기열), 중앙 집중식 스테이지 로그, 파이프 라인의 추적 ID 내기.
2) 배관 패턴: 선언 및 멀티 브랜치
선언시: 균일 한 단계의 표준 파이프 라인은 '포스트' 단계를 명확하게합니다.
스크립트 된 경우: 희귀 한 "맞춤형" 브랜치.
멀티 브랜치: 각 브랜치/PR에 대한 자동 파이프 라인; 활성 지점 전용 정책.
기본 선언 파이프 라인
groovy pipeline {
agent { label 'k8s' } // или agent { kubernetes {... } }
options {
timestamps()
ansiColor('xterm')
buildDiscarder(logRotator(numToKeepStr: '50'))
timeout(time: 30, unit: 'MINUTES')
disableConcurrentBuilds()
}
environment {
REGISTRY = 'registry. example. com'
IMAGE = "${env. REGISTRY}/payments:${env. GIT_COMMIT}"
}
stages {
stage('Checkout') {
steps { checkout(scm) }
}
stage('Lint & Unit') {
parallel {
stage('Lint') { steps { sh 'make lint' } }
stage('Unit') { steps { sh 'make test' } }
}
}
stage('SCA/SAST') {
steps {
sh'make deps_audit'//SCA (dependencies)
sh'make sast '//static analysis
}
}
stage('Build Image') {
steps { sh 'docker build -t $IMAGE. && docker push $IMAGE' }
}
stage('SBOM & Sign') {
steps {
sh 'syft $IMAGE -o spdx-json > sbom. json'
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
archiveArtifacts artifacts: 'sbom. json', fingerprint: true
}
}
}
post {
success { echo '+ Build OK' }
failure { echo '- Build failed'; sh 'printenv sort sed -n "1,50p"' }
always { cleanWs() }
}
}
3) Kubernetes 에이전트 및 컨테이너 환경
(PHP 3 = 3.0.6, PHP 4)
groovy pipeline {
agent {
kubernetes {
yaml """apiVersion: v1 kind: Pod spec:
serviceAccountName: jenkins containers:
- name: build image: docker:27-dind securityContext: { privileged: true }
- name: tools image: alpine:3. 20 command: ['cat']
tty: true
"""
defaultContainer 'tools'
}
}
stages {
stage('Build in DinD') {
steps {
container('build') {
sh '''
dockerd-entrypoint. sh & sleep 5 docker build -t $IMAGE.
docker push $IMAGE
'''
}
}
}
}
}
연습: 일반적인 'empty해당 '/원격 캐시를 통한 레이어 캐시; CPU/RAM; 무거운 어셈블리를 분리하기위한 'nodeSelector/tains' 한계
4) 공유 도서관: DRY 및 균일 한 표준
공유 라이브러리에서 공통 단계 (린터, SAST, 어셈블리, 출판) 를 가져 오십시오.
groovy
// vars/withQuality. groovy def call(Closure body) {
stage('Quality Gate') {
parallel(
"Lint": { sh 'make lint' },
"Unit": { sh 'make test' },
"SCA": { sh 'make deps_audit' }
)
}
body()
}
사용량:
groovy
@Library('ci-lib@v3') _
pipeline {
agent any stages {
stage('Pipeline') {
steps {
withQuality {
sh 'make build'
}
}
}
}
}
팁: 라이브러리 버전 ('태그'), 단계 테스트를 다루고 CHANELOG를 유지하십시오.
5) 비밀과 자격 증명
자격 증명 바인딩: '사용자 이름 비밀번호', '문자열', '파일', 'sshUserPrivateKey'.
비밀 범위: 최소 권리; 올바른 단계에서만 사용하십시오.
비밀 관리자: 외부 저장소 제공 업체 (KMS/비밀 관리자/HashiCorp Vault).
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6) 동시성, 행렬, 캐시
매트릭스 어셈블리
groovy stage('Test Matrix') {
matrix {
axes {
axis { name 'PY'; values '3. 10', '3. 12' }
axis { name 'DB'; values 'mysql', 'postgres' }
}
stages {
stage('Run') { steps { sh 'pytest -q' } }
}
post { always { junit 'reports/.xml' } }
}
}
캐싱: 볼륨의 도커 계층 캐시, 종속성 캐시 ('~/.m2', '~/.cash/pip'); 'stash/unstash' 또는 아티팩트 스토리지를 통한 단계 간 아티팩트.
7) 안전 점검 및 준수
별도의 환경에서 CI, DAST의 SCA/SAST/Secret-scan.
SBOM (Syft/CycloneDX), 아티팩트 서명 (cosign), 서명되지 않은 배포 금지 정책.
정책 게이트: 중요한 CVE 용 파이프 라인 중지; PR 보고서.
PII 윤곽: 비밀, 마스크 변수, 민감한 어셈블리를위한 별도의 에이전트를 기록하지 마십시오.
8) 출판 아티팩트 및 CD 통합
레지스트리: 보존 정책, 면역 태그가있는 Docker/OCI.
패키지 참조: Maven/NPM/PyPI 프록시 + 캐시.
CD 트리거: 이벤트를 Argo CD/Flagger로 보내거나 GitOps 매니페스트 리포지토리에서 PR을 작성하십시오.
9) 코드로 Jenkins 설정 (JCasC)... GitOps
컨트롤러 설정을 템플릿 작업, 크레딧 (링크), RBAC, 에이전트와 같은 코드로 유지하십시오.
yaml jenkins:
systemMessage: "Jenkins (iGaming CI)"
numExecutors: 0 authorizationStrategy:
roleBased:
roles:
global:
- name: "readers"
pattern: "."
permissions: ["Overall/Read"]
nodes:
- permanent:
name: "edge-builder"
remoteFS: "/home/jenkins"
labels: "docker"
unclassified:
location:
url: "https://ci. example. com/"
credentials:
system:
domainCredentials:
- credentials:
- string:
id: "cosign-key"
description: "Cosign key ref"
secret: "${COSIGN_KEY_FROM_ENV}"
연습: 설정-Git, PR 검토, dev→ 단계 → prod 프로모션; 변수/외부 관리자를 통한 비밀.
10) 관찰 가능성, 신뢰성 및 비용
측정 항목: 대기열, 단계 지속 시간, 재시작 비율, 에이전트 처리량.
실패: '재 시도', '시간 초과', 벗겨진 테스트의 '안정적인' 표시, ChatOps의 알림.
FinOps: 유휴 에이전트의 자동 종료, 동시 조립 제한, 폴더/명령 할당량.
11) 다양한 작업을위한 파이프 라인
백엔드/웹 서비스
Lint/Units → SAST/SCA → 빌드 → SBOM/Sign → Publishing → (CD 트리거).
데이터/ETL
dbt test → 아티팩트 → 정적 SQL 분석 → 모델 및 문서를 게시합니다.
ML/LLM
데이터/라이센스 확인 → 스팟 에이전트 교육 → ONNX/TensorRT 내보내기 → perf 테스트 (대기 시간/토큰/s) → 모델 서명 및 게시.
12) Runabooks (일반적인 사건)
대기열이 커지고 있습니다: 에이전트 추가, "정지 된" 파이프 라인 확인, 동시성 한계.
어셈블리 플로트: 에이전트 컨테이너의 킥 버전 도구; 공유 작업 공간을 비활성화합
로그에 "누설 된" 비밀: 빌드 로그 삭제, 크레딧 교체, 감사 수행; 마스킹을 추가하십시오.
컨트롤러 드롭: 백업 JCasC + 작업/플러그인 스토리지에서 복구가 진행됩니다.
13) 구현 점검표
1. 최소 플러그인 세트가있는 Jenkins LTS; 다른 모든 것은 에이전트에 있습니
2. Ephemeral K8s 에이전트, 리소스 제한, 레이어 캐시.
3. 선언/멀티 브랜치, PR 검증, '게시물 {항상 {cleanWs ()}}'.
4. 버전이 포함 된 공유 라이브러리; 균일 한 품질/안전 단계.
5. 자격 증명 바인딩 + 외부 비밀; 최소한의 범위.
6. SCA/SAST/Secret-scan/DAST, SBOM 및 이미지 서명.
7. JCasC 및 GitOps 설정 관리; 변경 사항에 대한 홍보 검토.
8. 메트릭/알림/ChatOps; 퇴각/타임 아웃; 유물과 저널.
9. 저장/보존 정책, 작업 공간의 자동 위생.
10. 문서화 된 runabooks 및 정규 게임 일.
14) 안티 패턴
컨트롤러 "모든 것의 서버처럼": 무거운 어셈블리 및 플러그인.
다양한 검토 및 코드 검토없이 스크립트 작업.
비밀과 통나무 혼합; 광범위한 권리를 가진 대출.
에이전트는 거의/일정한 → 드리프트 환경, 벗겨진 테스트입니다.
CVE에 의한 SBOM/아티팩트 및 게이트의 서명 부재.
"수동" 설정 제어, JCasC/GitOps 없음.
요약
Jenkins는 강력하고 유연한 CI 코어로 남아 있습니다 구성을 코드 (JCasC) 로 변환하고 공유 라이브러리의 단계를 표준화하고 임시 K8 에이전트를 기반으로 빌드를 실행하며 보안/서명/SBOM을 파이프 라인에 직접 내장하면 예측 가능한 릴리스, 제어 된 비용 및 iGaming 피크 복원력을 얻을 얻을 수 있습니다.