MSA 세팅 시작 [2] Jenkins SSH 설정

최준호·2022년 3월 25일
0

jayeon-msa

목록 보기
2/8
post-thumbnail

🔑키 발급

apt-get install ssh
apt-get install openssh-server
/etc/init.d/ssh restart
service ssh restart

key를 생성하기 위해 jenkins 서버에 ssh를 설치해준다.

ssh-keygen -t rsa

그리고 key를 생성하는 명령어를 실행시키자.

입력하고 싶은 정보가 있으면 입력하면 되진만 그냥 다 Enter로 넘어가도 된다.

정상적으로 키가 생성되었다. 이제 이 key를 원격으로 붙을 서버에 전달해야한다.

발급된 키의 위치는 /${linux 계정}/.ssh/ 아래에 있다.

두개의 파일을 확인했고 우리는 public 키를 원격으로 붙을 서버로 복사해서 전달하면 된다.

나는 해당 파일을 그대로 그냥 복사해서 다른 곳에 붙여놨다가 서버에 붙여넣기 했다.

원격으로 붙을 서버에서 ~/.ssh/를 확인하면 authorized_keys 파일이 존재하는데 해당 파일에 가져온 public 키의 내용을 추가해주거나 파일이 없다면 이름을 그대로 해서 생성해주면 된다.

👨‍💼 jekins 설정

Publicsh Over SSH 플러그인을 우선 설치해주고
설치되어 있다면 설치 필요 없음!

시스템 설정에서 SSH 설정 부분이 추가된 것을 확인할 수 있다.

key에 우리가 발급한 비밀키 값을 넣어주고

SSH를 추가하여 다음과 같이 입력해주었다.

Key : Private Key 값 입력
Name : 아무렇게나 입력해도 됨
Hostname : 접근 IP
Username : 접근 IP User
Remote Directory : 접근시 시작되는 위치

나는 Jenkins Docker Container에서 Docker Server를 실행하고 있는 라즈베리 파이 서버로 명령어를 전달하기 위해서 설정하기 때문에 내부 ip 번호로 연결시켰다. 공인 IP:port로 연결하니까 5번 요청 중 1번은 성공하는 요상한 결과가 나왔다.

👊Test해보기

Test 파이프라인을 작성하여 실제로 작동하는지 확인해보자

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                sshPublisher(publishers: [
                  sshPublisherDesc(
                      configName: 'publisher',
                      transfers: [
                        sshTransfer(
                            execCommand: 'sudo mkdir /test'
                        )
                      ]
                  )
                ])
            }
        }
    }
}

build 전 폴더 리스트를 확인하면 test 폴더가 없을 것을 확인할 수 있다.

빌드 성공 후

test 폴더가 만들어진 것을 확인할 수 있었다.

🔨Jenkins 패키징하고 배포하기

기존의 config 파이프 라인을 수정하여

pipeline {
    agent any

    stages {
        stage('Clone') {
            steps {
                git branch: 'main', credentialsId: '8e8302f1-6b98-4bfe-9981-2e027e49089b', url: 'https://github.com/juno-choi/jayeon-config.git'
            }
        }
        stage('Clean') {
            steps {
                sh 'cd /var/jenkins_home/workspace/config'
                sh 'chmod +x gradlew'
                sh './gradlew clean'
            }
        }
        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }
        stage('HUB Push') {
            steps {
                sh 'docker build -t ililil9482/config-server:1.0 .'
                sh 'docker push ililil9482/config-server:1.0'
            }
        }
        stage('Down') {
            steps {
sshPublisher(publishers: [
  sshPublisherDesc(configName: 'publisher',
  transfers: [
    sshTransfer(cleanRemote: false,
    excludes: '',
    execCommand: 'cd /msa/config && sudo docker-compose down',
    execTimeout: 120000,
    flatten: false,
    makeEmptyDirs: false,
    noDefaultExcludes: false,
    patternSeparator: '[, ]+',
    remoteDirectory: '',
    remoteDirectorySDF: false,
    removePrefix: '',
    sourceFiles: '')
  ],
  usePromotionTimestamp: false,
  useWorkspaceInPromotion: false,
  verbose: false)
])
            }
        }
        stage('Up') {
            steps {
sshPublisher(publishers: [
  sshPublisherDesc(configName: 'publisher',
  transfers: [
    sshTransfer(cleanRemote: false,
    excludes: '',
    execCommand: 'cd /msa/config && sudo docker-compose up -d',
    execTimeout: 120000,
    flatten: false,
    makeEmptyDirs: false,
    noDefaultExcludes: false,
    patternSeparator: '[, ]+',
    remoteDirectory: '',
    remoteDirectorySDF: false,
    removePrefix: '',
    sourceFiles: '')
  ],
  usePromotionTimestamp: false,
  useWorkspaceInPromotion: false,
  verbose: false)
])
            }
        }
    }
}

기존 docker hub에 push까지 하던 로직에 도커 컴포즈를 사용하여 컨테이너를 내렸다 올리는 작업을 추가했다.

컨테이너는 22시간 전에 up되있었는데 젠킨스를 실행시켜보자!

정상적으로 실행되었고 컨테이너까지 정상적으로 재실행되었다.

젠킨스 서버에서 소스를 pull하고 빌드하고 jar를 docker hub로 이미지로 올려서 사용하는 방식인데 여기서 내 궁금점은 이미지화까지 한 뒤에 소스를 젠킨스 서버에서 지워야할까?다. 용량이 계속 해서 차있을 텐데 필요할때만 pull하고 다 올린뒤에는 지우는게 좋은거 아닐까?

해당 부분을 수정하려고 했는데... 안된다...ㅜ 이유를 못 찾겠다... 나중에 꼭 개선하거나 다른 방법이 꼭 있을거 같다. 꼭 찾아보자!

도전했던 방법은 if test -d /var/jenkins_home/workspace/config; then rm -r /var/jenkins_home/workspace/*; fi 명령어로 config 폴더가 존재할 때만 삭제 명령어를 실행해보려고 했는데. 안되더라... 이유를 모르겠더라...

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글