IT/DevOps

[DevOps] CentOS 8 Jenkins CI, CD 환경 구축(feat. eGovCI)

어흥꼬비 2024. 5. 3. 20:33
반응형

목차

    이번엔 전자정부프레임워크의 서버용 개발환경을 이용해서 CI, CD를 구축했다.

    다음엔 저번에 설치한 GitLab과 새로 설치한 Jenkins로 처음부터 연동하는 것도 포스팅 예정이다.

     

    [DevOps] CentOS 8 JenKins 설치(feat. CI, CD)

    목차JenKins 설치과정내 경우는 jdk가 이미 설치되어 있었기에 그 부분은 생략했다.#공개키 가져온다.rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key#저장소 파일 설치sudo wget -O /etc/yum.repos.d/je

    yaga.tistory.com

     

    [DevOps] CentOS 8 GitLab 설치

    목차GitLab 설치과정#GitLab의 CentOS용 RPM 저장소 설치하기 위한 스크립트 다운로드 및 실행curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash#gitlab 커뮤니티버전 설치sudo yum

    yaga.tistory.com

    그림은 참 못그렸지만 구조는 대략적으로 아래와 같다.

    이로써 해보지 않았던 JenKins 세팅이라는 small success를 또 얻었다. 😄

    1. 개발자pc에서 GitLab으로 소스를 commit/push한다.
    2. GitLab에 push 이벤트 발생 시 webhook을 이용해서 jenkins의 job을 실행시킨다.
    3. jenkins의 job에서는 빌드 툴(여기선 maven)을 이용해서 빌드한다.
    4. 빌드가 성공적으로 수행된 경우 WAS의 배포경로에 소스를 war파일 형태로 배포한다.

    다음엔 버추얼박스에 다 설치해서 라이브로 촬영할까 생각중이다.


    GitLab Community Edition ver: 15.9.1

    Jenkins 2.426.3

    JenKins를 띄우는 tomcat 9.0.85

    jdk 17.0.11(OpenJDK Corretto)

    apache-maven 3.9.6


    내용이 기니까 목차로 이동하길 바란다.


    서버용 개발환경 다운로드 및 업로드

    아래 경로에서 eGovCI-4.2.0.tar.xz를 다운로드 받는다.

    https://www.egovframe.go.kr/home/sub.do?menuNo=94

    업로드 권장 경로(/home/사용자폴더)에 업로드 한다.

    업로드한 eGovCI-4.2.0.tar.xz의 압축을 해제한다.

    서버용 개발환경 폴더 목록을 확인한다.

    Jenkins 실행 및 설정

    서버용 개발환경 리눅스용은 jdk가 동봉되어 있지 않으니 jdk를 미리 세팅해놔야 한다.

    이 부분은 표준프레임워크센터에서 리눅스용 배포할 때 누락된건지 정확히 알 수 없다. 😥

    그냥 다 넣어주면 좋으련만..리눅스용 말고 아래처럼 windows용은 jdk 1.8과 17 둘 다 들어있다.

    세팅된 jdk와 jenkins를 연동하기 위해 다음 파일의 JAVA_HOME 경로를 수정한다.

    vi /home/사용자폴더/eGovCI-4.2.0/setEnv.sh

    jenkins를 띄우는 tomcat의 포트 변경(WAS와 port 중복 방지) 후 방화벽을 해제한다.

    #포트 설정 수정하기 위한 파일 편집
    vi /home/사용자명/eGovCI-4.2.0/bin/apache-tomcat-9.0.85-jenkins/conf/server.xml
    
    #방화벽 허용
    sudo firewall-cmd --permanent --zone=public --add-port=포트번호/tcp
    #방화벽 적용
    sudo firewall-cmd –reload
    #방화벽 허용 목록
    sudo firewall-cmd --list-all

    jenkins를 기동한다.

    jenkins의 admin 임시 비밀번호를 확인 후 복사한다.

    cat /home/사용자명/eGovCI-4.2.0/home/Jenkins/secrets/initialAdminPassword

    브라우저에서 host:8081/jenkins로 호출한 뒤 admin/임시비밀번호로 로그인 한다.

    그 후 admin 비밀번호를 변경 후 재로그인한다.(Jenkins관리 > Users > Password)

    Tools

    Jenkins 관리 > System Configuration > Tools 선택 후 Maven Configuration, JDK installations, Git installations, Maven installations을 설정 후 저장한다.

    GitLab Plugin 설치

    소스 저장소가 GitLab이라서 GitLab 플러그인을 설치한다.(Jenkins관리 > Plugins > 사용가능 플러그인)

    Item 생성 및 설정

    작업을 진행할  Item명 입력 후 Maven project 선택 후 Ok를 누른다.

    소스코드관리에서 Git을 선택한 후 Repository URL에 GitLab 저장소 URL을 입력한다.

    현재는 GitLab 계정이 없어서 연결이 실패한다.

    Credentials > Add(Jenkins) 선택 후 Username, Password만 본인의 gitLab계정로 입력 후 Add를 누른다.(ID, Description은 선택사항이다.)

    Git > Repositories > Credentials에서 방금 추가한 계정을 선택한다.

    Branches to build는 테스트를 위해서 Branch Specifier를 빈값으로 해서 모든 branch로 설정했다.

    Apply를 누른다.

    빌드유발에서 Build when a change is pushed to GitLab을 체크 후 GitLab webhook URL을 메모해 둔다.

    빌드 유발 > 스크롤 내려서 Secret token에서 Generate을 누르면 토큰이 생성되는데 이를 메모해 두고 (절대 외부에 유출되면 안된다.) Apply 누른 후 저장을 누른다.

    GitLab으로 이동 후  > 해당 프로젝트 > Settings > Access Tokens에서 토큰을 생성한다.
    만료일을 지울 경우 만료가 없게 되고 Select scopes는 상황에 맞게 체크 후 Create Project access token 선택 시 토큰이 생성되는데 이를 메모해둔다. (절대 외부에 유출되면 안된다.)

    Settings > Webhooks에서 URL에 jenkins에서 메모해 둔 GitLab webhook URL을 입력(이 때 host는 localhost가 실제 IP를 입력해야 외부 통신이 된다.), Secret token도 jenkins에서 생성한 토큰 입력 후 Trigger > Push events에서 원하는 branch를 체크 한 뒤 (테스트를 위해 All branches로 체크했다.) Add webhook을 누른다.

    만일 webhook 생성 시 아래처럼 에러가 발생 할 경우 전체 관리자로 접속 후 Admin Area > Network > outbound requests 선택 후 Allow requests to the local network from web hooks and services 체크 후 저장 한 뒤 재시도한다.

    webhook이 생성되면 Test > Push events를 눌러 테스트한다.
    만일 아래처럼 403 에러 발생할 경우 jenkins에서 Secret token이 제대로 생성되었는지 확인한다. Secret token Generate 후 Apply 누른 후 저장을 눌러야 생성된다.

    webhook 정상 통신 될 경우 아래처럼 상태값 200이 확인된다.

    다시 Jenkins로 와서 Jenkins 관리 > Credentials > Stores scoped to Jenkins에서 Domains의 global을 누른다.

    Kind > GitLab API token 선택, API token에 GitLab에서 생성한 API token을 입력 후 Create를 누른다.

    Jenkins 관리 > System > GitLab에서 Connection name, GitLab host URL 입력 후 Credentials에서 생성한 GitLab API token 선택 후 Test Connection을 누르고 Success가 표출되는지 확인한다.

    Dashboard에서 아까 생성한 item 선택 후 구성을 누르고 Build부분에서 Goals and options에 아래처럼 입력(상황에 따라 다르게 입력한다.) 후 Apply를 누른다.

    WAS(apache tomcat 9.x) 설정

    WAS에 tomcat manager 계정으로 관리할 수 있도록 아래 명령어로 파일을 편집 후 tomcat 재기동한다.

    #tomcat user 편집
    vi /tomcat설치경로/tomcat/conf/tomcat-users.xml
    
    #tomcat manager 원격 접속 허용하기 위함
    vi /tomcat설치경로/tomcat/webapps/manager/META-INF/context.xml
    # <Value className…> 주석처리

    브라우저에서 host:port/manager 호출 후 생성한 tomcat manager계정으로 접속 되는지 확인한다.

    다시 Jenkins로 와서 Jenkins관리 > Plugins에서 deploy라고 검색 후 Deploy to container를 설치한다.

    Item > 구성에서 빌드 후 조치 > 빌드 후 조치 추가에서 Deploy war/ear to a container를 선택한다.

    War/EAR files의 표현식을 입력 후(매뉴얼에서는 모든 war파일로 입력했다.)
    Containers > Add Container 선택 후 Tomcat 9.x Remote를 선택한다.

    Tomcat 9.x Remote > Credentials > Add(Jenkins)누른 후 tomcat manager정보를 입력 후 Add를 눌러서 추가 후 Credentials에서선택 후 Tomcat URL 입력 후 저장한다.

    CI, CD 테스트

    테스트용으로 branch 생성 및 화면 수정 후 GitLab에 commit/push한다.

    Jenkins에서 빌드가 실행된다.

    Console Output 선택 시 로그를 확인할 수 있다.

    서버의 WAS 배포 경로에 war파일의 배포상태를 확인한다.

    war파일이 잘 옮겨졌고 압축도 풀렸다.

    브라우저에서 웹 애플리케이션의 url 호출 후 로그인 화면 내용의 변경을 확인한다.

    정상적으로 수정한 소스가 적용되었다.

    전자정부 CI 구축 가이드가 리눅스용은 참조할 만한 게 별로 없어서 삽질 많이했다.

    휴 이번 포스팅은 매우 힘들었다.

    미래의 나를 위해 하는 기록이고 누군가에게 작은 도움이 되길 바라며..


    개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

    틀린 점 있을 경우 댓글 부탁드립니다.

    반응형