[CI/CD] Jenkins + Git 으로 CI/CD 환경 구축하기 [1/2]

CI/CD는 클라우드 환경 말고도 이미 너~~얼리 사용되고 있는 자동화 방법이다. 개발자가 코드를 작성해서 Github든 Gitlab이든 어딘가에 커밋을 하게 되면, 자동으로 테스트 환경에서 코드를 테스트한다거나, 운영 환경에 배포를 한다거나 하는 일련의 자동화 프로세스이다.

CI/CD를 위한 도구들은 상당히 많은데, 전통적(?)인 Jenkins를 사용해서 한번 환경을 구축해보도록 하곘다. 사실 Jenkins를 사용해보면 다른 도구를 사용하는데 있어서 그리 어색하거나 낯설지 않을 것이라고 생각한다.

1. Jenkins Install

일단 Jenkins를 서버에 설치하자.

서버에 쉽게 yum install jenkins 로 데몬으로 설치할 수도 있고, 컨테이너로 Jenkins를 설치할 수도있다. 클라우드 환경이라면 아무래도 Jenkins 서버를 로컬에 데몬으로 올리는 것보다는 컨테이너로 띄우는게 여러모로 장점이 많아보인다.

컨테이너로 배포하는 안도 찾아보니 helm chart를 이용하는 것과 yaml 파일 이용해서 manual 하게 배포하는 방법이 있었다. 테스트하기 위해 구성한 환경에 helm을 설치해놓지 않아서 yaml 이용해서 배포를 진행하였다.

Jenkins Deployment의 yaml은 아래와 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts-centos
ports:
- containerPort: 8080
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins-pvc

특별히 수정할만한 yaml 내용은 각 환경에 맞게 spec.template.spec.volumes 부분만 수정해주자. 나는 사전에 만들어 놓은 pvc에 연결하였다. 그리고 Label을 좀 다르게하고 싶으면 수정해도 좋다. 다만, Service와 동일하게 ~ (뒷 부분 진행하면서 보니 Jenkins 이미지가 lts-jdk11인걸 사용하면 gitlab webhook 플러그인을 사용할 때 디펜던시인 ruby를 jdk11부터 지원중단된 이슈 때문에 webhook 기능을 사용 못한다. 따라서 lts-centos로 사용하자 이 이미지는 jdk8이다.)

다음으로는 배포한 Jenkins 파드를 서비스로 올리는 것이다. NodePort를 사용하여도 되고, ClusterIP로 하고 Proxy 해줘도 되고, LB를 사용해도 된다. 나는 NodePort를 사용해서 서비스를 올렸다.

apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: jenkins

알다시피 위처럼 type만 NodePort로 하고 어떤 NodePort를 사용할지 지정하지 않고, 배포하게 되면 알아서 30000번대에 포트를 배정한다.

#kubectl get svc

커맨드로 Jenkins 파드가 어떤 포트로 바인딩되었는지 확인하고 해당 서비스로 웹 접속을 해보면 아래와 같은 화면을 볼 수 있다.

위와 같이 초기 비밀번호를 확인할 수 있는 위치를 알려주는데 pod가 떠있는 서버에서 overlay된 정보를 find로 찾아도 되고, pod에 접속해서 해당 파일을 열어봐도 된다. 좋을대로 하자!

#kubectl exec -it [jenkins-pod-name] cat /var/jenkins_home/secrets/initialAdminPassword

위 커맨드를 이용해서 비밀번호를 확인하자

다음화면에서 뜨는 Plug-in은 일단 추천해주는 설치로 진행을 했다.

이제 깃을 깔아보자!

2. GitLab Install

Github를 사용하면 바로 플러그인을 깔고 연동해서 사용할 수 있지만, 시스템에 GitLab을 구축하고 프라이빗한 CI/CD 환경을 만들어보고자 GitLab을 구축하고 구축한 GitLab을 연동시켜보자

Gitlab도 kubernetes에 배포해서 사용하도록 하겠다. Gitlab 공식 홈페이지에서 다양한 환경 및 도구를 사용해서 배포하는 방법이 자세하게 나와있다. Kubernetes에서 배포하는 것은 역시나 helm chart를 사용하여 배포하게 가이드 되어있는데, 간단하게 구축하고 싶기에 그냥 아래와 같이 yaml 파일 작성해서 배포진행했다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
spec:
replicas: 1
selector:
matchLabels:
app: gitlab
template:
metadata:
labels:
app: gitlab
spec:
containers:
- name: gitlab
image: gitlab/gitlab-ce:latest
ports:
- containerPort: 80
volumeMounts:
- name: gitlab-data
mountPath: /var/opt/gitlab/
volumes:
- name: gitlab-data
persistentVolumeClaim:
claimName: gitlab-pvc

pvc 연결안해주면, 소중한 코드들이 모두 날아가니까…. 만들어서 연결해주자 그리고 서비스는 아래와 같이 배포하였다. jenkins 서비스 yaml과 이름만 다르다.

apiVersion: v1
kind: Service
metadata:
name: gitlab-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: gitlab

포트 확인하고, IP:PORT로 gitlab에 접속해보면, 초기 패스워드 설정 화면이 뜬다. (화면이 뜨는데 시간이 좀 걸린다. 502화면 뜨고 좀 기다리면 나온다. )

초기 비밀번호를 설정하고 로그인해보면 아래와 같이 뜬다. (ID는 root 이다.) 추가 사용자는 웹에서 추가할 수 있는 것 같다.

이제 CI/CD 환경 구축에서 필요한 Jenkins, Gitlab 구축은 완료하였다. 연동하는 방법과 CI/CD가 잘 진행되는지 확인은 다음 포스팅에서 이어서 진행하도록…

gooby goober yeah