본문 바로가기

인프라/Jenkins

Jenkins ci,cd 구현

AWS ec2를 활용하여 jenkins ci,cd를 구현 해볼 예정 입니다.

 

인스턴스 생성

ec2 ssh 접속

도커 설치 참조

2023.07.09 - [인프라/Docker] - Ubuntu 환경에 Docker,Docker-compose 설치 및 sudo 권한 없이 사용하기

 

Ubuntu 환경에 Docker,Docker-compose 설치 및 sudo 권한 없이 사용하기

사용 기술: ubuntu:22.04 1. 도커 설치 및 테스트 ubuntu@ip-172-31-34-113:~$ sudo apt-get update ubuntu@ip-172-31-34-113:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common ubuntu@ip-172-31-34-11

younyellow.tistory.com

ubuntu@ip-172-31-40-247:~$ docker -v
Docker version 24.0.5, build ced0996

jenkins를 도커로 돌리는데 도커안에서 또 도커 이미지를 빌드 해야한

docker-compose 정의

version: "3"
services:
  jenkins:
    image: jenkins/jenkins:lts
    user: root
    volumes:
      - ./jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8000:8080

docker-compose up -d 데몬으로 docker-compose 실행

ubuntu@ip-172-31-40-247:~$ sudo docker-compose up -d

컨테이너 내부 접속 후 도커 설치 및 테스트

ubuntu@ip-172-31-40-247:~$ sudo chmod 666 /var/run/docker.sock
ubuntu@ip-172-31-40-247:~$ docker container exec -it 89 /bin/bash
root@89c168ff5b65:/# curl https://get.docker.com/ > dockerinstall && chmod 777 dockerinstall && ./dockerinstall
root@89c168ff5b65:/# docker --version
Docker version 24.0.5, build ced0996

 

보안 그룹 규칙 변경

ip주소:8000으로 접속시 

최초 암호 확인을 위해 로그 찍기

ubuntu@ip-172-31-40-247:~$ sudo docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
37fa79787bdf   jenkins/jenkins:lts   "/usr/bin/tini -- /u…"   4 minutes ago   Up 4 minutes   50000/tcp, 0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   ubuntu_jenkins_1
ubuntu@ip-172-31-40-247:~$ sudo docker logs 37

이 부분이 암호

젠킨스 설정을 해줍니다

기본 설정 작성

사용자 설정에 들어가서 시간을 설정 해 줍니다.

Dockerhub에 이미지 업로드를 위한 도커허브 credentails 추가

만약 private repo면 github token도 추가해준다.

대쉬보드에서 create a job 클릭 Pipeline선

만들어두었던 DockerCredentail 설정 및 프로젝트 브랜치 설

웹훅 추가

url = http://[ip주소]:[포트]/github-webhook/

Jenkinsfile파일 작성

pipeline {
	agent any
	stages {
		stage("git clone") {
			steps {
				git branch: 'firstservice',
				url:'https://github.com/Sihyun3/LearningKubernetes.git'
			}
		}
		stage("Build") {
			steps {
                sh 'docker image build -t sihyun2/firstservice  .'
			}
		}
		stage("Docker Login") {
			steps {
				
                sh 'docker login -u $DOCKER_USER_ID -p $DOCKER_USER_PASSWORD'
			}	
		}
		stage("Docker push"){
			steps{
				withCredentials([[$class: 'UsernamePasswordMultiBinding',
								credentialsId: 'docker_credentials',
								usernameVariable: 'DOCKER_USER_ID',
								passwordVariable: 'DOCKER_USER_PASSWORD'
								]]){
					sh 'docker push sihyun2/firstservice'
				}
			}
		}
	}
}

테스트 및 도커 허브 확인

로컬에서 잘 되던 dockerfile이 권한 문제로 말썽을 일으켜 

RUN chmod +x gradlew 를 dockerfile에 추가해주었다.

 > [6/6] RUN ./gradlew build:
0.238 /bin/sh: ./gradlew: Permission denied
------
Dockerfile:6
--------------------
   4 |     WORKDIR /project
   5 |     COPY ./ .
   6 | >>> RUN ./gradlew build
   7 |     ENTRYPOINT java -jar /project/build/libs/*.jar
   8 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c ./gradlew build" did not complete successfully: exit code: 126

정상적으로 작동하는 것을 볼 수 있습니다.

 

ssh를 통한 EC2 배포

EC2생성

EC2 내부에 도커 설치

ssh agent 플러그인 설치

add 버튼을 통해 ssh credential 추가

key = .pem 내용

Username = ubuntu

ID = 선택자

publicIp 주소 credential 추가

 

Jenkinsfile 수정

pipeline {
	agent any


	stages {
		stage("git clone") {
			steps {
				git branch: 'firstservice',
				url:'https://github.com/Sihyun3/LearningKubernetes.git'
			}
		}
		stage("Build") {
			steps {
                sh 'docker image build -t sihyun2/firstservice  .'
			}
		}
		stage("Docker Login") {
			steps {
					withCredentials([[$class: 'UsernamePasswordMultiBinding',
								credentialsId: 'DockerCredential',
								usernameVariable: 'DOCKER_USER_ID',
								passwordVariable: 'DOCKER_USER_PASSWORD'
								]]){
                			sh 'docker login -u $DOCKER_USER_ID -p $DOCKER_USER_PASSWORD'
						}
			}	
		}
		stage("Docker push"){
			steps{
			
				sh 'docker push sihyun2/firstservice'
				
			}
		}
		stage("publish"){
			steps {
			withCredentials([string(credentialsId: 'publicip', variable: 'publicip')]) {
				sh 'echo $credentialsId'
					sshagent(credentials: ['EC2SSH']) {
							sh "ssh -o StrictHostKeyChecking=no ubuntu@$publicip 'sudo docker container rm -f firstservice'"
							sh "ssh -o StrictHostKeyChecking=no ubuntu@$publicip 'sudo docker rmi $(docker images -q)'"
							sh "ssh -o StrictHostKeyChecking=no ubuntu@$publicip 'sudo docker pull sihyun2/firstservice'"
							sh "ssh -o StrictHostKeyChecking=no ubuntu@$publicip 'sudo docker container run -d  --name firstservice -p 8080:8080 sihyun2/firstservice'"
					}
				}	
			}
		}
	}
}

 

테스트

 

개인적으로 서비스 위치 찾는게 구현하는데 가장 큰 어려움이었던 것 같다.

 

관련 파일은 

https://github.com/Sihyun3/LearningKubernetes/tree/main

 

GitHub - Sihyun3/LearningKubernetes

Contribute to Sihyun3/LearningKubernetes development by creating an account on GitHub.

github.com

여기서 확인 가능합니다.