공부하기싫어
article thumbnail

이제 남은거

 

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 에 올리는걸로 하면 될것 같다.

해보자

 

ping test

jenkins 컨테이너 안에 ansible 을 설치하고

inventory 파일이 있는 디렉토리에서 -i 옵션을 주고 ping 테스트 해봤다

 

ansible 로 도커를 컨트롤하기 위해 관련 모듈도 설치해줬다

 

$ ansible-galaxy collection install community.docker

 

https://galaxy.ansible.com/community/docker

 

Ansible Galaxy

 

galaxy.ansible.com

 

이제 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})")
          }
      } */
    }

 

 

빌드는 성공

 

docker ps

prod 인스턴스에서 container 실행되는거도 확인

php 문제 ㅋㅋ

옘병하네ㅋㅋ

 

아 ㅈ같더ㅏ

 

파이프라인도 연결해줌

 

 

 

 

 

어쨋든 배포까지는 잘 되니까 이걸 정리해서 새로 dev pipeline 만들어서

저거 sql 안나오는거 해결하고 CI/CD 환경 구성 마무리 하자

 

정리해보면

 

1. jenkins 띄울 Dockerfile

2. Jenkinsfile

3. playbook.ini

 

jenkins container 에 python 설치 유무 확인 후

pip 설치

https://jjeongil.tistory.com/1274

 

Ubuntu 18.04 : pip 설치하는 방법, 예제, 명령어

Pip은 Python Package Index(Python Package Index)와 같이 Python에서 작성된 소프트웨어 패키지의 설치 및 관리를 단순화하는 패키지 관리 시스템입니다. Ubuntu 18.04에는 Pip이 기본적으로 설치되어 있지 않지

jjeongil.tistory.com

pip install docker

https://bobcares.com/blog/ansible-no-module-named-docker-error/

 

Ansible No module named 'docker’ error - Bobcares

Ansible No module named 'docker’ error: To fix this error, the Docker SDK library for python must be installed on the target machine.

bobcares.com

community.docker.docker_container 모듈 사용법

https://docs.ansible.com/ansible/latest/collections/community/docker/docker_container_module.html#examples

 

community.docker.docker_container module – manage Docker containers — Ansible Documentation

© Copyright Ansible project contributors. Last updated on Dec 14, 2022.

docs.ansible.com