진짜 개발자
본문 바로가기

Software Engineering/CICD (jenkins, etc)

Jenkins - AmazonLinux2 에서 Jenkins 구축 및 gitlab 연동 (push 시 자동 빌드)

728x90
이번 시간에는 AWS의 EC2에 jenkins를 설치하고 Gitlab의 hook시 자동으로 테스트 후 빌드를 하도록 CICD 환경을 구축해보도록 하겠습니다

이번 시간에는 AWS의 EC2에 jenkins를 설치하고 Gitlab의 hook시 자동으로 테스트 후 빌드를 하도록 CICD 환경을 구축해보도록 하겠습니다.

 

 

1. EC2 생성

1.1 AMI와 인스턴스 유형

AMI는 AMAZON Linux 2를 사용했습니다. 중요한점은 적절한 instance 유형을 선택하는 것입니다. 당연한 얘기이지만,

 

t2.nano의 경우에는 jenkins설치는 가능하나, build시에 java의 memory부족으로 실패가 됩니다. t2.micro의 경우에는 build 및 deployment 까지는 가능하나 종종 메모리가 꽉차서 거의 운영체제가 무응답 상태가 되어버립니다.

 

 

 

1.2 Security Group(보안 그룹)

보안 그룹은 위와 같이 설정을 했습니다. 8080은 jenkins를 위한 포트이며, 22는 ssh접속을 위해서, 8181는 배포할 REST Server가 사용할 port입니다. 조금 더 자세히 설정을 하자면 보안을 위해서 우리가 주로 이 서버에 요청하게 될 서버의 IP로 제한해주는 것이 맞지만 우선은 테스트를 위해, 이곳 저곳에서 테스트를 하게 될것 같아서 위와같이 설정했습니다.

 

 

 

1.3 접속

다른 SSH 프로그램도 가능하지만 저는 Putty를 이용해 접속을 해보도록 하겠습니다. 접속을 위해서는 2단계로 나뉩니다. privatekey 생성 그리고 접속.

 

private key 생성


EC2 생성시 public IP를 자동으로 생성에 체크를 하셨다면 다음과 같이 IPv4 퍼블릭 IP를 발견하실 수 있습니다. (체크를 하지 않으셨다면, Elastic IP(탄력적 IP)를 생성하신 뒤 부여하시면 됩니다.)

 

위와 같이 EC2 생성시에 다운로드 받은 KeyPairputty, puttygen이 필요합니다. putty를 이용해 aws에 접속할 때에는 private key가 필요하기 때문인데요, (pem 키로도 접속이 가능하다면 그방법을 사용하셔도 됩니다!) 우선은 private key를 생성하기위해 puttygen을 실행합니다.

 



위의 그림 수순대로 진행하시면 private key를 얻을 수 있습니다.

 

접속


이번엔 접속을 위해 그림을 따라 앞서 생성한 private key를 설정합니다.

 

private key 설정을 한뒤 session 탭으로 돌아가 ec2-user@EC2의 IP 형식으로 host를 설정한 뒤 open을 합니다.

 

 

 

 

2. jenkins 설치 및 필요 프로그램 설치

2.1 필요 프로그램

기본적으로 jdk, git, gradle이 필요합니다. 하지만 gradle의 경우에는 spring boot를 통해 build되는 프로젝트에서 포함하고 있는 wrapper gradle을 사용할 것이기 때문에 별도로 설치하지 않겠습니다.

 

jdk


https://zetawiki.com/wiki/CentOS_JDK_%EC%84%A4%EC%B9%98

 

git


yum install -y git

 

 

2.2 jenkins 설치

ec2가 아닌 별도 서버에 설치하는 경우, https://galid1.tistory.com/463 이 링크를 참고하시면 보다 정확히 설치가 가능합니다. 하지만 EC2를 사용하기 때문에 간단히 필요한 것만을 진행하겠습니다.(방화벽 설정X)

 

yum repository setting

 

설치

 

실행 및 시작프로그램 등록

 

설치가 완료된 후 jenkins 설정을 위해 브라우저에서 jenkins IP:8080으로 접속을 합니다.

 

위와 같이 잠금을 해제하라는 화면이 나타납니다. jenkins가 설치된 서버의 위의 경로에 존재하는 파일을 보면 password가 있는데 그값을 붙혀넣으면 됩니다.

 


git lab 관련한 플러그인을 추가할 것이 있기때문에 우측버튼을 클릭합니다. 그후 위의 gitlab plugin을 체크한 뒤 install을 진행합니다.

 

 

 

3. jenkins 설정

3.1 Global settings

Global Tool Configuration


Jenkins에서 사용하게될 타 어플리케이션에 대한 설정입니다. 앞서 설치한 git, jdk, gradle 등등입니다. jenkins 관리 - Global Tool Configuration 으로 이동합니다.

 

jdk와 git을 위와같이 설정합니다. jdk의 환경변수와 git의 실행파일 위치가 다르다면 그에 맞게 설정하시면 됩니다. gradle의 경우 wrapper gradle을 사용할 것이기 때문에 별도로 설정하지 않습니다.

 

 

Configure Global Security



gitlab에서 webhook을 하기 위해서는 anonymous가 접근이 가능하도록 해야합니다. 우선 Jenkins 관리 -> Configure Global Security를 클릭합니다.


그 후 Authorization에서 Allow anonymous read access 를 체크합니다.

 

 

 

3.2 Project 생성

jenkins 프로젝트를 생성하기 위해 새로운 Item을 클릭합니다.

 

적절한 이름 입력 후 Freestyle project를 선택합니다.

 

이제부터 git lab에서 push 요청을 받았을 때(web hook) 자동으로 build를 하기위한 설정을 해야합니다.

 

소스 코드 관리


관리할 대상이 되는 Project Source code를 가져올 수 있는 Repository의 경로를 적습니다. 그러면 Access denied 라는 메시지가 나타나는데, 해당 repository에 대한 Access 권한 설정을 하지 않아 그렇습니다. Credentials에서 Add 버튼을 누른 뒤 jenkins를 클릭합니다.

 

username with password를 통해 gitlab에 접근할 수 있는 계정 정보를 입력합니다. username은 gitlab의 id password는 당연히 암호, ID에는 다른 Credential과 구분하기 위한 식별자를 입력합니다.

 

 

빌드 유발



빌드 유발에서는 Build when a change is pushed to GitLab을 체크합니다. 중요한 것은 나중에 Gitlab에서 webhook시 요청을 전달할 jenkins의 endpoint가 위 그림의 빨간 네모칸이라는 것입니다. 후에 Gitlab webhook 설정시 필요하므로 복사를 해둡니다.

 

 

Secret token 발급


jenkins에서 gitlab의 repository에 접근할 수 있는 credentials을 설정했다면, 반대로 gitlab에서도 jenkins 프로젝트에 build 요청을 위한 webhook을 보낼 수 있는 권한이 있어야합니다. 이를 위해 project의 secret token을 발급 받아야합니다.

 

우선, 빌드 유발탭의 하단의 고급...을 눌러 확장합니다.

 

확장된 탭의 하단쪽에 Generate를 클릭하면 Secret token이 발급됩니다. 이 값을 복사해 둡니다.

 

 

Build



Build에서는 말그대로 build를 위한 jenkins가 설치된 server에서 실행할 행위를 작성하는 곳입니다. 저희는 gradle wrapper를 사용할 것이기 때문에, 우선 Invoke Gradle script를 선택한 뒤 Use Gradle Wrapper을 체크 하고, gradlew를 jenkins에서 실행할 수 있도록하기 위해 권한을 자동으로 변경하는 Make gradlew executable에 체크합니다. 마지막으로 Tasks에는 실행할 gradle task를 적어주면 됩니다.


build clean

https://stackoverflow.com/questions/43482760/spring-boot-application-local-build-passes-but-fails-in-jenkins-due-to-tests

 위의 그림에서는 build를 실행하도록 했지만, 되도록이면 build clean 을 실행하는 것이 좋을것 같습니다. 위의 링크를 참고하시기 바랍니다.

 

 

 

4. Gitlab web hook 설정

이제 gitlab에서 특정 Project에 push event가 발생했을 경우 webhook을 실행하여 jenkins에 설정한 build가 실행되도록 하는 설정을 진행하겠습니다.

 

우선 설정할 Project의 Settings -> Integrations를 선택합니다.

 

URL에는 빌드 유발에서 복사 해두었던 jenkins의 endpoint를 기입하고, secret token에도 빌드 유발 에서 생성했던 값을 기입합니다.

 

설정창에서 조금 아래로 내리면 Test라는 버튼이 보입니다. 버튼을 클릭하면 테스트할 수 있는 메뉴들이 나타납니다. Push events를 클릭하여 webhook을 테스트합니다. HTTP 200이 나타나면 정상작동 한것입니다. Add webhook을 클릭하여 저장합니다.

 

 

 

5. 확인

jenkins로 돌아가보면 방금 진행했던 web hook 테스트로 인해 자동으로 빌드가 진행중입니다. 위 그림과같은 화면이 보인다면 설정에 성공한 것입니다.

 



6. 실행

우선 배포된 프로젝트는 /var/lib/jenkins/workspace/ 에 위치합니다.


실행을 위해 위의 경로로 이동하면, 배포된 jar파일이 보입니다. java -jar 'jar파일' 명령어를 이용하면 실행이 됩니다.





7. jenkins 에러


만약 배포후 스크립트에 jar 파일을  실행하는 쉘스크립트를 추가했다면 위와 같이 무한으로 대기하는 현상이 발생합니다. 서버가 실행되고 foreground로 전환이 되지 않기 때문입니다. 이 에러에대한 방안은 추후에 업로드를 하겠습니다. 우선은 배포후 실행 쉘스크립트 대신에 직접 수작업으로 실행을 시키면 jenkins 에러는 사라집니다.