이제 남은거
6. Dockerfile 작업
7. Jenkinsfile 작업
8. github webhook 작업
9. ansible-plaubook 작업
10. test
요새 술안마시면 잠안와서 한 2시간 누워있다가 그냥 일어나서 작업하려고 컴켰다
12.18 5:45 am
일단 저번에 ansible 연결까진 다 해놨고
이제 docker-compose 파일 만들고 이전 인스턴스를 빨리 삭제하자
12.18 8:54AM
docker-compose 파일로 하려고했는데 생각해보니 container 2개를 따로 저장하고 빌드해야 하기 때문에
그냥 dockerfile 을 2개로 만들어서 각 stage 에서 build + push 하는식으로 해보려고 한다
Commit message: "added jenkinsfile and dockerfiles"
[Pipeline] sh
+ pwd
/var/jenkins_home/workspace/demo
[Pipeline] sh
+ ls
Jenkinsfile
back-end
docker-compose.yaml
front-end
test
Post stage
[Pipeline] echo
Repository clone success
위는 깃 리포 연결만 해본 pipeline 결과인데
jenkins 가 돌아가는 경로가 /var/jenkins_home/workspace/demo 인 것을 알 수 있었다
12.18 10:06 am
중요한건 fail이 안나는 콘솔이였고 ㅋㅋ
각종 에러가 있었는데
1. jenkins 로 쉘스크립트를 다룰땐 cd 명령어가 안됨
2. ecr 에 넣는것처럼 docker hub 를 넣어봤는데 왠지 모르겠지만 안됨 형식이 다름
3. 오타는 항상있음
4. 마지막 deploy 단계는 그냥 ansible ping 테스트 해보려고 했는데 ansible을 찾을수 없다라고 나옴
알고보니 jenkins 에 ansible 모듈이 있네 ㅋㅋ
그리고 깨닳은게
ansible 을 jenkins 서버에다 깔아놨음 ㅋㅋㅋㅋ
jenkins container 에서 저게 실행되는데 ansible이 있을리가 없지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아 좀 쉬자...
12.21 1:01 am
jenkins 컨테이너 안에 ansible 을 설치하고 인벤토리 파일도 git repo 에 올리는걸로 하면 될것 같다.
해보자
jenkins 컨테이너 안에 ansible 을 설치하고
inventory 파일이 있는 디렉토리에서 -i 옵션을 주고 ping 테스트 해봤다
ansible 로 도커를 컨트롤하기 위해 관련 모듈도 설치해줬다
$ ansible-galaxy collection install community.docker
https://galaxy.ansible.com/community/docker
이제 deploy stage 테스트
테스트에 썻던 jenkinsfile
pipeline {
agent any
// 해당 스크립트 내에서 사용할 로컬 변수들 설정-
// 레포지토리가 없으면 생성됨
// Credential들에는 젠킨스 크레덴셜에서 설정한 ID를 사용
environment {
dockerhubRegistry = 'cyaninn/prod-web-blackpinkinyourarea'
dockerhubRegistryCredentail = 'cred-dockerhub'
githubCredential = 'cred-github'
gitEmail = 'sounddevice3@gmail.com'
gitName = 'cyaninn-entj'
}
stages {
// 깃허브 계정으로 레포지토리를 클론한다.
stage('Checkout Application Git Branch') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], \
userRemoteConfigs: [[credentialsId: githubCredential, url: 'https://github.com/cyaninn-entj/prod-web-blackpinkinyourarea.git']]])
sh "pwd"
sh "ls"
}
// steps 가 끝날 경우 실행한다.
// steps 가 실패할 경우에는 failure 를 실행하고 성공할 경우에는 success 를 실행한다.
post {
failure {
echo 'Repository clone failure'
}
success {
echo 'Repository clone success'
}
}
}
//python-crawling-server build
stage('backend - Docker Image Build') {
steps {
sh "docker build ./back-end -t ${dockerhubRegistry}:backend.${currentBuild.number}"
sh "docker build ./back-end -t ${dockerhubRegistry}:backend.latest"
}
// 성공, 실패 시 슬랙에 알람오도록 설정
post {
failure {
echo 'Docker image build failure'
//slackSend (color: '#FF0000', message: "FAILED: Docker Image Build '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'Docker image build success'
//slackSend (color: '#0AC9FF', message: "SUCCESS: Docker Image Build '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
}
//python-crawling-server push
stage('backend - Docker Image Push') {
steps {
withDockerRegistry([credentialsId: "${dockerhubRegistryCredentail}", url:""]) {
sh "docker push ${dockerhubRegistry}:backend.${currentBuild.number}"
sh "docker push ${dockerhubRegistry}:backend.latest"
// 10초 쉰 후에 다음 작업 이어나가도록 함
sleep 10
}
}
post {
failure {
echo 'Docker Image Push failure'
sh "docker rmi ${dockerhubRegistry}:backend.${currentBuild.number}"
sh "docker rmi ${dockerhubRegistry}:backend.latest"
//slackSend (color: '#FF0000', message: "FAILED: Docker Image Push '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'Docker Image Push success'
sh "docker rmi ${dockerhubRegistry}:backend.${currentBuild.number}"
sh "docker rmi ${dockerhubRegistry}:backend.latest"
//slackSend (color: '#0AC9FF', message: "SUCCESS: Docker Image Push '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
}
//php-apache-server build
stage('frontend - Docker Image Build') {
steps {
// 도커 이미지 빌드
sh "docker build ./front-end -t ${dockerhubRegistry}:frontend.${currentBuild.number}"
sh "docker build ./front-end -t ${dockerhubRegistry}:frontend.latest"
}
// 성공, 실패 시 슬랙에 알람오도록 설정
post {
failure {
echo 'Docker image build failure'
//slackSend (color: '#FF0000', message: "FAILED: Docker Image Build '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'Docker image build success'
//slackSend (color: '#0AC9FF', message: "SUCCESS: Docker Image Build '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
}
//php-apache-server push
stage('frontend - Docker Image Push') {
steps {
// 젠킨스에 등록한 계정으로 ECR 에 이미지 푸시
withDockerRegistry([credentialsId: "${dockerhubRegistryCredentail}", url:""]) {
sh "docker push ${dockerhubRegistry}:frontend.${currentBuild.number}"
sh "docker push ${dockerhubRegistry}:frontend.latest"
// 10초 쉰 후에 다음 작업 이어나가도록 함
sleep 10
}
}
post {
failure {
echo 'Docker Image Push failure'
sh "docker rmi ${dockerhubRegistry}:frontend.${currentBuild.number}"
sh "docker rmi ${dockerhubRegistry}:frontend.latest"
//slackSend (color: '#FF0000', message: "FAILED: Docker Image Push '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'Docker Image Push success'
sh "docker rmi ${dockerhubRegistry}:frontend.${currentBuild.number}"
sh "docker rmi ${dockerhubRegistry}:frontend.latest"
//slackSend (color: '#0AC9FF', message: "SUCCESS: Docker Image Push '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
}
// updated docker image 태그를 git push
stage('Deploy') {
steps {
sh "ansible prod-web-blackpink -m ping -i Inventory.ini"
} /*
post {
failure {
echo 'K8S Manifest Update failure'
slackSend (color: '#FF0000', message: "FAILED: K8S Manifest Update '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'K8s Manifest Update success'
slackSend (color: '#0AC9FF', message: "SUCCESS: K8S Manifest Update '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
} */
}
}
}
문서화는 나중에 정리할때 다시해야겠네 ㅋㅋ
이제 쉘 스크립트로 이미 실행중인 컨테이너가 있다면 삭제하고
각각 컨테이너를 run 하게 하는 ansible playbook 을 만들어보자
playbook.yaml
---
- name: start docker container
hosts: prod-web-blackpink
remote_user: root
tasks:
- name: stop and remove old version container
command: "docker ps -q --filter name=web-server | grep -q . && docker stop web-server && docker rm web-server"
command: "docker ps -q --filter name=crawling-server | grep -q . && docker stop crawling-server && docker rm crawling-server"
- name: running web-server
command: "docker run -d -it --name web-server -p 80:80 cyaninn/prod-web-blackpinkinyourarea:frontend.latest"
- name: running python-server
command: "docker run -d -it --name crawling-server cyaninn/prod-web-blackpinkinyourarea:backend.latest"
jenkinsfile - deploy stage
// updated docker image 태그를 git push
stage('Deploy') {
steps {
//sh "ansible prod-web-blackpink -m ping -i Inventory.ini"
sh "ansible-playbook playbook.yaml -i Inventory.ini"
sh "docker rm \$(docker ps -q --filter status=exited)" //빌드에 쓴 종료된 컨테이너 제거
} /*
post {
failure {
echo 'K8S Manifest Update failure'
slackSend (color: '#FF0000', message: "FAILED: K8S Manifest Update '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
success {
echo 'K8s Manifest Update success'
slackSend (color: '#0AC9FF', message: "SUCCESS: K8S Manifest Update '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
} */
}
prod 인스턴스에서 container 실행되는거도 확인
옘병하네ㅋㅋ
아 ㅈ같더ㅏ
파이프라인도 연결해줌
어쨋든 배포까지는 잘 되니까 이걸 정리해서 새로 dev pipeline 만들어서
저거 sql 안나오는거 해결하고 CI/CD 환경 구성 마무리 하자
정리해보면
1. jenkins 띄울 Dockerfile
2. Jenkinsfile
3. playbook.ini
jenkins container 에 python 설치 유무 확인 후
pip 설치
https://jjeongil.tistory.com/1274
pip install docker
https://bobcares.com/blog/ansible-no-module-named-docker-error/
community.docker.docker_container 모듈 사용법
'Archive > [Infra+Web] fanpage:BLACKPINKINYOURAREA' 카테고리의 다른 글
[Web]BLACKPINK IN YOUR AREA-27-dockerfile ㅡㅡ (0) | 2022.12.27 |
---|---|
[Web]BLACKPINK IN YOUR AREA-26-인프라 설계 및 구축 -완- (1) | 2022.12.27 |
[Web]BLACKPINK IN YOUR AREA-24-CI/CD 환경 구축 + 부분 문서화-2 (0) | 2022.12.07 |
[Web]BLACKPINK IN YOUR AREA-23-CI/CD 환경 구축 + 부분 문서화 (0) | 2022.12.01 |
[Web]BLACKPINK IN YOUR AREA-22-python+mysqlDB 연동 (1) | 2022.12.01 |