Django + jenkins + docker CI/CD 구축기 (1)

아카이브 · 2021. 5. 16. 21:08

docker를 이용해서 jenkins를 띄우고 github에서 webhook을 이용하여 다시 EC2에 django App을 배포하는 구조로 간단한 CI/CD를 구축해 보았다.

아래의 명령어로 jenkins를 실행할 수 있다.

docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 
-v /docker/jenkins:/var/jenkins_home 
-v /var/run/docker.sock:/var/run/docker.sock 
-e TZ=Asia/Seoul -u root jenkins/jenkins:latest

 

jenkins 환경설정에서 EC2에 접근할 수 있게 아래와 같이 세팅을해준다.

또한 깃허브 계정에 접근할 수 있는 세팅또한 필요하다. 아래와 같이 도커 허브에 이미지를 배포하기 위하여 계정을 등록해주고 마찬가지로 깃허브에 푸시를 했을때 바로 배포를 하기 위하여 깃허브에 대한 계정또한 등록해줘야한다.

Dashboard -> Credentials -> System -> Global credentials (Add Credentials)

 

GIthub

  • Kind : Username with Password
  • Scope : Global
  • Username: GIthub계정이름
  • Password : GIthub패스워드
  • ID : jenkins에서 변수로 사용할 ID
  • Description : 이 계정에 대한 정의

DockerHub

  • Kind : Username with Password
  • Scope : Global
  • Username: DockerHub계정이름
  • Password : DockerHub패스워드
  • ID : jenkins에서 변수로 사용할 ID
  • Description : 이 계정에 대한 정의

또한 아래 이미지와 같이 깃허브에 푸시를 했을때 이벤트를 보내기 위해서 웹훅 url을 등록해준다.

그 후 새로운 아이템을 클릭해서 파이프 라인을 생성해준다. 

여기서는 pipline script from scm으로 git내에 있는 Jenkinsfile 파이프라인을 읽어온다.

Jenkinsfile

node {
    stage('Clone repository') {
        checkout scm
    }

    stage('Build image') {
        app = docker.build("docker hub 주소")
    }

    stage('Test image') {
        app.inside {
            sh 'echo "Tests passed"'
        }
    }

    stage('Push image') {
        docker.withRegistry('https://registry.hub.docker.com', 'docker-hub') {
            app.push("dev")
        }
    }

    stage('SSH docker run') {
        script {
            sshPublisher(
                continueOnError: false, failOnError: true,
                publishers: [
                    sshPublisherDesc(
                        configName: "dev",
                        verbose: true,
                        transfers: [
                            sshTransfer(execCommand: "make port")
                        ]
                    )
                ]
            )
        }
    }
}

젠킨스 컨테이너 내부에서 도커 이미지를 푸시하기 위하여 아래 명령어를 통해 jenkins내부에 도커를 다운받는다.

docker exec -it jenkins bash
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
docker ps
exit

 

이 과정이 끝나면 깃허브에 푸시를 했을경우 웹훅이 동작하여 EC2에 접근하여 MakeFile의 아래 script를 실행하고 배포된 이미지로 컨테이너를 구동하여 최신화한다.

docker pull <주소>:dev
docker stop dev
docker run --rm --env-file ./.env.prod -p 8000:8000 -d --name dev <주소>

추후 좀더 자세히 쓸 예정.. 예전에 만든거여서

소스자료는 아래에

https://github.com/wooseok1223/private_lesson