ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CI/CD 구축] 젠킨스와 깃헙 private repo 웹훅 연결하기 (push 이벤트)
    Project/CICD 2022. 2. 9. 00:40
    728x90
    반응형

    [Project workflow]

    EC2로 윈도우/리눅스 EC2 생성

    Mac에서 EC2 접속 test

    (테스트 빌드용) 로컬 젠킨스 서버 배포

    젠킨스 프로젝트 생성 및 빌드 코드 짜기

    EC2 젠킨스 배포

    배포된 젠킨스 서버와 깃헙 웹훅 연결

    코드 merge시 EC2에서 빌드되는지 테스트


    인증 정보 설정

     Private repo에 젠킨스가 접근하기 위해서는 인증정보를 등록하야한다. 여러 방법 중 SSH key 세팅을 사용하면 id나 pw 정보 없이 접근이 가능하다.

     

    SSH 인증 정보 설정

    1. 젠킨스에서 젠킨스 관리 > 플러그인 관리에서 Github Integration 플러그인을 설치해준다. (토큰으로 접속해도 필요하다)

    2. 다음 명령어를 통해 젠킨스가 어떤 계정으로 실행되고 있는지 확인한다

    $ps aux | grep jenkins

    3. 다음 명령으를 통해 쉘로 접속한 후 ssh 디렉토리를 생성한다. 여기서는 bash 쉘을 사용한다.

    (만약 mkdir: permision denied가 뜨면 명령어 앞에 sudo를 붙여 생성한다)

    $sudo -u [위에서 확인한 계정명] /bin/bash
    $mkdir /var/lib/jenkins/.ssh
    $cd /var/lib/jenkins/.ssh

    4. ssh key를 생성한다. 여기서도 permission denied가 뜨면 앞에 sudo를 붙여준다 (내 컴퓨턴데 왜 이렇게 못하는게 많은지)

    명령어를 실행하면 계정 로그인 비밀번호를 두 번 입력한다. 그러면 예쁜 박스가 그려지고 공개 및 비밀키가 /var/lib/jenkins/.ssh에 저장된다.

    $ssh-keygen -t rsa -f /var/lib/jenkins/.ssh/github_ansible-in-action

    5. 공개키와 비밀키가 잘 생성되었는지 확인한다.

    $ls -l /var/lib/jenkins/.ssh

    6. 공개키(.pub에 있는 키)를 복사한다

    $cat /var/lib/jenkins/.ssh/github_ansible-in-action.pub

     

    Webhook 설정

    1. 위에서 복사한 공개키를 웹훅을 연결하고자하는 레포에 등록한다.

    레포지토리의 Settings > Deploy keys에서 수행

     

    2. 레포지토리의 Settings> Webhooks 에서 Add webhook 클릭

        2-1. Payload URL 입력 (젠킨스가 위치한 주소/github-webhook/)

            - 로컬 젠킨스 배포한 경우 : http://외부IP주소:포트포워딩한 포트 번호/github-webhook/

            - ec2의 경우: http://public IP주소:8080/github-webhook

        2-2. Content type: application/json 선택

        2-3. 어떤 경우에 서버를 콜할지 선택. 나는 push 되었을 때만 받을거기 때문에 'Just push event'선택

        2-4. Active 체크

        2-5. Update webhook

     

    3. 페이지를 새로고침 했을 때 주소 옆에 초록색 체크표시가 뜬다면 정상적으로 설정이 된 것이다.

    Jenkins 설정

    1. 쉘에서 다음 명령어로 비밀키를 복사한다.

    $sudo cat /var/lib/jenkins/.ssh/github_ansible-in-action

    2. 젠킨스에 인증키를 등록해준다.

        1-1. Jenkins 관리 > Manage Credentials > (global) > Add Credential

        1-2. Kind에 SSH Username with private key 선택

        1-3. Scope에 Global 선택

        1-4. ID와 Username 입력

        1-5. Private Key에서 Enter directly를 클릭하면 Add 버튼이 뜬다

        1-6. Add 버튼을 클릭하면 나오는 하얀색 창에 위에서 복사한 비밀키를 넣어준다 (BEGIN부터 END줄까지 모두 다)

        1-7. OK버튼을 클릭해 등록해준다.

    2. 이제 젠킨스 프로젝트를 생성해준다. 젠킨스 홈에서 New Item 클릭

    3. 프로젝트 이름을 입력하고 빌드하고자하는 작업에 맞는 프로젝트 형태를 선택해준다. 나는 Freestyle project를 선택했다.

    4. 소스코드 관리 쪽에서 Git을 선택한다

    5. Repository URL에 레포에서 복사한 ssh 경로를 넣어준다. (이 경로로 접근 실패하는 경우 (아래 trouble shooting 참고) HTTPS 주소를 넣어준다)

    6. Credentials에 아까 젠킨스에서 생성한 credential 정보를 선택한다.

    7. 어떤 브랜치에 변경사항이 적용되면 빌드를 할 지 선택한다. 아무것도 안 적으면 모든 브랜치에 대해 적용된다.

    8. 트리거는 Github hook trigger for GITScm polling을 선택해준다 (Github trigger를 받으면 빌드를 하겠다)

    9. 빌드 탭에서는 트리거를 받으면 작동시킬 동작을 정의해준다. 일단 연결이 잘 되었는지 확인하기 위해 Execute shell을 선택하고 간단한 출력 명령어를 아무거나 쳐준다.

    테스트

    1. 레포에 코드를 push 한다

    2. 젠킨스 왼쪽 하단의 빌드 실행상태 창에 아까 생성한 프로젝트가 돌아가고 있다는 표시가 뜬다 

    3. 조금있다가 새로고침을 하면 작업이 성공했다면 작업 옆 아이콘이 초록색 체크 모양으로 변경되고, 실패했다면 x 아이콘으로 변경된다.

    4. #1을 클릭해서 console output에 들어가면 로그를 볼 수 있다

     

    * Trouble shooting

    - Error cloning remote repo 'origin'이 뜨는 경우

    git을 찾을 수 없어 뜨는 에러다. git이 설치되지 않았다면 새로 설치하거나 git 경로를 추가해주어야한다. 젠킨스 관리 > Global Tool Configuration에 가서 쉘에서 which git을 쳤을 때 나오는 경로를 추가해준다. (사실 아래의 문제일 수도 있다)

     

    - Error fetching remote repo 'origin'이 뜨는 경우

     1. 레포지토리 링크가 잘못되었거나 인증 정보가 잘못되어 접근권한이 없어 뜨는 에러다. 레포지토리 링크를 확인하거나 인증 정보를 다시 넣어주거나 젠킨스를 껐다 켜는 방법으로 해결이 가능하다.

     2. 다른 원인으로는 젠킨스를 로그인한 계정과 설치한 계정이 달라서 일수도 있다고한다. 젠킨스를 다시 설치해야하는데 이건 너무 귀찮아서 인증 정보를 ssh에서 토큰으로 변경했더니 바로 됐다.

     3. 그래도 ssh로 접근이 안되는게 이상해서 프로젝트에 레포 주소를 SSH가 아니라 HTTPS로 넣어주었더니 됐다 (Jenkins 설정의 5번 단계)

     

    다른 사람들은 어떻게 ssh 주소로 접근한 걸까 궁금..  

    아무튼 성공하면 로그가 이렇게 뜨고 아까 빌드 스크립트로 넣었던 `echo "webhook triggered jenkins succesfully"`가 로그에 잘 찍혀있는 것을 확인 할 수 있다.

     

    728x90
    반응형

    댓글