GitHub Actions Docker 빌드 최적화 및 GHCR 배포 가이드

GitHub Actions를 사용하여 컨테이너 이미지를 빌드하고 **GHCR(GitHub Container Registry)**에 자동 배포할 때, Buildx와 **GitHub Actions 전용 빌드 캐시(type=gha)**를 적용하여 CI/CD 시간을 크게 단축하는 워크플로우 가이드입니다. 1. 주요 특징 및 이점 GHCR 활용: 별도의 Docker Hub 계정이나 외부 레지스트리 비번 설정 없이 GITHUB_TOKEN 인증만으로 안전하게 컨테이너 레지스트리에 푸시. type=gha 캐시: 빌드 레이어 캐시를 GitHub Actions 백엔드에 저장하여 동일한 의존성 재빌드 시간을 극적으로 줄임 (최대 80%+ 속도 향상). Multi-platform 지원: QEMU를 연동하여 linux/amd64와 linux/arm64 이미지를 단일 작업에서 동시 생성. 2. GitHub Actions 워크플로우 작성 .github/workflows/docker-build.yml 경로에 아래 내용을 작성합니다. ...

August 6, 2026 · 3 min

Kubernetes 환경에서 Jenkins 설치 및 기본 설정 가이드

Jenkins Kubernetes 설치 준비 Namespace 생성 # jenkins namespace 생성 kubectl create namespace jenkins Persistent Volume, Persistent Volume Claim 생성 (Optional) 아래 예시는 특정 노드의 local path를 사용하는 정적 프로비저닝(static provisioning) 예시이므로, ebme-storage와 동일한 이름의 StorageClass가 클러스터에 미리 존재해야 하며 PV가 바인딩될 노드(kube-cluster-worker1)도 실제 환경에 맞게 수정 필요 # jenkins-pvc.yaml # ebme-storage class 를 사용하는 30Gi 크기의 PV, PVC 생성 apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-pv spec: capacity: storage: 30Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: ebme-storage local: path: /mnt/jenkins nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kube-cluster-worker1 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-pvc namespace: jenkins spec: accessModes: - ReadWriteOnce storageClassName: ebme-storage resources: requests: storage: 30Gi Jenkins Service Account 생성 (Optional) # jenkins-service-account.yaml # In GKE need to get RBAC permissions first with # kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>] --- apiVersion: v1 kind: ServiceAccount metadata: name: jenkins --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: jenkins rules: - apiGroups: [""] resources: ["pods"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/exec"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/log"] verbs: ["get","list","watch"] - apiGroups: [""] resources: ["events"] verbs: ["watch"] - apiGroups: [""] resources: ["secrets"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: jenkins roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: jenkins subjects: - kind: ServiceAccount name: jenkins Jenkins values.yaml 생성 (Optional) Jenkins 에서 제공하는 기본 템플릿 value.yaml 에서 필요한 부분만 수정 # jenkins-values.yaml # persistence 부분을 아래와 같이 수정 persistence: enabled: true existingClaim: "jenkins-pvc" storageClass: "ebme-storage" accessMode: "ReadWriteOnce" size: "30Gi" Helm을 사용한 젠킨스 설치 Jenkins Repository 추가 helm repo add jenkinsci https://charts.jenkins.io helm repo update Jenkins 설치 # 기본 설정대로 설치 helm install -n jenkins jenkins jenkinsci/jenkins # 기존 작성한 jenkins-values.yaml 을 사용하여 설치 helm install -n jenkins jenkins jenkinsci/jenkins -f jenkins-values.yaml Jenkins Service expose NodePort 로 Service 를 expose 하여 접속 가능하도록 설정 해당 주소로 Jenkins 접속 확인 kubectl expose svc jenkins -n jenkins --type=NodePort --name=jenkins Jenkins 비밀번호 확인 kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo

June 7, 2023 · 2 min