Programming/Jenkins

Jenkins를 이용한 CI/CD 구축 (spring, docker, nginx, docker) 1

LazyCat 2024. 11. 15. 20:03
반응형

 

🤍Jenkins 컨테이너 설치

우리 프로젝트의 시스템 아키텍쳐는 아래와 같습니다

 

Docker에 대한 설명은 생략하고 도커 위에 젠킨스를 설치하게씁니다!

 

우리 프로젝트는 docker-compose.yml로 모든 컨테이너들을 관리하기 때문에

이 파일에 Jenkins 이미지를 작성합니다.

 

docker-compose.yml

  jenkins:
    container_name: jenkins-compose
    image: jenkins/jenkins:lts
    user: root
    ports:
      - "8090:8080"
    volumes:
      - /home/ubuntu/libs/jenkins:/var/jenkins_home
      - /home/ubuntu/.ssh:/root/.ssh
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - homealone_network
    restart: unless-stopped
    environment:
      - TZ=Asia/Seoul
      - JENKINS_OPTS="--prefix=/jenkins"
container_name 젠킨스 컨테이너 이름 설정
image <소유자>/<이미지이름>:<태그>
젠킨스 이미지 lts(long term support)버전으로 컨테이너를 실행합니다.
user 컨테이너 내부에서 root사용자로 젠킨스를 실행
ports <호스트포트>:<컨테이너포트>
호스트포트: Docker가 실행되는 호스트 머신의 포트
컨테이너포트: 컨테이너 내부의 애플리케이션이 사용하는 포트

호스트의 8090포트를 컨테이너의 8080포트로 매핑합니다.
우리 프로젝트는 스프링앱이 8080포트를 사용하므로, 8090에 매핑합니다. 
volumes 호스트와 컨테이너의 데이터 공유 및 지속성을 유지합니다.
/var/jenkins_home: 젠킨스의 데이터 디렉토리
/root/.ssh: 젠킨스 ssh 키 디렉토리 
/var/run/docker.sock: 젠킨스의 Docker 데몬 소켓 (젠킨스 내부에서 Docker를 사용하게 하기 위함)
networks homealone_network(우리 프로젝트)라는 도커 네트워크에 젠킨스를 연결합니다.
같은 네트워크를 사용하는 다른 컨테이너들과 통신할수 있게 됩니다.
environment JENKINS_OPTS = "--prefix=/jenkins"
젠킨스 URL의 경로 접두사를 /jenkins로 설정합니다.
브라우저에서 젠킨스 접근시 http://<서버 IP>:8090/jenkins로 접속해야 함

 

 

 

아무런 설정 없이 순정으로 젠킨스의 컨테이너를 실행하고나면

http://<ELASTIC IP>:8080 으로 접속 했을 때 홈 화면으로 이동할 수 있습니다.

(기본 프로토콜은 HTTP, 포트는 8080)

젠킨스 홈 화면

 

 

 

 

 

🤍(선택사항) Nginx 설정

우리 프로젝트는 Nginx를 통해 모든 요청을 HTTPS로 리다이렉트하고 있습니다.

 

잠깐, Nginx가 뭐에요?

더보기

Nginx는 주로 리버스 프록시로드밸런서 역할을 하는 웹 서버 소프트웨어입니다.

 

1. 리버스 프록시란?

클라이언트와 서버간의 중계 역할을 수행하는 서버입니다.

클라이언트 요청을 Nginx가 받아서 백엔드에게 전달하기 때문에

백엔드 서버의 IP나 PORT는 숨겨지고 보안이 강화됩니다.

 

2. 로드밸런서란?

요청을 여러 백엔드 서버분산하여 서버 부하를 줄이고 성능을 향상함

 

우리 프로젝트는 Nginx를 통해 모든 요청을 HTTPS로 리다이렉트하고 있습니다.

 

그런데 젠킨스의 기본 요청은 HTTP이므로 추가적으로 젠킨스를 위해서

nginx의 설정파일을 바꿔 리버스 프록시를 설정해주려고 합니다.  

 

http://<ELASTIC IP>:8080 로 접속하지 않고

https://<ELASTIC IP>:8090/jenkins 로 접속할 수 있도록

1. docker-compose.yml 설정 (완료)

2. nginx의 환경설정을 통한 리버스 프록시 설정하기 

 

 

 

/home/ubuntu/libs/nginx.conf.d/default.conf

(nginx를 설치한 폴더는 프로젝트마다 다를 수 있습니다)

server {
    listen 443 ssl;
    
    .
    . (우리 프로젝트 설정)
    .
    
    #복사할 곳 시작
        location /jenkins {
        proxy_pass http://jenkins-compose:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Jenkins 요청의 프록시 리다이렉트를 보정합니다.
        proxy_redirect http://jenkins-compose:8080/ /jenkins/;
        sub_filter 'href="/' 'href="/jenkins/';
        sub_filter 'src="/' 'src="/jenkins/';
        sub_filter_once off;
    }
    #복사할 곳 끝
}
location /jenkins /jenkins 경로에 대한 요청을 처리합니다.

예: https://<ELASTIC IP>/jenkins 
proxy_pass /jenkins 에 대한 요청을 해당 proxy_pass로 전달합니다.
즉, jenkins-compose 컨테이너의 8080포트로 전달합니다.

 

 

 

 

🤍Jenkins 접속하기

이제 모든 환경설정이 끝났다!

브라우저를 켜고 URI에 https://<자신의 프로젝트 ELASTIC IP>/jenkins 을 입력해보자!

 

 

 

이런 화면이 뜰 것이다. 첫 접속시엔 비밀번호를 입력해야 젠킨스를 이용할 수 있다.

 

 

docker logs {jenkins_container_id}

 

젠킨스의 컨테이너 아이디는 docker ps 명령어를 통해 알 수있다.

터미널에 로그를 보는 명령어를 적으면 아래와 같이 비밀번호가 나올 것이다.

 

 

초록색으로 지운 곳 안에 비밀번호가 있을 것이고, 이것을 복사해서 붙여넣기 해주자.

 

 

install suggested plugins 클릭

 

 

 

admin으로 로그인하기 위해 계정을 적어준다.

 

 

이런 화면이 뜬다면 접속에 성공한 것이다!

homealone은 내가 기존에 사용하던 프로젝트이므로 신경쓰지 않아도 된다.

 

 

 

 

 

다음편부터는 젠킨스-EC2 연결과 젠킨스-Github 연동에 대해서 적어보겠다.

 

반응형