젠킨스 > Jenkins 관리 > 플러그인 관리

젠킨스에서 플러그인 관리 화면으로 진입한다.

 

젠킨스 > Jenkins 관리 > 플러그인 관리

git과 github관련 플러그인의 설치를 확인한다. 설치되어 있지 않다면 설치해야 한다.

 

 

GitHub 계정별 연동

github으로 가자.

 

github > Settings

github > Settings > Developer setting

Developer setting 항목을 찾는다.

 

github > Settings > Developer settings > Personal access tokens

Personal acceess tokens 항목에서 계정의 토큰을 생성 할 수 있다.

Generate new token 버튼으로 토큰을 생성한다.

위 캡쳐에서처럼 admin:org(레파지토리 읽기/쓰기), admin:repo_hook(레파지토리 훅 권한) -깃헙에 push가 일어나면 자동으로 빌드되어 컨테이너를 실행할 수 있도록-, repo(레파지토리 접근) 스콥으로 진행하겠다.

 

젠킨스 > Jenkins 관리 > 환경설정

이후 Jenkins 환경설정에서 Add GitHub Server를 눌러주자.

젠킨스 > Jenkins 관리 > 환경설정

Add버튼으로 Credentials를 등록한다.

GitHub > GitHub Server > Add Credentials

Kind - Secret text

Secret - 토큰

을 입력해주면 된다.

Jenkins > Jenkins 관리 > 환경설정

Test connection버튼으로 연결을 확인하고 환경설정 가장 아래의 저장 또는 Apply버튼으로 세팅을 저장한다.

(사실 Public Repository로 진행한다면 이 과정은 필요없다)

 

 

SSH KEY연동방식

젠킨스와 gitHub 연동시 계정을 통째로 인증하는 방식은 보안상 위험 할 수 있다.

 

따라서 SSH 연동방식또한 소개한다.

 

간단하게, 더 귀찮고 더 보안이 좋은 방식이다.

 

cd /var/jenkins_home
mkdir .ssh
ssh-keygen -t rsa -f /var/jenkins_home/.ssh/github_rsa_ssh_key

먼저 SSH 키를 생성한다.

키의 이름은 github_rsa_ssh_key 으로 하겠다.

 

 

GitHub > Repository > Settings > Deploy keys > Add deploy key

깃헙 레파지토리에서 Setting > Deploy keys > Add deploy key항목을 찾아낸다.

 

GitHub > Repository > Settings > Deploy keys > Add deploy key

방금 생성한 ssh key 중 확장자가 .pub으로 되어있는 public key를 등록해준다.

 

SCM: Git > Repositories > Credentials

이후 Credentials를 등록하는 화면에서 위와 같이 입력한다.

Private Key는 위에서 생성한 SSH키 중 private key를 입력하면 된다.

 

SCM: Git > Repositories

Repository URL은 위와 같이 SSH방식으로 적어야 한다

 

이상 GitHub과 Jenkins를 연동하는 두가지 방법이다.

728x90
반응형

git repository에 있는 spring boot project를 Jenkins를 사용해

 

자동으로 개발서버에 빌드 및 도커 컨테이너로 배포하는 일기다.

 

젠킨스 > Jenkins 관리 > 플러그인 관리

docker를 사용하여 컨테이너를 띄울 예정이니 docker 관련 플러그인을 설치해주자.

 

Jenkins에서 파이프라인을 만들어보자

Jenkins > 새로운 Item

새로운 Item을 생성한다.

 

Jenkins > 새로운 Item

'Pipeline', 배관 아이템을 선택한다. 아이템 이름은 필수값이다.

 

Jenkins > 새로운 Item > Pipeline

SCM을 Git으로 선택 후, GitHub의 Repository를 선택해준다.

Credentials에서는 여기서 생성한 Credential을 넣으면 된다.

 

Branches to build에는 master브랜치를 입력해준다.

개발 branch를 따로 지정해주고 싶다면 그렇게 해도 된다.

 

Script Path에는 레파지토리에 사전 작성할 파이프라인 스크립트의 파일명을 입력해주면 된다.

그리고 레파지토레에 Script Path에 해당하는 경로에 Script파일을 작성하면 된다.

나는 다음과 같이 작성했다.

pipeline {
    agent none
    //기본적으로 체크아웃을 하지 않는 옵션
    options { skipDefaultCheckout(true) }
    stages {
        stage('Checkout repository') {
            agent any
            steps {
                checkout scm
            }
        }
        stage('Build and test') {
            agent {
                docker {
                    image 'gradle:6.6.1-jdk11-openj9'
                    args '-v /root/.m2:/root/.m2'
                }
            }
            steps {
                sh 'gradle clean build -x test'
            }
        }
        stage('Docker build') {
            agent any
            steps {
                sh 'docker build -t {container_name}:latest .'
            }
        }
        stage('Docker run') {
            agent any
            steps {
                sh 'docker ps -f name={container_name} -q | xargs --no-run-if-empty docker container stop'
                sh 'docker container ls -a -fname=sbor_dev -q | xargs -r docker container rm'
                sh 'docker images --no-trunc --all --quiet --filter="dangling=true" | xargs --no-run-if-empty docker rmi'
                sh 'docker run -d --name {container_name} -p 8080:8080 {container_name}:latest'
            }
        }
    }
}

Checkout repository에서 레파지토리 내용을 checkout받고 

Build and test에서 gradle을 docker agent로 실행해 소스를 build한다.

Docker build에서 도커 이미지를 빌드하고

Docker run에서 기존 컨테이너와 이미지를 지우고 새로운 컨테이너를 실행한다.

 

도커 build stage에서 사용할 Dockerfile은 다음과 같이 작성했다.

FROM openjdk:11
ADD {your_application_file} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

open jdk 이미지의 정보는 https://hub.docker.com/_/openjdk 여기서 확인할 수 있으며 컨테이너와 파일교환을 위해 volume을 따로 설정해줘도 좋다.

 

이제 젠킨스에서 PIPELINE 실행을 통해 GitHub 레파지토리의 파일을 체크아웃받아 gradle로 빌드를 하고 OpenJDK11버전 이미지를 통해 SpringBoot Application을 컨테이너로 실행 할 수 있다.

 

 

[Trouble Shooting]

Jenkins

Invalid agent type "docker" specified.

Jenkins에서 docker 관련 플러그인이 없을 경우. 관련 플러그인 설치로 해결.

 

 

container 내부 docker 설치

/var/jenkins_home/workspace/{depends on you}/script.sh: docker: not found

컨테이너 내부에 docker가 설치되어있지 않음을 간과한경우.

도커가 설치되어 있는 컨테이너를 사용해야 한다.

curl -fsSL https://get.docker.com/ | sudo sh

 

 

Jenkins docker container

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/amd64/gradle:6.6.1-jdk11-openj9/json: dial unix /var/run/docker.sock: connect: permission denied

컨테이너에서 docker.sock에 대한 실행권한이 없다. 컨테이너에서 구동되는 jenkins는 jenkins라는 user권한을 사용하기 때문에 docker그룹에 추가해주자.

컨테이너의 root권한 bash를 열어준 뒤 그룹에 추가하면 된다.

이후 도커 데몬을 재기동 해주자.

usermod -aG docker jenkins
service docker restart


docker rmi

docker: "rmi" requires a minimum of 1 argument.

docker rmi 명령어가 삭제할 이미지가 없는 경우다.

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

위와 같이 잉여 이미지를 정리하는 명령어를 사용 할 때, 이미지가 하나도 없는 깨끗한 상태라면 바로 에러를 뿜게 된다.

따라서 다음과 같이 --no-run-if-empty를 사용하자

docker images --no-trunc --all --quiet --filter="dangling=true" | xargs --no-run-if-empty docker rmi

참조: stackoverflow.com/questions/35416962/error-while-cleaning-images-from-docker

 

 

 

작성 참조 링크

twofootdog.github.io/Docker-Docker%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EB%A1%9C-jenkins-%EC%8B%A4%ED%96%89-%ED%9B%84-%EC%86%8C%EC%8A%A4-push-%EC%8B%9C-%EC%9E%90%EB%8F%99-%EB%B9%8C%EB%93%9C%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0(Springboot)/

tomgregory.com/building-a-spring-boot-application-in-docker-and-jenkins/

 

728x90
반응형

+ Recent posts