2018년 12월 16일 일요일

CI 실습해보기(AWS, Jenkins)

AWS의 EC2 를 이용하여 CI를 실습해보고자 한다.
단계는
1. AWS 인스턴스 신청
2. 서버 설정
3. GIT 연동하여 빌드 / 배포
로 나누어 진행했다.

1. AWS 인스턴스 신청

AWS는 1년 프리티어를 제공하고 있다. 이를 이용해서 무료서버를 체험해볼 수 있다.
프리티어를 사용하기 위해서는 마스터카드를 등록해야함.
가입 후 EC2 인스턴스를 생성한다.


나의 경우는 우분투를 선택하였다.

키페어를 생성 후 다운받아 인스턴스에 SSH 를 통해 접속할 수 있다.

잘 보관할 것
aws가 친절하게 인스턴스에 연결하는 방법을 알려준다. 키페어위치만 잘 입력하여 접속하자

yes를 누르면 다음과 같이 접속할 수 있는 것을 볼 수 있음

윈도우는 putty를 통해 접속할 수 있음

2. 서버 설정

- 자바 설치
sudo apt-get install openjdk-8-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package openjdk-8-jdk
해당 오류 발생(해당 패키지가 없는 듯하다..)
sudo add-apt-repository ppa:webupd8team/java
를 입력하고 다시 install 하니 설치가 되었다.
ubuntu@ip-:~$ sudo apt install openjdk-8-jdk
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  adwaita-icon-theme at-spi2-core ca-certificates-java dconf-gsettings-backend
  ...
0 upgraded, 148 newly installed, 0 to remove and 112 not upgraded.
Need to get 80.2 MB of archives.
After this operation, 443 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
자바설치완료!
ubuntu@ip~$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
- 톰캣 설치
톰캣과 톰캣어드민를 설치한다.
sudo apt-get install tomcat8

sudo apt-get install tomcat8-admin
어드민페이지에 접속할 수 있게 해당 xml을 수정한다.
sudo vi /etc/tomcat8/tomcat-users.xml
다음을 추가해준다
<role rolename="manager-gui"/>    
<role rolename="manager-script"/>  
<role rolename="manager-status"/>
<user username="admin" password="비번" roles="manager-gui,manager-script,manager-status"/>
manager 페이지는 
주소:8080/manager 입력하면 위에 입력한 username과 password를 입력하면 보여진다. 
해당 페이지에서 직접 war파일을 올려 배포할 수도 있다.

- DB설치
나의 경우에는 mysql을 설치하였음
설치 후 워크벤치로 서버에 설치된 DB에 접속하려하였지만, 계속 실패하였음
grant all privileges on *.* to root@'%' identified by '루트계정 비밀번호';
해당 명령어 입력 후 정상접속됨.. root 계정 권한문제?
- 젠킨스 설치
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -

echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

sudo apt-get update

sudo apt-get install jenkins
톰캣을 8080으로 써야하므로 젠킨스는 7070으로 포트 변경
sudo vim /etc/default/jenkins
HTTP_PORT 7070으로 변경
# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=7070
주소:7070 으로 접속하려하였지만, ERR_CONNECTION_TIMED_OUT 발생 7070을 못쓰나 하고 8080으로 다시 수정 후 접속하려하였지만, 또 발생
aws 방화벽 문제인 듯 하여 인스턴스 inbound 규칙 추가해줌

인바운드 아웃바운드 규칙란?
-인바운드 : 서버 내부로 들어오는 것 (클라이언트 -> 서버)
(ex 클라이언트가 업로드)
-아웃바운드 : 서버 외부로 송출 (서버 -> 클라이언트)
(ex 클라이언트가 다운로드)

- 젠킨스 설정
이제 http://주소:7070 을 들어가면 젠킨스 설정화면이 보인다.

첫 보안인증 화면은
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
의 패스워드를 쓰면 됨

잘 모르니 suggested 고고 ㅎㅎ;;

계정 생성하면 다음과 같은 화면보임! Jenkins 띄우기 성공! 

3. GIT 연동 / 빌드 / 배포

새로운 JOB을 만들어서
다음과 같이 Freestyle project 선택

소스코드관리 Git을 선택하고 띄울 프로젝트의 github저장소 URL 를 입력한다.

BUILD 
나의 경우에는 maven 빌드이므로 다음과 같이 설정하였음
프로젝트의 pom.xml 경로를 입력해준다. 

Jenkins를 통해 빌드만 하여 war만 만들어놓고 원하는 경로에 놓을 수 있지만, 젠킨스를 통해 빌드 후 배포까지 가능하다. 
빌드 조치 (배포) 빌드 후 조치 메뉴의 Deploy war/ear to a container 를 선택하여 다음과 같이 입력하였다.
서버에 깔린 톰캣 버전과 URL를 입력 후 매니저 페이지 계정과 비밀번호를 입력해주었음. 

경로만 제대로 입력/설정되어 있다면 다음과같이 빌드와 배포가 SUCCESS 가 된다.


젠킨스는 테스트, 알림, 다양한 플러그인 등의 다양한 기능을 제공하고있음.
이를 응용하여 더 해봐야할 듯 함!!!

=======================================================
ㅜㅜ....삽질을 너무 많이함 
1. mysql 계정권한문제 삽질 
2. 빌드 후 생성되는 war에 classes 하위가 없거나 src/main/webapp 폴더 안의 것들이 없었음
이것때문에 게속 삽질함... 그리고 젠킨스 빌드 시 서버가 급속도로 느려지면서 아무것도 못하는 경우 발생 인스턴스 재시작하면서 퍼블릭IP가 바뀌어서 매우 귀찮아졌었음.... ㅠ퓨

--> 느려지는 원인!!!
프리티어는 1기가 메모리를 제공하고있음.
근데 이 서버에 DB, tomcat, jenkins 까지 올려놓고 쓰니 당근 서버가 뻗을 수 밖에...

classes에 없는건 pom.xml 위치인 듯하고
(pom이 이상한 곳에 생성되었었는데 그걸로 빌드하니 class들이 모두 생성이 되지 않았음) 
webapp 없는건 경로문제인듯함 그래서 pom.xml에 warSourceDirectory  src/main/webapp 로 경로를 설정해주니 생김!
이 링크 참조하여 해결
이클립스에서도 war로 export하면 동일한 war가 생성되어 내 문제임을 알았다.
링크보고 이클립스 프로젝트 Properties - Deployment Assembly 에서
Source  와 Deploy Path 를 보고 
webapp가 이상한 것으로 잡혀있어서 배포 시 생성이 안된거였음...!
/src/main/webapp 가 없어서 추가하고 다시 export 하니 war가 제대로 생성되었음.

근데 이건 이클립스 프로젝트 설정 바꾸는건데 젠킨스는 git에서  땡겨서 빌드하는데 이 속성을 가져올 수 있을까?
 pom.xml

<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>
</configuration>
</plugin>


warSourceDirectory 에 원래 webapp만 있었는데 src/main 을 추가 후 git에 올리고 
다시 젠킨스로 빌드 후 배포하니 정상적으로 배포까지 완료됨... 
...와르소스디렉토리인데 왜 될까 ..? 

오! 여기 딱 나와있음...

WAR에 포함될 추가적인 파일들을 위한 디렉토리이다. 
이것은 너의 JSP파일들을 놓은 위치이다. 

메이븐 공부할 때 한번 읽어 볼 필요가 있을듯... 

https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html

Required Parameters

NameTypeSinceDescription
<cacheFile>File2.1-alpha-1The file containing the webapp structure cache.
Default value is${project.build.directory}/war/work/webapp-cache.xml.
<outputDirectory>String-The directory for the generated WAR.
Default value is${project.build.directory}.
<warSourceDirectory>File-Single directory for extra files to include in the WAR. This is where you place your JSP files.
Default value is${basedir}/src/main/webapp.
<webappDirectory>File-The directory where the webapp is built.
Default value is${project.build.directory}/${project.build.finalName}.
<workDirectory>File-Directory to unpack dependent WARs into if needed.
Default value is${project.build.directory}/war/work.

todo 
1. git  push 인식하여 빌드하도록 설정하기 
2. 메이븐 공부하기 
(한번 읽어볼 것 
https://wikidocs.net/book/1910
)

댓글 없음:

댓글 쓰기