| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 유효성
- 객체 모델링
- C언어
- 유일성
- 카디널리티
- 슈퍼키
- 동적 모델링
- vue
- 튜플
- 객체지향설계원칙
- 후보키
- 기능 모델링
- NUI
- 라우트
- 소수판정
- ""
- 럼바우 모델링
- 포인터
- 백틱
- route
- CORS
- ''
- arrays.sort
- ``
- new Comparator
- 릴레이션 인스턴스
- 다이나믹 프로그래밍
- 최소성
- 타디션프로젝트
- #v-on:click
- Today
- Total
TY_Daily
Jenkins를 이용한 CI/CD 구축하기 -4 (백엔드 build & 배포 성공) 본문
- 서버가 초기화 되었다.. 그래서 Dockerfile을 이용한 배포로 바꾸었다.
- 먼저 현재의 도커는 docker out docker가 불가능한 구조로 되어있다 (해당 볼륨을 연결하지 않았기 때문) [참고]
- 도커를 멈춘후
$ docker stop 컨테이너이름
$ docker commit 컨테이너이름 원하는새repository이름:원하는새tag
sudo docker run -d -p 8080:8080 -v /home/ubuntu/jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins2 jenkins_backup:latest
- 해당 명령어를 통해 다시 실행한다 앞서와 차이라면 -v 을 /var/run/docker.sock를 통해 연결했다는 점이다.
- Dood Docker out of Docker로 진행하면서 도커 내에서도 도커 명령어를 입력하기 위해 다음과 같은 명령어 사용!
<주의!> 그래도 도커 안에 도커는 설치 안해도 도커 클라이언트은 설치해야한다 (cli!) docker ps -a 를 통해 docker exec 명령어를 통해 docker 컨테이너 속으로 접속!
[docker cli 설치 참고 url] 도커 버전을 확인후 (로컬 docker 버전) 아래 명령어 입력 (도커 컨테이너 안에서!!!! 아래 도커 명령어 입력!)
DOCKER_VERSION=27.1.1
curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_VERSION.tgz | tar zxvf - --strip 1 -C /usr/local/bin docker/docker
- whoami 명령어를 통해 전킨슨의 사용자가 jenkins인것을 확인할수 있었다!
- docker group 안에 jenkins 사용자의 권한을 부여하는것으로
-
sudo groupadd docker
sudo usermod -aG docker jenkins
newgrp docker
docker restart 젠킨슨 컨테이너
- 이렇게 해도 안됬는데 그이유는 Docker 소켓의 권한이 변경되지 않아서다!
- 해답으로는 아래 명령어를 통해 Docker 소켓의 권한을 변경하는 것이다!!!! (로컬에서 진행해도 됬었음!)
sudo chmod 666 /var/run/docker.sock
* Dockerfile 생성
- 이번 서버 초기화 후 CI/CD 구축에 Dockerfile을 통한 구축을 진행하였다!.
이제 해야할일은 Webhook 등록하기, aws 백그라운드가 아닌 도커 컨테이너를 통한 run 실행, nginx, Fronted CI/CD 구축, 무중단 배포이렇게 진행될 예정이다
pipeline{
agent any
stages{
stage('gitclone'){
steps{
git branch: 'master',
credentialsId: 'KTY2',
url: "https://lab.ssafy.com/s11-webmobile3-sub2/S11P12D101.git"
}
}
stage('aws property file download play cp execute') {
steps {
withCredentials([file(credentialsId: 'db_properties', variable: 'dbConfigFile')]) {
script {
// 파일 존재 여부 확인
def filePath = '/var/jenkins_home/workspace/D101-final/BE/o2o/src/main/resources/application-aws.properties'
def fileExists = sh(script: "test -f ${filePath} && echo true || echo false", returnStdout: true).trim()
if (fileExists == 'true') {
// 파일이 존재하면 삭제 후 복사
sh "rm ${filePath}"
}
// 파일 복사
sh "cp ${dbConfigFile} ${filePath}"
}
}
}
}
stage('Docker_Build Backend') {
steps {
dir('/var/jenkins_home/workspace/D101-final/BE/o2o/'){
sh 'ls -al'
sh 'whoami'
sh 'groups jenkins'
sh 'docker ps -a'
sh 'docker build -t tem .'
}
}
}
}
}
일단 build 를 위한 이렇게 파이프라인 작성했다!
docker build -t tme . 이 명령어는 현재 디렉토리에서 Dockerfile을 읽어서 이미지를 만들어주고 그 이미지를 tem이라는 이름의 id로 만들어서 작업해주는것이다!
(팁! docker run -p 3000:80 IMAGEID 이렇게 입력하면 url:3000 이라고 입력하면 컨테이너에 80번 포트로 들어가게 도니다!)
FROM openjdk:17-jdk-alpine
# 작업 디렉토리 설정
WORKDIR = /app
COPY . .
RUN ls -al
RUN pwd
# Gradle 빌드
RUN rm -rf .gradle
RUN chmod +x ./gradlew && ./gradlew clean build
ARG JAR_FILE=./build/libs/o2o-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]
일단 Dockerfile 을 /BE/020/Dockerfile (020 아래 gradle, src가 존재!) 이렇게 작성했는데 간단하게 보면
- 일단 openjdk:17-jdk-alpine 이 버전이 사용 ( xargs not available 이오류가 나서!!!!!)
- WORKDIR은 도커 이미지에서 어디서 작업할지 의미! (그냥 default라 생각해도 될듯..)
- COPY . . 의 의미 왼쪽에 있는 . 은 현재 있는 파일들에서 Dockerfile제외하고 모든 파일을 의미 오른쪽 .은 image내부를 의미하는것이다 즉 Dockerfile을 제외한 모든 파일을 내부 image로 복사!
- 이유는 모르겠으나 항상 .gradle을 삭제하고 gradlew clean build를 해줬을때 오류 없이 계속 진행할수 있었다!
(최종 젠킨스 파이프 라인)
pipeline{
agent any
stages{
stage('gitclone'){
steps{
git branch: 'master',
credentialsId: 'KTY2',
url: "https://lab.ssafy.com/s11-webmobile3-sub2/S11P12D101.git"
}
}
stage('aws property file download play cp execute') {
steps {
withCredentials([file(credentialsId: 'db_properties', variable: 'dbConfigFile')]) {
script {
// 파일 존재 여부 확인
def filePath = '/var/jenkins_home/workspace/D101-final/BE/o2o/src/main/resources/application-aws.properties'
def fileExists = sh(script: "test -f ${filePath} && echo true || echo false", returnStdout: true).trim()
if (fileExists == 'true') {
// 파일이 존재하면 삭제 후 복사
sh "rm ${filePath}"
}
// 파일 복사
sh "cp ${dbConfigFile} ${filePath}"
}
}
}
}
stage('Docker_Build and Deploy Backend') {
steps {
dir('/var/jenkins_home/workspace/D101-final/BE/o2o/'){
sh 'ls -al'
sh 'whoami'
sh 'groups jenkins'
sh 'docker ps -a'
// my_container가 존재하면 멈추고 삭제하기
sh '''
if [ "$(docker ps -aq -f name=my_container)" ]; then
docker stop my_container
docker rm my_container
fi
'''
// 'tem'이라는 이미지가 존재하는지 확인하고 삭제
sh '''
if [ "$(docker images -q tem 2> /dev/null)" != "" ]; then
docker rmi tem
fi
'''
sh 'docker build -t tem .'
// 위 명령어까지 진행되면
// 컨테이너가 존재하면 삭제
sh '''
if [ "$(docker ps -aq -f name=my_container)" ]; then
docker rm -f my_container
fi
'''
// 새로운 컨테이너 생성
sh 'docker run -d --name my_container -p 8000:8000 tem'
}
}
}
}
}'SSAFY프로젝트' 카테고리의 다른 글
| 젠킨슨 공통2 (0) | 2024.10.10 |
|---|---|
| 젠킨슨 백업 (0) | 2024.08.07 |
| Jenkins를 이용한 CI/CD 구축하기 -3 (0) | 2024.07.31 |
| Jenkins를 이용한 CI/CD 구축하기 -2 (0) | 2024.07.30 |
| Jenkins를 이용한 CI/CD 구축하기 -1 (0) | 2024.07.30 |