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
여기서 확인 가능합니다.