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 <주소>
추후 좀더 자세히 쓸 예정.. 예전에 만든거여서
소스자료는 아래에
'아카이브' 카테고리의 다른 글
마이크로서비스 아키텍처 - 개념정리 (3) (0) | 2021.05.29 |
---|---|
마이크로서비스 아키텍처 - 개념정리 (2) (0) | 2021.05.17 |
마이크로서비스 아키텍처 - 개념정리 (1) (0) | 2021.05.16 |
내가 보기 위한 쿠버네티스 정리글 - 5 (jenkins) (0) | 2021.05.15 |
내가 보기 위한 쿠버네티스 정리글 - 4 (volume) (0) | 2021.05.07 |