티스토리 뷰

반응형

Spring Boot Sample App을 Gitlab에 등록

먼저 간단한 Spring Boot 프로그램을 만들기위해 프로젝트를 생성하고 gitlab과 연동시켜 줍니다.

Spring Boot Sample App은 루트 url로 접속하면 Hello World!를 반환하는 간단한 샘플 프로그램입니다.

샘플 앱 다운로드 https://github.com/johnjhkoo/spring-boot-sample-app

#샘플 앱 다운로드
cd /opt/gopath/src/gitlab/
git clone https://github.com/johnjhkoo/spring-boot-sample-app.git

먼저 Gitlab에 Project를 생성합니다.

프로젝트 이름은 jenkins-docker-sample-app으로 설정합니다.


그리고 아까 다운 받았던 spring-boot-sample-app 프로젝트 폴더에서 git init으로 git repo를 생성하고 git remote add origin 명령어를 통해 remote서버를 등록합니다.

#gitlab 등록 cd spring-boot-sample-app/ git init git remote add origin http://<자신의 IP 주소>/root/jenkins-docker-sample-app.git git add . git commit -m "Initial commit" git push -u origin master

root 계정으로 소스를 push합니다.


Gitlab 프로젝트에 jenkins 유저 추가

이제 jenkins가 이 프로젝트를 pull할 수 있도록 세팅해 보겠습니다.

프로젝트 화면에서 Settings로 들어가 Member 탭으로 이동합니다.

최상단의 입력창에 jenkins를 입력하고 밑의 auth는 Reporter로 설정해 준다음

Add to project를 누릅니다.


Jenkins 설정

Jenkins Gitlab Plug-in 설치

Jenkins에 gitlab연동 전에 gitlab연동에 필요한 plug-ins을 설치하겠습니다.

jenkins 콘솔 좌측 메뉴의 Manage Jenkins를 클릭합니다.


그 다음 Manage Plugins를 선택합니다.


이후 화면에서 Available 탭을 선택한뒤에 우측에 보이는 검색창에 gitlab을 입력해 줍니다.

입력과 동시에 하단의 플러그인 목록들이 필터링되는 걸 보실 수 있는데 입력완료 후 Gitlab Plugin을 선택하고

하단의 Install without restart버튼을 누르시면 설치가 진행되는 걸 보실 수 있습니다.

동일한 방법으로 embeddable-build-status (빌드 상태를 아이콘으로 표시해주는 플러그인)을 같이 설치하겠습니다.


다음 화면에서 아래와 같은 화면을 보시면 설치가 완료된 것입니다.


Gradle 등록

Spring Boot Sample 은 Gradle을 사용하고 있기 때문에 gradle build 를 위해서 jenkins에 gradle을 등록해 줘야 합니다.

먼저 Manage Jenkins로 들어가 Global Tool Configuration을 클릭합니다.


그리고 중간쯤에 보이는 Gradle 항목에서 Add Gradle을 클릭해 줍니다.

name에 gradle을 입력하고 save를 눌러줍니다.


Jenkins item 등록

이제 Jenkins에 아이템을 생성해서 Gitlab을 연결해 보겠습니다.

우선 왼쪽 메뉴의 New Item을 클릭합니다.


그리고 다음 페이지에서 생성할 Jenkins Item의 이름을 입력합니다. 이름은 jenkins-docker-sample-app로 지정합니다.

그 다음 아래의 목록에서 Freestyle project를 선택한 후 ok를 누릅니다.


다음 페이지에서는 Item에 대한 Setting을 하는 페이지입니다.

여기에서 gitlab의 주소를 연결해 주고 빌드 후 실행할 shell 커멘드를 지정해 줍니다.

먼저 Source Code Management 섹션에서 Git 박스를 체크합니다. 그럼 아래와 같이 옵션이 생기게 되는데

Repository URL에 Gitlab 프로젝트 주소를 입력해 줍니다. (SSH 주소로 입력)

입력을 하고 잠시 후에 에러메세지가 뜨는 걸 볼 수 있는데 이는 아직 jenkins유저가 git 접근시 사용해야 할 권한 설정을 아직 해주지 않았기 때문입니다.

바로 아래의 Credentials에서 열쇠모양의 Add 버튼을 누르면 jenkins 유저 아이디가 나옵니다. 그걸 클릭해 줍니다.


여기에서 jenkins유저의 credential을 등록해 줍니다.

아까 생성한 ssh키를 등록하겠습니다.

먼저 Kind에서 SSH Username with private key를 선택합니다.

그러면 하단의 입력창들이 바뀌는데 여기에서 Private Key 부분에서 From the Jenkins master ~/.ssh 를 선택해 줍니다.

아까 ssh 생성 시 설정한 Passphrase가 있다면 하단의 Passphrase부분에 입력합니다.

입력이 끝나면 Add를 눌러 등록합니다.


그리고 아까 전 페이지의 Credentials에 none이라고 된 부분을 클릭하면 jenkins 가 새로 등록된 것을 볼 수 있습니다.

jenkins를 선택하면 에러메시지가 사라지고 git 주소와 연동이 성공한 걸 볼 수 있습니다.

다음은 Build Triggers 세팅입니다.

아까 gitlab plugin을 설치하셨다면 아래에 다음과 같은 선택지를 보실 수 있습니다.


설정된 Gitlab주소로 변경된 소스가 push되면 빌드를 시작하라고 설정해주는 항목입니다.

선택을 해줍니다.

지금 프로젝트가 Gradle 기반이기 때문에 Gradle 빌드를 먼저 지정해 주어야 합니다.

Build 항목의 Add Build Step 드롭다운을 누르고 Invoke Gradle script를 지정해 줍니다.


그리고 나타나는 입력창에서

Gradle Version 부분 셀렉트박스를 클릭하면 아까 등록한 gradle 항목이 보입니다. 그걸 선택합니다.

그리고 하단의 tasks 입력창 우측의 화살표를 클릭하면 확대되면서 여러줄을 기입할 수 있습니다. clean과 build를 한줄씩 입력합니다.

마지막으로 Build File 항목에 build.gradle 파일을 지정합니다.


이제 jenkins 가 소스를 가지고 빌드 시 docker 이미지를 생성해 주는 shell 커멘드를 지정하도록 하겠습니다.

아래 Add Build Step 드롭다운을 누르고 Execute shell을 선택해 줍니다.


그럼 shell 커멘드를 입력할 수 있는 창이 나오는 데 여기에 docker 이미지 build 명령어를 입력합니다.

docker build -t jenkins-docker-sample-app/test .

**여기서 주의할 점은 root 경로에 반드시 Dockerfile을 만들어 줘야 한다는 것입니다. 만약 본인의 app으로 테스트 하실 경우 Dockerfile을 반드시 생성해 주셔야 합니다.

그럼 이제 등록된 이미지를 실행하는 shell command를 등록하겠습니다.

아래 Add Build Step을 다시 한번 더 클릭하면 동일한 입력창이 나옵니다.

여기에 하단의 docker 명령어를 입력합니다.

docker ps -q --filter "name=jenkins-docker" | grep -q . && docker stop jenkins-docker && docker rm jenkins-docker || true

이 명령에 대해 설명드리면 먼저 docker의 현재 구동중인 컨테이너를 보는 ps 명령어의 filter 옵션을 써서 jenkins-docker라는 이름을 가진

컨테이너가 존재하는 지 찾습니다. 만약 jenkins-docker컨테이너가 구동중이라면 구동중지 및 삭제를 합니다.

존재하지 않으면 true를 리턴해 다음 명령어로 넘어갑니다.

이 명령구문을 추가한 이유는 이후 업데이트 시에 이미 구동중이던 컨테이너를 중단하고 다시 새로 빌드한 소스로 컨테이너를 구동하기 위함입니다.

만약 그냥 docker run 을 시작한다면 이미 구동중이던 컨테이너의 이름과 포트가 충돌이 난다고 에러가 발생하게 되어 제대로 작동하지 않습니다.

이제 전처리가 끝났다면 다시 shell script를 하나 더 추가해 아래의 명령어를 입력합니다.

docker run -p 20000:8080 -d --name=jenkins-docker jenkins-docker-sample-app/test

포트를 20000으로 잡고 name을 jenkins-docker로 구동해 줍니다.

그리고 마지막으로 이전에 사용했던 container를 도커에서 확실하게 지우기 위한 shell command를 입력하겠습니다.

docker rmi -f $(docker images -f "dangling=true" -q) || true

이 명령어는 불필요하게 docker에 남아있는 (dangling한) 컨테이너들을 삭제합니다.

이렇게 완성된 Build 섹션은 아래와 같습니다.


아래의 Save를 눌러 설정을 저장합니다.

Jenkins 설정은 모두 끝났습니다. 이제 확인을 위해 Build Now 버튼을 눌러 build와 배포가 잘 되는지 확인해 보겠습니다.

왼쪽 메뉴의 Build Now를 눌러주면 하단에 상태바가 뜨면서 #1빌드 첫번째 빌드가 시작됩니다.


왼쪽의 동그라미가 파란색으로 변하면 성공 빨간색이 되면 실패입니다.


첫번째 빌드와 배포가 문제없이 성공했습니다. 이제 20000포트로 접속해보면 Hello World!가 찍히는 걸 볼 수 있습니다!


Webhook 설정



그리고 중간쯤 Build Trigger 섹션에서

GitLab CI Service URL이라도 되어 있는 항목의 주소를 복사하고 Advanced 버튼을 누른다음 하단의 Secret token 입력창 밑에 Generate버튼을 눌러

token을 생성합니다.

#1번과 #3번부분을 복사해 놓습니다.


  • #1 : http://<자신의 IP 주소>:8080/project/jenkins-docker-sample-app
  • #2 : 0b2bdbe02f2071fd823af26d2ccde10c1

이제 Gitlab의 프로젝트 콘솔로 이동해 보겠습니다.

상단의 Setting을 클릭 후 밑의 메뉴에서 Integration으로 들어갑니다.


URL과 Secret Token 입력창에 아까 복사해뒀던 주소와 token을 붙여넣기 합니다.

그리고 하단에 SSL Verification 항목에서 만약 jenkins가 https를 사용한다면 체크를 하고 아니면 체크를 풀어줍니다.

모든 설정이 끝나면 Add webhook 버튼을 눌러 등록합니다.

이제 바로 밑에 Webhook이 생긴걸 볼 수 있습니다.


테스트를 해보기 위해서 오른쪽에 Test 버튼을 눌러보겠습니다.

화면이 리로딩 되면서 파란색의 Hook executed successfully: HTTP 200 결과가 나오면 성공입니다.



------------------------------------------------------------------------------------------에러 수정---------------------------------------------------------------------------------------------------------------

if (!window.T) { window.T = {} } window.T.config = {"TOP_SSL_URL":"https://www.tistory.com","PREVIEW":false,"ROLE":"guest","PREV_PAGE":"","NEXT_PAGE":"","BLOG":{"id":2859455,"name":"miiingo","title":"miiingo riiingo","isDormancy":false,"nickName":"miiingo","status":"open","profileStatus":"normal"},"NEED_COMMENT_LOGIN":false,"COMMENT_LOGIN_CONFIRM_MESSAGE":"","LOGIN_URL":"https://www.tistory.com/auth/login/?redirectUrl=https://miiingo.tistory.com/171","DEFAULT_URL":"https://miiingo.tistory.com","USER":{"name":null,"homepage":null,"id":0,"profileImage":null},"SUBSCRIPTION":{"status":"none","isConnected":false,"isPending":false,"isWait":false,"isProcessing":false,"isNone":true},"IS_LOGIN":false,"HAS_BLOG":false,"IS_SUPPORT":false,"TOP_URL":"http://www.tistory.com","JOIN_URL":"https://www.tistory.com/member/join","ROLE_GROUP":"visitor"}; window.T.entryInfo = {"entryId":171,"isAuthor":false,"categoryId":670534,"categoryLabel":"개발도구/DevOps"}; window.appInfo = {"domain":"tistory.com","topUrl":"https://www.tistory.com","loginUrl":"https://www.tistory.com/auth/login","logoutUrl":"https://www.tistory.com/auth/logout"}; window.initData = {}; window.TistoryBlog = { basePath: "", url: "https://miiingo.tistory.com", tistoryUrl: "https://miiingo.tistory.com", manageUrl: "https://miiingo.tistory.com/manage", token: "c7Hce2aADgmiTeHpHz28Wh10V7BUOBoyzfkWY9mQn4ffTdLHeeSsHD1tI8yOuQpQ" }; var servicePath = ""; var blogURL = ""; The page you're looking for could not be found (404) \"GitLab

404

The page could not be found or you don't have permission to view it.


The resource that you are attempting to access does not exist or you don't have the necessary permissions to view it.

Make sure the address is correct and that the page hasn't moved.

Please contact your GitLab administrator if you think this is a mistake.

Go back
\n"}}" data-ve-attributes="{"typeof":"mw:Extension/syntaxhighlight","about":"#mwt3"}">
Hook executed successfully but returned HTTP 404 <!DOCTYPE html> <html> <head> <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport"> <title>The page you're looking for could not be found (404)</title> <style> body { color: #666; text-align: center; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; margin: auto; font-size: 14px; } h1 { font-size: 56px; line-height: 100px; font-weight: 400; color: #456; } h2 { font-size: 24px; color: #666; line-height: 1.5em; } h3 { color: #456; font-size: 20px; font-weight: 400; line-height: 28px; } hr { max-width: 800px; margin: 18px auto; border: 0; border-top: 1px solid #EEE; border-bottom: 1px solid white; } img { max-width: 40vw; display: block; margin: 40px auto; } a { line-height: 100px; font-weight: 400; color: #4A8BEE; font-size: 18px; text-decoration: none; } .container { margin: auto 20px; } .go-back { display: none; } </style> </head> <body> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo=" alt="GitLab Logo" /> <h1> 404 </h1> <div class="container"> <h3>The page could not be found or you don't have permission to view it.</h3> <hr /> <p>The resource that you are attempting to access does not exist or you don't have the necessary permissions to view it.</p> <p>Make sure the address is correct and that the page hasn't moved.</p> <p>Please contact your GitLab administrator if you think this is a mistake.</p> <a href="javascript:history.back()" class="js-go-back go-back">Go back</a> </div> <script> (function () { var goBack = document.querySelector('.js-go-back'); if (history.length > 1) { goBack.style.display = 'inline'; } })(); </script> </body> </html>

URL이 http://localhost:8080/project/jenkins-docker-sample-app로 설정된 경우에는 해당 오류가 발생합니다.

localhost가 아닌 IP 주소로 변경하면 정상적으로 Hook이 완료됩니다.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



Test

설정을 완료한 뒤 /opt/gopath/src/gitlab/spring-boot-sample-app/src/main/java/com/johnjhkoo/sample/HelloworldApplication.java 파일을 수정합니다.

atom /opt/gopath/src/gitlab/spring-boot-sample-app/src/main/java/com/johnjhkoo/sample/HelloworldApplication.java

확인을 위해 출력 문구를 수정합니다. ("Hello World! #10")

package com.johnjhkoo.sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloworldApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloworldApplication.class, args);
	}

	@GetMapping(value = "/")
	public String test(){
		return "Hello World! #10";
	}

}

그리고 수정된 소스를 GitLab에 push합니다.

cd /opt/gopath/src/gitlab/spring-boot-sample-app

#GitLab에 push
git add .
git commit -m "initial commit"
git push -u origin master

push가 완료되면 http://localhost:20000/ 페이지를 새로고침해서 변경된 문구("Hello World! #10")가 출력되는지 확인합니다.

수정된 소스가 자동으로 적용되기까지 시간이 조금 걸릴 수 있습니다. (1분 내외?)



반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함