Judaeng

Jenkins 알아보기 본문

DevOps/Jenkins

Jenkins 알아보기

Judaeng 2021. 5. 1. 20:00

Jenkins 사진

🗺️Jenkins의 등장 배경


Jenkins는 Java로 작성된 CI 서버의 오픈 소스 구현으로, 프로젝트의 빌드 주기를 자동화하는 자체 호스팅 옵션으로 사용할 수 있다.

모든 프로그래밍 언어 및 Windows, Linux 및 macOS를 포함한 여러 플랫폼에서 작동한다.

원래 "Hudson"으로 2006년에 설립된 Jenkins는 최고의 자동화 서버 중 하나이다.

확장 가능한 플러그인 기반 아키텍처 개발자를 사용하여 Jenkins를 다양한 빌드, 테스트 및 배포 자동화 워크로드에 적용하기 위해 수백 개의 플러그인을 만들었다.

2015년 Jenkins는 알려진 설치 수가 100,000 개를 넘어서 가장 널리 배포된 자동화 서버이다.

 

Jenkins의 주요 이점 중 하나는 많은 커뮤니티 지원을 제공하는 잘 알려진 도구이며 사용 가능한 많은 플러그인 (Slack, GitHub, Docker, Build Pipeline 등)을 포함하여 많은 플러그인이 있으며 대규모 개발자 커뮤니티에서 잘 관리하고 있다.

 

CI / CD와 Jenkins 프로젝트에 관한 많은 이야기가 있다.

그러나 2017년 말까지 CI 환경을 운영하는 데 많은 시간과 비용이 소요되는 경우가 많기 때문에 놀라운 수의 팀이 시스템을 사용하거나 유지 관리하지 않는다.

 

✏️Jenkins란?

젠킨스는 소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴이다.

CI(Continuous Integration) 툴이라고 표현한다.

다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유 영역에 있는 저장소에 빈번히 업로드함으로써 지속적 통합이 가능하도록 해준다.

 

젠킨스와 같은 CI툴이 등장하기 전에는 일정 시간마다 빌드를 실행하는 방식이 일반적이었다.

특히, 개발자들이 당일 작성한 소스들의 커밋이 모드 끝난 심야 시간대에 이러한 빌드가 타이머에 의해 집중적으로 진행되었는데, 이를 nightly-build라 한다.

 

하지만, 젠킨스는 정기적인 빌드에서 한발 나아가 서브버전, Git과 같은 버전 관리 시스템과 연동하여 소스의 커밋을 감지하면 자동적으로 자동화 테스트가 포함된 빌드가 작동되도록 설정할 수 있다.

 

👆++추가 설명

젠킨스 사이트 접속을 하면, 젠킨스는 프로젝트를 빌드, 배포, 자동화를 해주며 다양한 플러그인들이 있다고 한다.

젠킨스는 Java로 개발되어 있고 WAR를 단독 혹은 톰캣 등의 서버로 실행을 할 수 있으며, Windows, Linux, macOS 등 크로스 플랫폼을 지원한다.

젠킨스를 실행하면 웹 화면을 생성하며 REST API 호출로 구동된다.

 

Jenkins 공식 홈페이지 기능들(번역)

 

✏️CI/CD란?

CI(Continuous Integration)는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미한다.

CD(Continuous Delivery)지속적인 서비스 제공(Continuous Delivery) 및 또는 지속적인 배포(Continuous Deployment)를 의미한다.

 

🤷‍♀️지속적인 통합(Continuous Integration)이란 무엇을 의미하나요?


CI (Continuous Integration)는 개발자가 공유 버전 제어 저장소에서 팀의 코드를 컴파일할 수 있도록 함으로써 빌드 주기 비 효율성을 줄이기 위한 프로세스이다.

CI를 사용하면 테스트를 자동화할 수 있으므로 예를 들어 단위 테스트 또는 통합 테스트를 자동으로 실행하도록 시스템을 설정할 수 있다.

 

CI는 각 엔지니어의 커밋을 자동으로 모니터링한다.

이렇게 하면 코드 작성 및 검증이 간소화되어 테스트가 큰 관심을 끌지 않는다.

소프트웨어 개발 커뮤니티에서 모범 사례로 인식된다.

 

CI는 가시성을 높이는 공유 서버에서 실행되므로 프로젝트의 모든 엔지니어는 매일매일 기본 코드의 변경 사항을 알 수 있다.

또한 개발자가 실패한 코드를 제출할 때 경고하여 서버 오류를 수정할 수 있도록 서버를 구성할 수 있다.

 

CI 자동화를 사용하면 개발 릴리스 주기를 단축하고 제품 품질을 향상할 수 있다.

CI는 본질적으로 팀이 기계를 사용하여 최선을 다할 수 있게 해 주므로 사람은 회사에 더 많은 가치를 가져다줄 수 있다. 또한 프로젝트와 요구에 맞게 모두 사용자 정의할 수 있다.

 

CI 환경은 다양한 수준의 테스트 자동화를 제공할 수 있다.

 

Jenkins를 포함한 CI / CD 서버를 사용하면 팀이 실행해야 하는 테스트를 설정할 수 있다.

 

구현할 수 있는 다양한 수준의 테스트가 있다.

가장 기본적인 테스트는 코드가 실제로 컴파일되는지 여부이다.

코드는 “린트”하거나 스타일을 검사할 수도 있다.

팀은 단위, 통합, 스트레스, 회귀 테스트 등을 비롯하여 다른 기반을 포괄하는 더 복잡한 테스트를 작성할 수 있다.

 

🤷‍♀️Continuous Integration은 Continuous Delivery와 어떻게 다를까?


CI 서비스는 전체 응용 프로그램을 컴파일하고 테스트한다.

또한 지속적인 딜리버리는 이 테스팅된 애플리케이션을 예를 들어 알파 테스터가 조기 피드백을 사용하고 제공할 수 있도록 저장소로 푸시한다.

CD 빌드는 프로덕션 환경에 자동으로 배포되며 광범위한 베타 테스트에도 사용할 수 있다.

 

CD는 린 로지스틱스를 목표로 한다.

새 코드 추가부터 승인 테스트까지 프로세스를 자동화한다.

CD는 모든 단계를 자동화하여 빌드를 배포할 준비가 되었다.

 

지속적인 딜리버리 : 응용 프로그램을 구축하고 테스트를 실행하는 것 외에도 응용 프로그램은 "전달"되기도 한다.

이는 종종 누군가가 수동 테스트를 수행할 수 있도록 서버에 배치하거나 테스트 그룹의 사용자에게 전자 메일로 전송하는 것을 의미한다.

 

프로덕션 빌드의 경우 딜리버리란 최종 사용자를 위한 애플리케이션 배포를 의미한다.

이를 통해 제품을 보다 빠르고 소규모로 배포할 수 있어 배포 위험이 줄어든다.

정기적으로 작고 간결한 배송은 일 년에 한두 번만 발생하는 큰 배송보다 덜 위험하다.

 

*린 로지스틱스(AGILE LOGISTICS)

🤷‍♀️Continuous Integration / Delivery는 개발 팀에 어떤 도움을 줄까?


많은 사람들이 위에서 언급 한 이유로 모든 커밋에서 자동으로 모든 코드를 확인하고 정기적으로 테스트를 실행하고 지속적으로 배포하는 것이 모범 사례로 간주되므로 CI에 대해 이야기합니다.

 

프로세스는 각 개발자의 기여가 함께 잘 작동하는지 확인한다.

이러한 문제를 조기에 발견하면 버그를 보다 쉽고 빠르게 수정할 수 있다.

 

짐작할 수 있듯이 CI / CD를 구현하면 팀에 문화적 변화가 일어난다.  보다 민첩하고 통합된다.

 

CI는 팀이 충돌하는 새로운 코드 세그먼트를 수동으로 해결하거나 빌드를 트리거하거나 테스트를 실행하는 데 시간을 낭비하지 않도록 하기 위해 만들어졌다.

대신 코드에 작은 점진적 변경을 추가하여 해결하기 위해 거대하고 복잡한 버그가 발생하지 않도록 권장한다.

따라서 빌드 주기가 빨라져 배포 및 프로덕션이 능률화될 수 있다.

 

또한 생산(production)은 비즈니스에서 실제로 돈을 버는 곳이다.

 

또한 흥미롭게도 다중 개발자 원격 팀의 경우 CI는 지리적 위치에 관계없이 모든 작업을 한 데 모아 지속적으로 결합하여 작업을 모두 동일하게 유지하므로 구현하는 데 매우 유용하다.

 

Jenkins를 실행하면 코드가 컴파일되는지 지속적으로 확인하고 모든 커밋 후에 기본 코드를 확인하도록 프로그래밍한 기본 테스트 세트를 실행할 수 있다.

 

병합(merge)된 코드를 통합 환경에 자동으로 배포하여 수동 테스트에 사용할 수 있다.

 

또한, 이를 사용하여 프로덕션 빌드를 생성 및 배포하다.

단일 시스템을 업데이트하지 않기 때문에 배포가 복잡하다.

전체 시스템 클러스터를 업데이트하고 있다.

서비스를 방해하지 않는 방식으로 업데이트를 수행해야 한다.

이러한 환경을 사람이 배포하고, 수행하면 오류가 발생할 수 있다

 

Jenkins(젠킨스)의 장점과 단점의 이야기


Jenkins는 친숙하지 않은 사용자 인터페이스를 갖춘 오래된 도구이다.

좋은 소식은 Jenkins 프로젝트가 UI를 크게 향상하기 위한 지속적인 제공 소프트웨어인 Blue Ocean을 방금 발표했다는 것이고, 100 % 오픈 소스이다.

 

팀에서 지속적인 통합 옵션을 고려할 때 Jenkins는 서버에서 실행해야 하며 (비용) 시스템 관리 기술 (시간)을 가진 사람의 관심이 필요한 경우가 있다.

시스템을 설정한 다음 자체적으로 실행되기를 기대할 수 없으며 시스템을 자주 업데이트하고 유지 관리해야 한다.

 

그러나 Jenkins는 오픈 소스이며 개발자 팀을 위해 CI / CD를 구현할 수 있는 가장 널리 사용되고 가장 많이 사용되는 무료 도구 중 하나이다.

 

하지만 대부분의 팀의 진입 장벽은 초기 설정, 지연 또는 이전 설정 시도 실패이다.

사람들은 이것이 최선의 방법이라는 것을 알고 있지만 많은 팀은 보다 긴급한 코딩 작업을 위해 이를 무시했다.

아마도 팀의 누군가가 어느 시점에서 Jenkins를 구현하려고 시도했지만 성공적으로 유지하지 못했다.

어쩌면 낭비한 노력으로 상사가 나쁜 인상을 받았을 수도 있다.

 

사람들이 CI 서버를 구현하지 않는 이유는 대개 매우 실용적이다.

 

한 가지 주요 이유 : CI 시스템이 정기적으로 중단된다.

프로젝트의 설정이 변경되면 종종 CI 시스템의 구성을 다시 조정해야 한다.

CI 시스템이 팀에 의해 가치가 높은 것으로 인식되지 않으면 CI 시스템을 옆으로 치우는 경향이 있으므로 가치 제공이 중단된다.

 

CI를 사용하지 않는 또 다른 이유는 테스트를 작성해야 하기 때문이다.

유닛 테스트는 대부분의 개발자가 하고 싶은 일 (예 : 모범 사례)이지만 할 시간을 찾지 못하는 경우가 많다.

당연히 실제 소프트웨어를 코딩하는 것이 더 많은 관리 작업보다 비즈니스 우선순위가 높다.

 

또한 테스트가 중단되므로 테스트 중인 기능이 변경되면 업데이트해야 한다.

업데이트되지 않으면 위와 같이 가치 제공이 중단된다.

인프라 유지 관리 우선순위를 지정해야 합니다. 그렇지 않으면 작동하지 않는다.

 

요약하면, 설정하는 데 시간이 걸리고 업데이트를 유지하려면 상당한 양의 작업이 필요하다.

그러나 팀은 시스템 유지 관리를 간소화하고 효율성을 높이기 위해 테스트할 수 있다.

 

물론 Jenkins에 대한 SaaS 대안이 호스팅 되어 있으므로 다른 사람이 소프트웨어를 유지 관리하기 위해 약간의 추가 비용을 지불할 경우 도움이 될 수 있다.

기업은 Jenkins가 제공하는 것보다 우수한 UI가 필요할 때 이 옵션을 선택하는 경향이 있다.

그러나 자체 호스팅의 주요 이점은 자신의 데이터 보안을 보다 강력하게 제어할 수 있다는 것이다.

 

CI를 구현하려면 특히 경영진의 문화적 변화가 필요하다.

그들은 이 "비생산적인 것들"이 이루어질 수 있는 시간을 허용해야 하지만, 다른 일상적인 작업들도 보류된다.

 

그럼에도 불구하고 짧은 시간의 희생은 회사 전체의 장기적인 이익으로 해석된다.

Jenkins를 사용하면 코드를 유지 관리하기가 더 쉬워지고 버그가 줄어들고, 팀이 더욱 통합되고 구축 시간이 단축된다.

비즈니스는 더 빨리 배포하고 고객의 변화하는 요구에 부응할 수 있다.

 

이 모든 것은 사고방식 전환이 필요하다.

 

CI는 비용이 아니라 투자이다.

구현을 위한 ROI는 시간 절약, 오류 방지 및 고객에게 보다 쉽게 ​​제공되는 고품질 제품으로 생산될 수 있다.

 

*ROI(투자 수익률)

 

✏️요약

Jenkins의 장점

1. 프로젝트의 표준 컴파일 환경에서 컴파일 오류 검출

2. 자동화 테스트 수행

3. 코딩 규약 준수 여부 체크

4. 프로파일링을 통해 소스 변경에 따른 성능의 변화 감시

5. 테스트 환경에 대한 배포 작업

6. 개발 업무를 도와주는 많은 플러그인을 가지고 있다.

7. 개발의 편의성이 증가

8. 변경된 코드에 대한 즉각적 피드백과 검증이 가능하다.

9. 소스코드의 통합과 검증에 들어가는 시간이 단축한다.

Jenkins 공식 홈페이지 기능들(번역)

Jenkins의 단점

1. 세팅하기 어렵다. ex) 진입 장벽이 높고, 초기 설정, 지연 또는 이전 설정 시도 실패

2. 프로젝트의 설정이 변경되면 종종 CI 시스템의 구성을 다시 조정해야 한다. 그리고 CI 시스템이 중단된다.

3. 테스트를 작성해야 하고, 테스트 중인 기능이 변경되면 업데이트해야 하고, 업데이트되지 않으면 가치 제공이 중단된다.

4. AWS에 EC2 띄우고 젠킨스를 받고 띄우는데 선행지식이 많이 필요하다. ex)  VPC, Security Group, IAM 등

 

✏️CI 툴이란?

Continuous Integration(지속적 통합)의 약자로, 개발이 중간중간 수동으로 해당 코드를 빌드하고 테스팅하는 것이 아닌, 작업 도중 미리 지정한 간격대로 지속적으로 빌드와 테스팅을 자동으로 해주는 것을 말한다.

 

CI 툴 특징

1. 소스코드 일관성 유지

-소스 관리 시스템이 필요함

 

2. 자동 빌드

-커밋에 따른 자동 빌드

-시간 간격에 의한 빌드

 

3. 자동 테스팅

-빌드 과정에서의 테스팅(기능적 요소 및 비기능적 성능적 요소를 매번 검증)

 

4. 일일 체크아웃과 빌드

-소스의 무결성을 유지

 

이 위에 있는 일들을 해주는 친구가 바로 Jenkins(젠킨스)이다.

자동 빌드, 배포, 테스팅이 젠킨스의 핵심이며, Git이나 SVN과 같은 버전 관리 시스템과도 연동하여 사용한다.

글쓴이는 Git과 연동하여 자동 배포를 연습해보았다.🤮

나는 dev 브랜치에서 PR을 보내고 병합할 때 CI 기능이 진행되야되는 걸로 알고 있는데, 그 기능은 연습 못하고, 병합이 되고 나서 자동으로 배포되는 CD만 연습해보았다.

환경 구축 흐름 사진을 보면서 마치겠다.

GitHub과 Jenkins 연동

+Jenkins에 대한 더 이해를 할 수 있는 Blog's

1. Jenkins 공식 문서

2. Redhat 문서

3. 블로그_1

4. 블로그_2

5. 블로그_3

6. 블로그_4

'DevOps > Jenkins' 카테고리의 다른 글

Jenkins를 이용한 자동 배포환경 만들어보기  (0) 2021.05.02
Comments