DevOps 실현을 위한 CI/CD 구축 (22.06.03)

박민선·2022년 6월 6일
0

CICD

Code --> Kubernetes

  • Git/GitHub
  • Jenkins
  • Ansible
  • Docker Image
  • Code(Java) - Tomcat

Jenkins 설치

sudo apt install openjdk-11-jdk
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
    /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian-stable binary/" | sudo tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install fontconfig jenkins
systemctl status jenkins
http://X.X.X.X:8080
sudo cat /var/lib/jenkins/secerts/initialAdminPassword


접속 확인을 할 수 있다.

수업 예제(test)

1) 새로운 item -> Freestyle Project -> build

2) apply -> 저장 후 build now 로 결과(콘솔창) 확인

Maven

Maven: Java 프로젝트 빌드 도구
빌드:
1. validate: 필요한 정보가 있는지 확인
2. compile: 소스코드 컴파일
3. test: 컴파일된 코드단위 테스트
4. package: JAR/WAR 파일로 생성
5. verify: 통합 테스트
6. install: 로컬 저장소에 배포(~/.m2/repository)
7. deploy: 원격 저장소에 배포

소스코드

git clone https://github.com/Sunny-1030/source-java-maven-hello-world  

#강사님 github에서 fork
sudo apt install maven 
mvn clean package  #war파일로 만들어 줌

시스템 환경구성
~/.zshrc 또는 ~/.bashrc

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
M2_HOME=/usr/share/maven
M2=$M2_HOME/bin

PATH=$PATH:$JAVA_HOME:$M2:$M2_HOME

source ~/.zshrc

또는

source ~/.bashrc

플러그인 설치

  • jenkins관리 -> 플러그인 관리
  • 설치가능에서 maven 검색
  • maven invoker & integration 선택 후
  • install without restart

    새로운 item 에서 maven project 구성 확인 가능

Global Tool 설정

jenkins관리에 global tool 선택

1) JDK 설정
name JAVA_HOME
위치 /usr/lib/jvm/java-11-openjdk-amd64/

2) Maven설정
name M2_HOME
위치 /usr/share/maven

maven test

1) 소스코드 git 선택
https://github.com/Sunny-1030/source-java-maven-hello-world

2) branch 정의
*/main

3) build Goals 설정
clean package

Credentials 구성 가능

mange credentials jenkins-global 선택
add credential 할 수 있음

Tomcat

sudo apt install tomcat9 tomcat9-admin
systemctl status tomcat9


브라우저로 접속 IP: 192.168.59.12:8080

docBase

/var/lib/tomcat9/webapp/ROOT

Tomcat Admin Management

관리자 페이지에 접속하기
ID 와 password를 설정해주어야 접속이 가능

http://192.168.59.11:8080/manager/html

Admin Mgmt 계정/패스워드

/etc/tomcat9/tomcat-user.xml

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
        <role rolename="manager-gui"/>
        <role rolename="manager-script"/>
        <role rolename="manager-jmx"/>
        <role rolename="manager-status"/>
        <user username="admin" password="P@ssw0rd" roles="manager-gui, manager-script, manager-jmx, manager-status"/>
</tomcat-users>


admin설정 후 tomcat9 재시작

sudo systemctl restart tomcat9


설정한 id와 pw로 관리자 페이지 접속가능

Ansible with Docker

Ansible로 docker_* 모듈로 Docker 호스트 관리

sudo apt install python3-pip
sudo pip3 install docker

docker 엔진 설치
참고링크: https://docs.docker.com/engine/install/ubuntu/
유저 권한까지 부여해 준다.

id -a 
docker ps

# 권한 확인 , 적용안될 시 재접속

webapp.war file을 docker host로 이동

cd webapp.war /tmp
scp /tmp/webapp.war 192.168.59.12:/tmp

Docker(vm) 에서 Deploy하기

cp /tmp/webapp.war .

vi Dockerfile   #도커파일생성 아래사진 참고

docker build -t myapp .
docker run -d -p 8080:8080 myapp

webapp 접속 확인

curl localhost:808/webapp/  # port가 겹쳐서 808로 설정

jenkins 자동화를 위해 현재 docker conatainer/images 삭제 (정리)

docker ps
docker rm -f xx

docker images
docker rmi xx

jenkins와 tomcat port 겹쳤을 경우
jenkins port 변경
sudo vi /etc/default/jenkins
sudo vi /etc/init.d/jenkins
의 port를 모두 변경해야함
sudo /etc/init.d/jenkins restart

jenkins를 통한 docker 자동화

jenkins 관리 -> 플러그인 매니저
설치가능 -> artifact 검색
Publish Over SSH 설치

새로운 Item 구성 (maven project)
(이전과 같은 포멧으로 설정)
빌드 후 조치
send build artifacts over SSH
서버 설정을 위해 잠시 저장

jenkins관리 -> 시스템설정
(맨 아래) Publish over SSH
SSH Servers 추가

  • name
    docker-host
  • hostname
    192.168.59.12
  • username
    vagrant
  • Remote Directory
    설정 안하면 default값

고급 누르면 추가적인 기능생성
간단하게 password만 작성

Test Configuration으로 확인

다시 구성으로 이동
서버설정에 서버가 생성된 것을 확인 할 수 있음

transfers
-source files
webapp/target/webapp.war

-remote directory
myweb
(비워두면 홈디렉토리)

apply -> 저장

Build Now

docker(vm)에서 확인
webapp 이 들어온 것을 확인할 수 있음
단, webapp/target/webapp.war를 통으로 가져오기에
사용상 문제는 없으나 경로를 쓰기 귀찮을 수 있음

이때, 쓰는 것 Remove prefix에 제거할 경로를
입력하면 복사할 시 지정된 경로는 제거된다.

깔끔히 webapp/target은 사라지고 바로 webapp.war를 볼 수 있다.

(실습)

cd source-java-maven-hello-world
vi Dockerfile

From tomcat:9.0-jre11-openjdk

COPY webapp.war /usr/local/tomcat/webapps
git add .

git commit -m 'add dockerfile'

git push

name: Sunny-1030
password: 발급받은 token 입력

github 에서 dockerfile 확인

다시 Deploy-to-docker 구성
add transfer set 클릭

  • source file
    Dockerfile

  • remove

  • remote directory
    myweb
    apply -> 저장 -> Build Now

    jenkins(vm)에서 docker(vm)으로 이동을 확인할 수 있다.

실패 시 debuging 할때
콘솔창에서 상세정보를 보기위해
구성 -> ssh server -> 고급
verbose output 선택(자세히 볼수 있음)

exec command

cd /home/vagrant/myweb
docker build -t myweb .
docker run -d -p 8080:8080 myweb

apply -> 저장

docker build & deploy 확인

docker image

docker ps

curl localhost:8080/webapp/

빌드유발 시
poll SCM 을 걸면 오류가 발생
H * * * (= * * * * ) 매분
앞뒤로 약간의 편차를 줌
H Hash

:
:
:

jenkins + ansible 멱등성을 위해

vm은 jenkins 1대 ansible1대 docker1대 준비
ansible vm 에는 ansible과 docker가 같이 있어야함

sudo apt update
sudo apt install ansible

docker 설치 링크: https://docs.docker.com/engine/install/ubuntu/

ansible 에서 docker vm ssh 연결

ssh-keygen
ssh-copy-id vagrant@192.168.59.12
ssh-copy-id vagrant@192.168.59.13

#인벤토리 설정
vi .ansible.cfg
[defaults]
inventory = hosts.ini

#호스트 설정
vi hosts.ini
[ansible_host]
192.168.58.13
[docker_host]
192.168.59.12
ansible all -m ping   #연결확인

jenkins관리 -> 시스템 설정 -> (맨 아래) publish [추가]

  • name
    ansible-host
  • host name
    192.168.59.13
  • username
    vagrant

[고급] -> use password (check)

  • password
    vagrant

testconfiguration 클릭하여 success 확인

apply ->저장

1. command로 배포하기

jenkins 새로운 Item -> maven project
기존과 동일하게 설정
git ->레포지토리 주소
branch -> */main
golas -> clean package

빌드 후 조치
[send build artifacts over SSH]

(server - name)
ansible-host

(source file)
webapp/target/webapp.war

(remove prefix)
webapp/target

(remote directory)
java-hello-world

추가

(source file)
Dockerfile

(remote directory)
java-hello-world

추가

(source file)
docker_build_and_push.yaml

(remove prefix)
playbook

(remote directory)
java-hello-world

(exec command)
ansible-playbook java-hello-world/docker_build_and_push.yaml

apply -> 저장

2. jenkins vm 에서

mkdir playbook
cd playbook

vi docker_build_and_push.yaml

- name: Docker Image Build
  hosts: ansible_host
  gather_facts: false
  
  tasks:
    - command: docker image build -t java-hello-world java-hello-world/
    - command: docker container rm -f java-hello-world
      ignore_errors: yes
    - command: docker container run --name java-hello-world -d -p 8080:8080 java-hello-world

git add .
git commit -m 'create docker'
git push origin main


name -> Sunny-1030
password -> 토큰

git push가 안될 경우
[에러 문구]

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/Sunny-1030/source-java-maven-hello-world'

git pull origin main --allow-unrelated-histories

ansible(vm) 확인

docker ps
docker images

#tip
토큰을 변수처리
Default Value에 토큰 값 넣기 (docker 토큰을 넣어야함!)

docker repogitory create 생성하기
-> git push

확인 후 docker container 삭제하기

docker rm -f `docker ps -a -q`
docker ps

Ansible with Kubernetes

tip
vi편집기 붙여넣기 오류
:set paste 엔터 로 일시적 해결

참고링크: [재민님 블로그]
https://velog.io/@repush/CICD-%EA%B7%B8%EB%8C%80%EB%A1%9C-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0-5%ED%8E%B8

Ansible로 k8s_* 모듈을 사용하여 Kubernetes 호스트 관리

사전 구성:

  • kubectl 명령
  • kubeconfig 파일
sudo apt install python3-pip
sudo pip3 install openshift==0.11

시점에 따라 사용하는 버전이 다를 수 있음

profile
클라우드신생아

0개의 댓글