Skip to content

[승규] jenkins 구성

BaeJ1H021 edited this page Dec 11, 2023 · 1 revision

첫번째 시도 및 해결과정

  1. jenkins/jenkins:lts를 docker로 구동
  2. ssh to publish, nodejs plugin 설치
  3. freestyle vs pipeline freestyle은 정해져 있는게 많고 pipeline이 자유롭고 어렵다고 해서 pipeline을 선택. 스크립트 직접 작성하기로 결정. freestyle은 작성할 스크립트가 별로 없음.
  4. FE 빌드 후 host 머신의 도커볼륨(nginx 컨테이너와 연결되어 있음)에 전달하고 nginx 컨테이너 재시작

→ 문제 발생: ssh 인증 필요 → sshpass 로 해결(jenkins 컨테이너에 sshpass 설치)

  1. BE 빌드

→ 문제 발생: 도커 빌드를 해야되는데 이 과정에서 docker가 깔려있어야했음. 그런데 jenkins 컨테이너 안에 도커 있을리 무방(도커 안에 도커)

docker를 컨테이너 내부에 설치해보려 했지만 오류가 나며 실패. docker에서도 비추천하는 방식

호스트 머신의 docker.sock을 볼륨으로 jenkins 컨테이너에 연결

docker run --name jenkins-docker -p 7979:8080 -p 50000:50000 -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -u root jenkins/jenkins:lts

이 명령어를 썼는데 -u root 이 옵션을 사용하자 잘되던 ssh 연결이 안되는 문제 발생. 원래는 docker gateway인 127.17.0.1 주소로 host에 접속했는데 user를 root로 만들면서 iptable이 바뀐게 아닌가 추측하고 있다.

그래서 최종적으론

docker run --name jenkins -p 8080:8080 -p 50000:50000 -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts

를 사용했다.

이렇게 하면 jenkins 컨테이너 접속할 때 기본적으로 유저 jenkins로 접속하게 되는데 이는 docker exec -u root 옵션으로 해결할 수 있었다. 이게 필요한 이유는 docker 설치할 때 root 권한이 필요하기 때문이다.

도커 빌드 시에 .env 파일이 필요한데 이는 github 레포지토리에 올라가 있지 않다. 그래서 credential 기능을 활용했다.

문제 상황

pipeline {
    agent any

    stages {
        stage('Frontend Build') {
            steps {
                script {
                    // Clone the repository
                    checkout([$class: 'GitSCM', branches: [[name: 'main']], userRemoteConfigs: [[url: 'https://github.com/boostcampwm2023/web04-ALGOCEAN.git']]])

                    // Move to the /FE directory and run npm build
                    dir('FE') {
                        nodejs('NodeJS 20.4.0') {
                            sh 'npm install'
                            sh 'npm run build'
                        }
                    }

                    // Copy the build artifacts to the specified directory on 172.17.0.1
                    sh 'sshpass -p pw123! scp -r FE/dist/* [email protected]:/var/lib/docker/volumes/react/_data/'

                    // Restart Nginx container
                    sh 'docker restart nginx'
                }
            }
        }

        stage('Backend Build and Push') {
            steps {
                script {
                    // Move to the /BE directory
                    dir('BE') {
                        writeFile file: '.env', text: envContent.trim()
                        // Build Docker image and push to Docker Hub
                        
                        withCredentials([usernamePassword(credentialsId: 'docker_credentials', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                            sh "docker login -u ${DOCKER_HUB_USERNAME} -p ${DOCKER_HUB_PASSWORD}"
                        }
                        sh 'docker build -t ssggyu/algocean:latest .'
                        sh 'docker push ssggyu/algocean:latest'
                    }
                }
            }
        }

        stage('Deploy Backend') {
            steps {
                script {
                    // SSH into the server
                    sh 'docker rm -f nest-api'
                    
                    // Run the new backend container
                    sh 'docker run -d --name nest-api -p 3000:3000 ssggyu/algocean:latest'
                }
            }
        }
    }
}

레퍼런스

docker build에 큰 도움 받았음.

Jenkins 로 도커 이미지 Build & Push 자동화하기

nodejs 플러그인 세팅(yarn, nodejs 세팅)

Jenkins Pipeline 구축하기 - 프론트엔드편

지금은 한 서버 안에 db, api서버, 웹서버가 같이 있다. 추후 분리할 걸 고려하면 pipeline script도 변경해야되서 jenkins 2차전이 기대된다. 1차전은 문제해셜에 시간이 너무 오래걸려서 내 판정패로 하겠다.

🌊 ALGOCEAN

TEAM : 강서(대문)구

기획

아키텍처

스프린트 계획회의

데일리스크럼

팀 회고

개발 일지

태호

more

지호

more

지은

more

승규

more

멘토링 일지

Clone this wiki locally