CICD V1

Shaun·2023년 10월 29일

CICD

목록 보기
1/1
post-thumbnail

배포자동화를 위한 대표적인 예로서는 TravisCi와 Jenkins가 있다. 빌드 -> 테스트 -> 배포 까지 자동화를 시켜보자

요즘은 보통 Jenkins를 많이 사용하므로 TravisCi는 간단하게 사용법만 알아보자

TravisCi

  • Travis Ci를 활용해 코드가 레퍼지토리에 push 됬을때 자동으로 테스트 빌드까지 해보자

  • 젠킨스가 TravisCi보다 좀 더 디테일한 커스터마이징이 가능하다.

Travis ci yml

  • TravisCi와 깃헙 레퍼지토리가 연결 됬다는 가정하에 진행

  • TraivsCi는 yml파일 명령어 기준으로 실행된다(.travis.yml)

  • 깃헙에 푸쉬하면 알아서 yml파일 명령어를 실행 시켜준다

service: 도커로 올린 소스 기준이라 도커환경을 만들어준다
before_install:컨테이너 띄우기전에 도커 이미지를 만들어준다
script: 컨테이너를 띄우며 테스트 실행

  • 배포까지 하려면 deploy부분 cloud 정보에 맞게 설정만 해주면 된다.
  • 마지막 iam(AWS기준) 생성시 나오는 시크릿키까지 적어준다. TravisCi에서도 설정 필요함

Jenkins

  • 도커로 젠킨스 설치
  • 젠킨스에서 컴파일,빌드,테스트 등 최소단위를 item 이라고한다
  • 빌드 실패 성공 여부와 변경점 등등 다양하게 볼수 있음

git/maven 설정

  • plugin 에서 git과 maven에 관련된것들 설치 -> tool에서 설정

  • 도커로 띄운 젠킨스서버에서 git 명령어 사용할 수 있는지 여부

maven project build

  • 코드를 가져올 깃주소 입력, private 이면 credentials에 해당하는 계정 입력

  • 깃헙에 있는 브랜치 네임 확인필수!

  • 소스코드가 있는 저장소 등록후 build 항목에서 빌드시 실행할 명령어를 적어준다. clean->compile->package (war파일로)

톰캣서버에 배포


  • 도커-젠킨스에서 빌드후 나온 war 파일톰켓서버에 배포 하는과정

PollSCM

  • 소스코드가 변경될경우 자동 빌드후 톰켓서버까지 배포함

빌드 -> ssh 배포

  • SSH server 정보 입력후 ->빌드후 조치 에서 배포 설정

  • 현재는 로컬에서 도커로 띄운 ssh 서버(docker server)로 보냄

  • publish ssh plugin 설치후 -> 시스템관리 -> ssh 정보입력

  • 포트포워딩 주의!

  • 여긴 item에서 ssh 설정부분, 소스파일위치와 디렉토리, 마지막으로 파일을 배포한후 명령어(Exec Command)까지 실행할 수 있다.

  • 도커로 띄운 ssh 서버에 배포완료

  • war 파일까지 서버에 배포 완료 했으니 나머지는 exec command 에 추가적으로 명령어를 넣어서 이미지(톰캣 +war)를 만들고 컨테이너로 만들면 된다

Ansible

  • /etc/ansible/ansible.cfg 에는 환경설정 파일
  • /etc/ansible/hosts 에 ansible에서 적용시킬 서버ip들이 들어 있음
  • ansible에서 다른 서버로 접속할때는 포트번호 필요없음
  • ansible에서 다른 서버 접속할때 매번 아이디,패스워드 입력하기 힘드니 미리 키를 만들어 접속하려는 서버에 복사해둔다. (ssh-keygen / ssh-copy-id root@123123)
  • ansible 서버에서 ssh-keygen 으로 키를 생성하고 ssh-copy-id 전달할 서버 ip 로 키를 보낸다.
  • 복사후 최초 1회 비밀번호 입력후 다시 접속할때 바로 접속이 된다.

AnsibleTest

  • ansible all -m ping
    -> all : ansible에 적용시킬 그룹, all이면 전체다 해당 (/etc/ansible/hosts)

  • ansible all -m ping 간단한 명령어로 연결유무 확인가능

  • 이렇게 성공 실패 결과를 알수 있다.

  • 이외에도 ansible 서버에서 명령어만 내려주면 host ip에 해당하는 서버들에게 같은 명령어를 내려서 한번에 실행할 수 있음

AnsiblePlaybook

  • 사용자가 원하는 내용을 미리 작성해 놓은 파일

  • host: 타켓 ip
  • tasks: 작업내용
  • blokcinfile : 실질적 작업내용
  • ansible-playbook 을 이용해 미리 yml파일을 작성하여 해당 서버들(/etc/ansible/hosts)에게 명령을 내릴 수 있다.

  • ansible-playbook fisrt-playbook.yml(yml 실행 명령어)

  • 이렇게 다양하게 yml을 작성하여 서버들에게 명령을 내릴 수 있다.

Jenkins + ansible 연동

  • 연동은 쉽다. 젠킨스-시스템에서 서버 정보 추가해주면됨

Jenkins + ansible 활용

flow

  • 젠킨스 에서 빌드해서 나온 파일을 ansible 서버로 보내고 ansible 서버에서 다른 서버들에게 동시에 배포

  • jenkins(build) -> ansible server

  • 컨테이너 생성시 중복되면 안되기 때문에 playbook 에서 미리 도커 컨테이너 삭제 커맨드도 넣어준다

  • jnekins 에서 온 파일로 docker image를 만들어줄 playbook.yml을 ansible 서버에 작성해 준다.

  • command 여러개 가능

  • 이제 젠킨스에서 이 playbook.yml을 실행할 수 있도록 하자

DockerHerb

  • 위 flow로 만든 도커이미지를 도커 허브에 올리고 해당 서버에서는 그 이미지를 지우는 작업을 추가해보자

  • 계정이름이 포함되어야함!

  • ansible 서버에 새로운 yml을 만들어준다. 이미지 빌드후 도커허브에 push 해주는 커맨드를 입력해준다.


  • 만약 서버에서 같은곳으로 동일한 작업이 이루어 지면 (--limit ip주소) 로 제한을 둘수도 있다
  • 젠킨스에 적용할때는 빌드후 조치 exec command 칸에 넣어주면 됀다. 커맨드 2개이상이면 : 로 구분 짓는다
profile
호주쉐프에서 개발자까지..

0개의 댓글