728x90

원래는 EC2 Host OS에 NGINX를 직접 설치해서 사용했으나,

nginx 설정이나 인증서 등을 관리할 때 다 직접하면 불편할 것 같아서 nginx도 컨테이너로 만들어 버렸다.

 

더불어, Jenkins도 이미지를 이용해서 컨테이너로 만들었다. Jenkins는 방식이 거의 유사해서 따로 포스팅은 안 해도 될 것 같다:)

 

 

먼저 로컬에 nginx 디렉토리를 하나 생성하고

Dockerfile을 다음과 같이 만들면 NGINX를 바로 사용할 수 있다.

FROM nginx

 

nginx.conf도 수정해 주어야 하기 때문에, nginx 디렉토리에 nginx.conf 파일을 만들고 다음과 같이 작성했다.

server {
  listen 80;
  server_name 도메인;
  server_tokens off;
  
  location / {
    return 301 https://$host$request_uri;
  }
}

server {
  listen 443 ssl;
  server_name 도메인;


  location / {
    proxy_pass         http://172.17.0.1:3000;
    proxy_redirect     off;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
  }

  ssl_certificate /etc/nginx/ssl/nginx_ssl.crt;
  ssl_certificate_key /etc/nginx/ssl/키;

  ssl_session_timeout 3y;
  ssl_prefer_server_ciphers on;

}

 

도커 파일은 다음과 같이 수정했다.

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf

RUN mkdir /etc/nginx/ssl

# ssl 인증서 복사
COPY nginx_ssl.crt /etc/nginx/ssl
COPY 키 /etc/nginx/ssl

 

코모도 인증서를 crt로 만들어서(https://www.comodossl.co.kr/certificate/ssl-installation-guides/Nginx.aspx) 함께 이미지로 만든다

728x90
728x90
공식 문서를 보고 공부한 내용입니다 :)

 

Using a Jenkinsfile

젠킨스 파일은 젠킨스 파이프라인에 대한 정의와 source control이 있는지를 체크한다.

pipeline {
	agent any
    
    stages {
    	stage('Build') {
        	steps {
            	echo '🔨 Building...'
            }
        }
        stage('Test') {
        	steps {
            	echo '🧪 Testing...'
            }
        }
        stage('Deploy') {
        	steps {
            	echo '🧐 Deploying...'
            }
        }
    }
}

모든 파이프라인이 이 세 단계를 포함하는 건 아니지만 대부분의 프로젝트에서 세 단계가 포함되면 좋다.

파일을 만들 때 Groovy syntax가 이상적이라고 한다.

프로젝트의 루트 디렉토리에 젠킨스 파일을 만들어야 된다

 

Build

code가 assembled, compiled, 혹은 packaged되는 시점. 젠킨스 파일은 GNU/Make, Maven, Gradle 등의 빌드툴로 대체될 수 없다고 한다. 이를 위한 많은 플러그인이 있는데, 예제에서는 sh를 이용한다. sh step은 Unix/Linux-based인 경우에 사용할 수 있고, Window-based라면 bat을 사용하면 된다고 한다.

 

pipline {
	agent any
    
	stages {
    	stage('Build') {
        	steps {
            	// make command를 유발
            	sh 'make'
                // 해당 패턴에 매칭되는 파일을 캡쳐하고 젠킨스 컨트롤러에 저장
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
            }
        }
        stage('Test') {
        	steps {
            	// junit을 이용하기 위해 두 단계가 필요한 것 같다.
            	sh 'make check || true'
                // junit plugin을 통해 junit test를 할 수 있는 것 같다.
                junit '**/target/*.xml'
            }
        }
        stage('Deploy') {
        	when {
            	expression {
                	currentBuild.result == null || currentBuild.result == 'SUCCESS'
                }
            }
            steps {
            	sh 'make publish'
            }
        }
    }
}

 

이 외에도 엄청 많은 것 같은데 사용한 문법은 계속 추가해 나가야겠다 : )

728x90
728x90
이전 포스팅에서 AWS EC2에 도커 이미지화 한 프로젝트 배포를 진행해 보았다.
이번 포스팅에서는 EC2 지속적 통합과 지속적 배포를 하기 전 조사 과정을 담아보았다.

 

 

CI/CD란?

CI(Continuous Integration)

지속적 통합을 의미. 빌드/ 테스트 자동화 과정

 

CD(Continuous Deployment or Continuous Delivery)

지속적 배포 지속적인 서비스 제공을 의미. 배포 자동화 과정

 

 

CI/CD 종류

Jenkins, CircleCI, TravisCI, Github Actions 등등

 

Jenkins 와 Github Actions 비교

Jenkins Github Actions
무료 오픈소스. 빌드, 테스트, 배포와 관련된 소프트웨어 개발 부분을
자동화하고, 지속적인 통합과 지속적인 배포를 제공한다.
Github에서 SaaS(Software as a Service, 서비스로서의
소프트웨어) 제품으로 제공하는 최신 기능
서버 설치 필요 클라우드에서 동작
동기적 (제품을 배포하는데 더 많은 시간 소요) 비동기 CI/CD 가능
계정과 트리거에 기반, Github 이벤트 처리할 수 없음 Github이벤트에 대해 Github Actions를 제공
환경 호환성을 위해 Docker 이미지에서 동작해야 함 모든 환경에 호환됨
캐싱 기법을 위해 플러그인 제공 캐싱이 필요하다면 직접 캐싱 매커니즘을 작성해야 함

 

 

Github Actions를 사용할 경우

1. S3에 코드를 올리고(저장하고) AWS CodeDeploy를 통해 빌드하고 EC2에 배포하는 방법

2. 도커 이미지를 Github Container Registry를 이용해서 빌드하고 EC2에 기존 이미지 삭제 후 새로운 이미지 바로 올리는 방법
https://codegear.tistory.com/84

 

 

Jenkins를 사용할 경우

EC2를 두 대를 두고 진행.

하나는 젠킨스, 도커를 설치하여 젠킨스 서버로 사용하고, 하나는 프로젝트가 실행되는 서버로 둔다. 

 

 

 

[공부 후기]

지금 당장 AWS EC2에 올라가는 프로젝트는 하나이지만,

결국 나중에는 온프레미스로 올라가있는 프로젝트도 AWS로 넘어가려고 한다 하셨기 때문에,

젠킨스 서버를 하나 만들어서 EC2 두 대를 두고 진행해 보아야겠다.

 

아무래도 경험이 많지 않다보니, 지금 판단이 틀릴 수도 있지만

일단 해보고 또 틀렸으면 틀린 걸 통해서 배우고 그래야겠다!

 

 

여담으로 S3가 Simple Storage Service의 약어라는 걸 엊그제 책 읽으면서 알게 되었다

세상에 S3가 그냥 당연히 S3인줄만 알았는데 역시 늘 무언가 하나씩 알게 되는 과정은 참 즐겁다.


Reference

 

[참고1] EC2 젠킨스 이용할 때 설계

https://velog.io/@haeny01/AWS-Jenkins%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Docker-x-SpringBoot-CICD-%EA%B5%AC%EC%B6%95

 

[참고2] Github Actions vs Jenkins

https://wookiist.dev/155

 

[참고3] CI/CD 설명

https://seosh817.tistory.com/104

 

 

 

728x90
728x90
이전 포스팅에 이어 Jenkins Item을 Pipeline을 사용하여 구축하는 과정을 기록하였습니다.

이전 포스팅에서 Freestyle Project로 CI/CD를 구축해보려 했는데,

Pipeline과의 차이가 궁금해서 찾아보게 되었다. [참고1]

간단히 정리해보면 다음과 같다.

Freestyle Project

jenkins에서 기본 틀을 정해주고 안에 빈칸을 채우는 형식이다.

 

장점

  • 기본 틀이 정해져 있기 때문에 진입 장벽이 낮다
  • 기존 사용 사례가 많아 참고할 자료가 비교적 풍부하다

단점

  • 커스터마이징이 제한적이다
  • 테스트 혹은 빌드 등의 작업에서 병렬처리 미지원
  • 다수의 형상관리 Repository와 연계하여 사용할 수 없다

 

Pipeline

한곳에서부터 작업을 시작해서 일렬로 혹은 여러 갈래로 뻗어져 나갔다가 다시 한쪽으로 모이면서 마무리 되는 방식의 작업 흐름

 

🌟 Freestyle Project도 일렬로만 처리되는 Pipeline이라고 할 수 있다고 합니다. 하지만 파이프라인 구조를 마음대로 변경하거나 하는 추가적인 커스터마이징을 할 수 없기 때문에 특별한 이유가 없다면, Pipeline으로 관리하는 것이 낫다고 합니다

 

장점

  • 커스터마이징의 폭이 넓다
  • 테스트 혹은 빌드 등의 작업에서 병렬처리 지원
  • 다수의 형상관리 Repository와 연계하여 사용할 수 있다

단점

  • 진입장벽이 비교적 높다
  • 기존 사용사례가 적어 웹상에 참고할 자료가 적다

 

Pipeline으로 구축하기로 하고 [참고2] 블로그를 참고하여 구축했다.

나의 경우도 jenkins 인스턴스(Amazon Linux 2), 배포서버 인스턴스(Amazon Linux 2) 이렇게 두 대가 있고

파이프라인 구조는 다음과 같다.

1. 코드 github에 push

2. 저번 포스팅에서 설정한 github webhook이 jenkins 인스턴스에 요청을 보냄

3. jenkins 파이프라인 실행

    3-1. docker build

    3-2. docker image push

    3-3. jenkins 인스턴스에서 배포서버 인스턴스로 ssh 접속

    3-4. 배포서버 인스턴스 docker image pull

    3-5. 배포서버 인스턴스 docker image run

    3-6. 배포서버 인스턴스 기존에 같은 컨테이너는 종료

4. jenkins에서 메일 또는 슬랙으로 결과를 전송

 

Jenkins 파이프라인

먼저, 젠킨스의 공식 문서에서 파이프라인에 대한 내용을 학습했다. (젠킨스 공식문서)

(제가 해석한 거라 틀린 부분이 있을 수 있어요! 잘못 해석한 내용이 있다면 댓글로 알려주시면 감사하겠습니다😀)

 

젠킨스 파이프라인은 지속적 통합 배포 파이프라인을 젠킨스에서 할 수 있는 플러그인이다.

파이프라인은 간단한 것부터 복잡한 배포 파이프라인을 Pipeline DSL을 통해 "코드로" 설계할 수 있도록 해준다.

Pipeline DSL은 Declarative Pipline과 Scripted Pipeline으로 정의되는데,

Scripted Pipline은 Groovy syntax에서 한계가 있다고 한다.

 

파이프라인은 다음 세 가지 방식 중 하나로 만들 수가 있다고 한다.

1. Blue Ocean - 파이프라인 UI, 그래프로 표현

2. Classic UI

3. In SCM - source control repository

 

 

Prerequisites

1. 젠킨스 2.x 혹은 이후 버전

2. 파이프라인 플러그인 ("suggested plugins"으로 설치했으면 설치되어 있다고 한다)

 

공식 문서에 Declarative Pipeline로 많이 작성되어 있는 것 같아서 Declarative Pipeline으로 진행했다.

 

 

파이프라인 생성

Dashboard > 새로운 Item > Pipeline 선택 후 OK를 누르고

Pipeline 부분을 먼저 작성했다. (이 파이프라인 코드 아마 안돼서 scm인가 그걸로 했다ㅠ)

pipeline {
    agent any
    
    stages {
        stage('Git Clone') {
          steps {
            echo 'Clone'
            git url: 'git@github.com:이름/레포명.git',
              branch: 'clone할 브랜치 명',
              credentialsId: 'jenkins-github' // 해당 레포와 연동된 credentails
            }
            post {
                success { 
                   echo 'Success'
                }
               	failure {
                   error 'Fail'
                }
            }
        }
    }
}

이렇게 작성하면, EC2인스턴스에 var/lib/jenkins/workspace/만든파이프라인 에 들어가보면 복사가 된 것을 확인할 수 있다.

깃 url을 ssh로 안하고 https로 쓰면 에러가 난다ㅠ

 

 

플러그인에서 도커 파이프라인 설치

젠킨스 관리 > 플러그인 관리 > Docker, Docker Pipeline을 설치한다.

 

Docker Hub도 Credentail을 등록해 주어야 한다.

username-password로, username은 docker hub id, password는 dockerhub 비밀번호, Id는 credential id 가 된다.

 

도커 권한을 젠킨스에게 주기 위해 아래의 명령어를 실행 후

sudo usermod -a -G docker jenkins

sudo systemctl restart jenkins

로 재부팅

 

파이프라인 코드

pipeline {
    agent any
    
    environment {
        registryCredential = 'credential id'
    }
    
    stages {
        // git에서 repository clone
        stage('Prepare') {
            steps {
                checkout scm
            }
            post {
                success { 
                   echo 'Successfully Cloned Repository'
                }
               	failure {
                   error 'This pipeline stops here...'
                }
            }
        }
                
        stage('Bulid Docker') {
          agent any
          steps {
            echo 'Bulid Docker'
            script {
                sh 'sudo docker build --tag 도커이미지이름:태그 .'
            }
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }

        stage('Push Docker') {
          agent any
          steps {
            echo 'Push Docker'
            script {
                sh 'sudo docker push 도커이미지이름:태그'
            }
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
        }

        stage('SSH new-dd-env SERVER EC2') {
          steps {
            echo 'SSH'
            
            sshagent(['jenkins-ssh']) {
                sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker pull 도커이미지이름:태그'"
                sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker run --name 컨테이너명 -d -p 3000:3000 도커이미지이름:태그'"
                sh "exit"
            }
          }
          post {
            failure {
              error 'This pipeline stops here...'
            }
          }
       }
        
    }
}

 

원인은 정확히 모르겠는데 도커 빌드가 sudo로 하지 않으면 yarn build에서 막혀서 진행이 안되는 에러가 있었다.
그래서 sh sudo docker build 로 변경해주었는데 아래와 같은 에러가 발생했다.

해결방법은 아래와 같다

$ sudo visudo
## Now add the below lines in your sudoers file :
jenkins ALL=(ALL) NOPASSWD: ALL

$service jenkins start

 

ssh agent plugin 설치

https://royleej9.tistory.com/m/entry/Jenkins-SSH-%EC%82%AC%EC%9A%A9-pipeline-SSH-Agent

 

** server EC2 인스턴스 패스워드 설정 에러

https://velog.io/@dldydrhkd/Permission-denied-publickeygssapi-keyexgssapi-with-mic


$ sudo passwd ec2-user

Changing password for user ec2-user.New password:

 

Retype new password:

 

출처: https://ryumso86.tistory.com/26 [렴소네 블로그:티스토리]

 

ssh agent plugin을 사용하여 접속할 때, password를 입력해주어야 했는데, shell script에서 password를 자동으로 입력하기 위해

sshpass라는 것을 사용했다.

설치는 이 링크에 나와있는 방법을 참고하여 아래의 명령어로 설치를 했다.  https://stackoverflow.com/questions/21569003/installing-sshpass-on-amazon-linux-ami-based-ec2-instance

 

sudo amazon-linux-extras install epel -y
sudo yum-config-manager --enable epel
sudo yum install sshpass

이러한 방식으로 사용하면 된다.

sshpass -p 비번 ssh ec2-user@xx.xxx.xx.x(=ip주소)

파이프라인으로 테스트를 해볼 수 있는데 파이프라인 스크립트는 다음과 같다

 pipeline {
    agent any
    stages { 
        stage('SSH SERVER EC2') {
          steps {
            echo 'SSH'
            
            sshagent(['jenkins-ssh']) {
                sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'whoami'"
            }
          }
       }
    }
}

 

 

++ 추가로

Blue Ocean UI로 진행해보고 싶어서 Blue Ocean UI를 설치해 보았는데 jenkinsfile이 없는 경우에 스텝하나 만들고 커밋하는 과정에서 에러 나서 그냥 Classic UI 에서 파이프라인을 만들었다. Classic UI로 파이프라인 만들고 나중에 뭔가 추가하거나 정돈된 UI로 보고 싶을 때 Blue Ocean을 사용해야겠다ㅠㅠ

 

Blue Ocean 설치

플러그인 매니저 > blue ocean 검색 > Blue Ocean 선택 후 설치

나머지 리스트들은 굳이 다운로드 할 필요가 없다고 한다.

 

🌟도커 허브에서 Jenkins를 사용하는 경우에는 Blue Ocean이 제공되지 않는 것 같다.

 

Blue Ocean으로 젠킨스 실행하기

 

출처: 젠킨스 공식홈페이지

 

1. 위의 버튼을 눌러서 전환하거나

2. 젠킨스 서버 url/blue로 접근하면 된다.

 

Blue Ocean Navigation Bar

  • Jenkins: Dashboard로 이동
  • Pipeline: Dashboard로 이동. 만약 이미 Dashboard에 있다면, 페이지를 리로드한다. Pipeline run details페이지와는 다름
  • Administration: Classic UI의 Manage Jenkins 페이지로 이동
  • Go to classic icon: Classic UI로 전환

 

Creating a Pipline

블루 오션은 젠킨스에서 파이프라인을 쉽게 만들 수 있게 해준다고 한다.

파이프라인은 source control에 존재하는 젠킨스 파일로부터 만들어지거나, 블루 오션 파이프라인 에디터로 새로운 파이프라인으르 만들 수 있다고 한다.

 

Setting up your Pipeline project

블루오션 대시보드에서 New Pipeline버튼을 클릭한다.

아직 생성한 파이프라인이 없다면 Welcome to Jenkins라는 창이 뜨면서 Create a new Pipeline 버튼이 나올 수 있으니 그걸 클릭하면 된다고 한다.

 

파이프라인 프로젝트를 만드는 방법은 세가지가 있는데

1. Standard Git Repository

2. repository on GitHub or GitHub Enterprise

3. repository on Bitbucket Cloud or Bitbucket Server

 

나의 경우 GitHub이기 때문에 GitHub로 진행하였다.

내 깃헙에서 access token 생성 후 Repository를 선택한다.

 

++ 구축 후기

서버 비용 때문에 이렇게 구현했다.

 

 


Reference

[참고1]

https://l-sanghyeup.medium.com/jenkins%EC%97%90%EC%84%9C-ci-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC-%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-2%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-22bf0fb1e608

 

[참고2]

https://kanoos-stu.tistory.com/55

 

[참고3]

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_sshpass_%EC%82%AC%EC%9A%A9%EB%B2%95

 

 

 

 

 

728x90
728x90
이전 포스팅에서 CI/CD에 대해 조사해 보았고, Jenkins로 CI/CD를 구축하기로 했다.
많은 검색과 삽질을 통해 한 챕터를 마무리할 수 있었다
진행했던 과정을 정리하는 느낌으로 글을 작성하려 한다.

 

 

Reference 블로그들과 여러 검색 자료를 참고하여 구축해 보았다.

블로그 글을 참고하여 과정을 그림으로 표현해보았는데 다음과 같다.

 

Jenkins가 용량이 커서 젠킨스 전용 서버로 따로 설치해야 한다는 글을 어디서 읽은 것 같은데..

찾아보니, AWS 홈페이지에 젠킨스를 설치할 때, 다음과 같은 방식으로 진행하는 것을 확인할 수 있었다. [참고2]

 


AWS Jenkins 설치

1. EC2 인스턴스 추가로 생성

(설치 방법: https://mean-ji.tistory.com/55)

 

[참고 1] 블로그는 apt 명령어로 jenkins를 설치한 것을 보니 우분투 기반으로 EC2를 설치한 것 같다.

나의 경우, Amazon Linux 2를 설치했기 때문에 [참고 3] 블로그를 보고 젠킨스를 설치했다.

 

인스턴스 생성 후, yum 패키지를 최신 버전으로 업데이트해주고 java 8을 설치한다.

 

 

2. EC2에 접속 후, yum의 젠킨스 설치 경로인 jenkins repository를 추가

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

 

 

3. 젠킨스를 설치할 때, 파일들이 신뢰할 수 있는 소스로부터 제공되었다는 것을 증명하기 위한 local GPG 키링에 Jenkins GPG Key를 추가

sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

 

 

4. 젠킨스 설치

sudo yum install jenkins

 

 

5. 젠킨스를 git에 연동하여 사용하므로 git도 설치

sudo yum install git

 

 

6. 젠킨스 시작

sudo systemctl jenkins start

 

 

7. 젠킨스 실행 확인

sudo systemctl status jenkins

 

명령어를 입력해 보면 다음과 같이 젠킨스가 실행되고 있음을 확인할 수 있다.

 

 

8. [선택사항] 젠킨스 서비스가 시스템 부팅 시 함께 실행될 수 있도록

비용 문제로 인스턴스를 계속 틀어놓을 수 없을 때는 인스턴스를 종료하고 다시 시작해야 하는데, 다시 시작했을 때 아래의 명령어를 입력해 놓으면 자동으로 젠킨스도 함께 실행이 된다.

sudo systemctl enable jenkins

 

 

 

AWS Jenkins 접속

1. http://퍼블릭 IPv4 주소:8080으로 접속

(한 10분 정도 http://퍼블릭 IPv4 주소/8080 이렇게 접속하고서, 접속 안되네...? 했던 제 자신... 반성해야겠다..)

다음과 같은 화면을 볼 수 있는데, 이는 /var/lib/jenkins/secrets/initialAdminPassword 에서 암호를 확인하고 입력하라는 내용이다.

 

 

2. sudo cat /var/lib/jenkins/secrets/initialAdminPassword를 입력 후 암호 입력

암호를 입력하면 다음과 같은 화면이 나타난다.

다음 화면처럼 설치가 진행된다. (살짝 시간 걸려서 딴짓할 수 있다ㅎㅎ)

 

 

3. 계정 생성

 

계정 생성을 완료하면 다음과 같이 대시보드 화면이 나타난다.

 


Jenkins와 Github 연동

1. 젠킨스에서 깃헙 프로젝트를 접근하기 위해 ssh키를 생성

sudo mkdir /var/lib/jenkins/.ssh
sudo ssh-keygen -t rsa -f /var/lib/jenkins/.ssh/키이름

 

 

2. 젠킨스를 사용할 깃헙 프로젝트 > Settings > Deploy keys > Add deploy key

key 확인 방법

cd /var/lib/jenkins/.ssh
cat 키이름.pub

이 키를 복붙 하면 된다.

 

 

3. Jenkins Credential 등록

깃헙에 해당 프로젝트를 연동하기 위해 프라이빗 키를 젠킨스 크레덴셜로 등록해야 한다.

 

젠킨스 대시보드 > Jenkins 관리 > Manage Credentials

global에서 add credentials로 크레덴셜을 추가한다.

 

SSH Username with private key로 선택한 후, ID, Description, Username을 작성한다.

(저는 id, username 모두 jenkins-github로 설정했습니다.)

Enter directly를 체크하고 Add를 누른 후, EC2에서 'sudo cat 키 이름'으로 프라이빗 키를 확인 후 복붙 한다. 

 

 

아래의 형식의 키를 입력해야 한다.
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Create를 누르고 생성을 완료한다.

 

 


여기서부터는 따라 하면서 공부하는 정도로 보시면 좋을 것 같습니다 :)
저는 Freestyle Project를 만들어 보면서 젠킨스에 대해 조금 더 공부해 보았고
실제로 사용한 건(파이프라인을 이용한 도커 이미지 배포) 다음 포스팅에 작성해 두었습니다😀

 

 

Jenkins, 배포 서버 SSH 연결

public over ssh는 2022.1.12 부로 중단되었다고 한다.

다른 방법으로 배포 서버와 연결해 주어야 할 것 같다

(ssh agent를 사용, 자세한 내용은 다음 포스팅에 작성되어 있다)

 

Jenkins서버에 도커 설치

1. sudo yum install docker로 도커를 설치한다.

2. sudo systemctl start docker로 도커를 실행한다.

8. sudo docker login

 

Jenkins Item 생성

1. item 생성

Jenkins 대시보드 > 새로운 item > Freestyle project

 

 

GitHub Project를 선택한 뒤 소스코드 관리를 Git으로 선택한다.

 

 

 

URL을 적어주고, Credentials는 아까 생성한 Credential을 선택해줍니다.

 

 

 

깃 레파지토리 적을 때, "new accept" 에러가 난다면 git client plugin에러일 가능성이 있다.
글 작성 당시 기준으로, 이 플러그인 버전이 3.11.1은 해당 에러가 난다고 한다.
플러그인을 3.11.0으로 설치한 다음에 다시 연결해보면 잘 된다 :) [참고5]

 

 

Jenkins Github Webhook설정

Github Repository > Settings > Webhook > add webhook에 들어간 뒤

1. Payload URL을 http://젠킨스 url:포트/github-webhook/으로 작성한다.

맨뒤에 /를 붙여야 한다. 안 붙이면 302 에러 발생

 

2. Content type을 application/json으로 설정한다.

해당 레파지토리에서 푸시가 일어나면 웹 훅이 젠킨스를 호출한다!

 

끝!

 


 

AWS에서 Jenkins로 CI/CD 구축해 보았는데, 온프레미스에서는 젠킨스를 어떻게 사용할지도 궁금해서 찾아보니

아래 링크에 잘 정리가 되어있어서 읽어 보았다

https://ontheterrace.tistory.com/entry/GitLAB%EA%B3%BC-Jenkins-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

 

온프레미스 GitLAB과 Jenkins 설치 및 연동하기 (1)

CICD는 관련 솔루션이 많고 구성하기 나름이라 딱히 어떤 구성을 권장 할수는 없는데 이는 회사마다의 규모, 개발조직, 개발자 수, 개발문화, 관련 프로세스, 기술스택 등이 모두 다르기 때문이다

ontheterrace.tistory.com

 

 


Reference

 

[참고1]

https://velog.io/@haeny01/AWS-Jenkins%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Docker-x-SpringBoot-CICD-%EA%B5%AC%EC%B6%95

 

[참고2]

https://aws.amazon.com/ko/getting-started/hands-on/setup-jenkins-build-server/

 

[참고3]

https://blog.illunex.com/201207-2/

 

[참고4]

https://jjeongil.tistory.com/1366

 

[참고5]

https://issues.jenkins.io/projects/JENKINS/issues/JENKINS-69149?filter=allopenissues 

 

 

 

 

728x90
728x90
EC2에 NGINX를 설치해서 Reverse Proxy로 사용하도록 설정하는 과정과
AWS EC2를 생성한 뒤, 도커를 설치하고 도커 이미지를 컨테이너에 실행하는 과정에 대한 기록

 

 

 

EC2에 NGINX설치하기

amazon-linux를 사용하고 있기 때문에, amazon-linux ec2는 NGINX를 아래의 명령어로 입력해서 설치해야 한다.

sudo amazon-linux-extras install nginx1

 

 

// nginx 시작
sudo systemctl start nginx 

// nginx.conf 같은 설정 파일을 변경해 주었을 때, 재시작
sudo systemctl restart nginx

// nginx 상태 확인
sudo systemctl status nginx

 

 

nginx.conf를 따로 변경하지 않았기 때문에 기본 80으로 접속하면 root의 index.html로 연결된다.

nginx를 시작하고 netstat -an | grep 80으로 80포트가 listen을 하고 있는지 확인한다.

 

 

 

EC2 인스턴스의 퍼블릭 IPv4 DNS로 접속하면 다음과 같은 화면을 볼 수 있다.

주소를 복사 붙여넣기 하거나 http로 접속해야 한다.

개방 주소법을 클릭하게 되면 https가 앞에 붙기 때문에 '연결을 거부했습니다' 가 나온다.

 

 

 

 

EC2 '/' 위치에서 /etc/nginx/nginx.conf를 다음과 같이 수정한다.

server {
	listen         80;
	server_name    _;


	location / {
		proxy_set_header    Host                    $host;
		proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;

		proxy_pass          http://127.0.0.1:3000;
	}
}

 

 

 

EC2에 Docker 이미지 올리기

[참고1] 사이트에 그림이 잘 되어 있어서 간략하게 따라 그려 보았다.

그림의 과정을 말로 설명하면 아래와 같다.

 

1. 프로젝트(nuxt.js)를 도커 이미지로 만들어서 도커 허브에 푸시한 다음,

2. EC2에서 도커허브에 있는 도커 이미지를 pull 한다.

3. 이미지를 실행시켜서 프로젝트를 실행한다.

 

 

 

도커 이미지로 만들기

(로컬 환경에 도커를 설치한 뒤 프로젝트를 도커 이미지로 만들어 두었기 때문에 해당 과정에 대한 정리는 생략)

이 사이트를 참고하여 도커를 공부하고, 프로젝트를 이미지로 만들었다😀 https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

 

 

도커 허브에 푸시하기

도커 허브에서 (https://hub.docker.com/) Create Repository를 한다.

해당 프로젝트에서 다음의 명령어로 레파지토리에 푸시한다.

docker push 아이디/레파지토리 이름:tagname

이때, 로컬에서 만든 도커 이미지명과 레파지토리 명이 같아야 푸시가 된다.

(아이디/레파지토리 이름:tagname 이 형식이 같아야 하나봐요 이렇게 안 하니 에러가 나더라구요. 저도 정확한 건 아니니 아시는 분께서 댓글 달아주시면 매우매우 감사할 것 같아요😀👍)

 

 

푸시하게 되면 아래처럼 Tags and Scans에 새로 태그가 추가된다.

 

 

 

EC2에 도커 설치하기

ssh로 EC2에 접속한 뒤 아래의 과정을 실행한다.

// 도커 설치
sudo yum install docker

// 도커 실행
sudo systemctl start docker

// 도커 이미지 pull
sudo docker pull (docker_ID)/(project_name)

// 도커 컨테이너 실행
sudo docker run --name (name) -d -p 3000:3000 (docker_ID)/(project_name)

 

 

이제 EC2 인스턴스의 퍼블릭 IPv4 DNS로 접속하면 다음과 같은 화면을 볼 수 있다 :)

 

 

 


Reference

[참고1]

https://zzang9ha.tistory.com/360

728x90

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

[AWS] Jenkins CI/CD 구축하기_(2)  (0) 2022.08.25
[AWS] Jenkins CI/CD 구축하기_(1)  (0) 2022.08.25
[AWS] EC2 생성 및 접속  (0) 2022.08.25
[AWS] EC2 리눅스 배포판 선택  (0) 2022.08.25
DevOps 팀의 Phase1 기록  (0) 2022.08.25
728x90

AWS EC2 생성

1. EC2 > 인스턴스 > 인스턴스 시작을 선택 (Region을 서울로 선택 후)

2. AMI는 아마존 리눅스를 선택 (선택하기 전 조사 과정은 이전 포스팅에 기록)

인스턴스 유형은 프리티어 사용가능인 t2.micro로 선택했고, 키 페어를 생성했다.

 

 

 

나머지 세팅은 그대로 두었고, 인스턴스 시작

 

 

3. 인스턴스 생성 시, 인스턴스를 중지하고 다시 시작할 때, 두 경우 모두 새 IP가 할당된다고 한다.

매번 접속해야하는 IP가 변경되면 번거로우므로 인스턴스의 IP가 변경되지 않고 고정 IP를 가지게 해야하는데,

이는 탄력적 IP 주소 할당을 하면 된다.

 

EC2 > 네트워크 및 보안 > 탄력적 IP 메뉴를 선택한 뒤 탄력적 IP주소할당을 선택하고, 탄력적 IP를 하나 생성한다.

** 이때 탄력적 IP는 기본 다섯 개까지 설정이 가능한데, 더 생성이 안 된다는 에러가 나는 경우 https://www.lesstif.com/cloud/aws-eip-elastic-ip-address-limit-100205401.html 이 링크를 보고 개수를 늘리면 된다. (aws 고객센터에 문의해서 늘려달라는 요청을 하면 빠르게 늘려준다)

 

탄력적 IP를 생성하고 해당 탄력적 IP선택 후 작업 > 탄력적 IP 주소 연결을 선택한다.

아까 생성한 EC2 인스턴스를 연결해주면 다음과 같이 연결된 화면을 볼 수 있다.

 

 

 

AWS EC2 접속

해당 EC2에 접속 > 연결 탭에 들어간 후, SSH 클라이언트 탭을 선택하면 다음과 같은 화면이 나온다

 

(mac os 기준) 터미널 > .pem이 있는 경로로 이동 후, ssh -i "~~"를 입력한다.

 

이 때 다음과 같은 에러가 나올 수 있는데, chmod 400 키이름.pem 을 입력하고 다시 ssh -i ~를 입력하면 된다.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE! 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '키이름.pem' are too open.
It is required that your private key files are NOT accessible by others.

 

EC2에 접속이 완료되었고, sudo yum update를 한다.

 

java 설치

java 설치 가능한 버전 두가지를 확인

yum list java*jdk-devel

1.8 설치

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

설치 확인

 

java -version

 

 

타임존 변경

sudo rm /etc/localtime

sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

date	// 변경이 잘 되었는지 확인

 

 

 

hostname 설정

ec2-user@ip~~라고 나오는 부분을 설정하는 것.

접속했을 때, 어느 서비스의 서버인지 알 수 있기 때문에 hostname을 변경하면 보기 편하다.

 

1. hostname 변경

sudo hostnamectl set-hostname [변경할이름]

2. 변경된 이름 확인

cat /etc/hostname

3. 인스턴스 재부팅

sudo reboot

 

pem키 ~/.ssh 로 복사하기

매번 ssh -i ~~~ 이 부분을 입력하려니 귀찮아서 쉽게 접속할 수 있도록 설정했다.

pem 파일을 ~/.ssh/로 복사하면 ssh 실행시 pem 키 파일을 자동으로 읽어 접속한다.

 

cp 키이름.pem ~/.ssh/
cd ~/.ssh/
ls -al | grep 키이름
chmod 600 ~/.ssh/키이름.pem

 

config 파일 생성 및 권한 설정

권한 변경후 config파일을 생성해서 host등록을 한다.

 

vi ~/.ssh/config
Host 원하는이름
    HostName 탄력적IP주소
    User ec2-user
    IdentityFile ~/.ssh/키이름.pem
chmod 700 ~/.ssh/config

 

이제 아무 위치에서 ssh 원하는이름 을 입력하면 EC2에 접속이 가능하다 :)

 


Reference

 

[참고1]

https://loosie.tistory.com/407

728x90
728x90

EC2 리눅스 배포판 선택에 앞서, 어떤 걸 선택하면 좋을지 먼저 조사 후 작업을 진행해보려 한다.

Reference에 적혀있는데 테코블 블로그에 정리가 잘 되어있어서 적어보며 공부해 보았다.

 

 

리눅스란?

먼저 리눅스는 커널이라는 운영체제의 일종

운영체제는 컴퓨터 시스템 중앙에서 시스템을 구성하는 자원들을 관리하며 시스템을 작동시키는 구성요소라고 한다.

(Windows, MacOS 등)

 

운영체제는 CPU와 같은 자원 사용을 효율적으로 사용할 수 있게 도와주는 역할도 하고 있다.

커널이 바로 이런 역할을 하는데 메모리 위에 항상 상주하며 작동한다.

커널은 운영체제의 역할 중에서 프로그램들과 하드웨어 사이를 소통, 제어해주는 역할을 한다.

운영체제를 위한 커널에도 여러 종류가 있는데, 이 중 리눅스라는 커널을 선택하는 운영체제들이 있다.

➡️ 이를 통상적으로 운영체제로서의 리눅스라고 부른다고 한다.

 

하지만, 리눅스 커널만으로는 운영체제의 역할을 해낼 수 없기 때문에 이를 해결하기 위해 만든 GNU와 함께 사용하며,

GNU/Linux 라는 형태로 사용하게 된다. 실제로 운영체제로서 리눅스라고 부르는 것은 단순한 커널뿐만 아니라 여러 프로그램을 묶어서

배포하는 GNU/Linux에서 기능이 추가된 것이라고 볼 수 있다. 

** GNU란 자유 소프트웨어에서 만든 프로젝트

 

리눅스 커널은 서버에서 많이 선택되는 Ubuntu, CentOS, RHEL(Red Hat Enterprice Linux) 뿐만 아니라 Android도 리눅스 커널을 채택하여 사용하고 있다.

 

리눅스 배포판

운영체제는 커널 이외의 다른 부분도 존재한다.

단순히 위에서 지칭한 리눅스는 사용자들이 많이 사용하는 Windows, MacOS 정도의 편의성에서는 못미치는 상태이다. 

Ubuntu Server나 RHEL에서 제공하는 서버 관련 low level의 기능들조차 제공해주지 못한다.

 

순수하게 리눅스 커널 자체만 사용하는 것이 아닌 커널과 함게 해당 운영체제 목적에 맞는 여러 프로그램을 패키징하여 제공하는 것을 배포판이라고 한다. AWS의 운영체제 선택 창에서 보았던 Window Server를 제외한 많은 운영체제가 리눅스 커널을 사용하되, 목적에 따라 다양한 프로그램들을 함께 제공하는 배포판의 종류들이다.

 

배포판에 따라 서버 운영에 특화된 것, 일반 사용자에게 특화된 것, IoT와 같은 소형 장치들에 특화된 것들이 나뉘어서 제공된다. 

 

apt와 yum

각각의 배포판에서는 운영체제 및 프로그램을 쉽게 관리할 수 있도록 저장소를 운영하고 있다. 저장소 및 저장소를 통해 설치된 프로그램의 버전 및 의존성을 관리해주는 패키지 매니저에 접근하는 명령어들은 배포판마다 각각 다르다. Ubuntu는 Debian 계열에 기반을 두어 apt명령어를 사용하고, Centos는 Fedora 계열에 기반을 두어 yum 명령어를 통해 각각의 리눅스 배포판의 저장소에 접근하여 해당 저장소 정보를 받아오게 된다. 

 

CentOS, Fedora, RHEL차이

레드햇 계열 --> Fedora, RHEL, Centos

Fedora --> 레드햇이 후원하고 개발 공동체에 의해 진행되는 Linux 배포판이다. 새로운 기술과 SW를 실험하고 선도하는 것을 주요 목적으로 한다. 페도라의 주요 특징 중 하나는 보안을 중요시하고 이에 많은 투자를 한다는 점이라고 한다. 

 

RHEL --> 레드햇 사가 개발하는 상업용 리눅스 배포판, 기업 환경에 맞게 안정성과 성능, 보안성을 최우선 목적으로 하고 있고, 철저하게 검증된 기능과 패키지만 배포본에 포함시킨다고 한다. 페도라 리눅스 배포판을 기반으로 하여 검증되고 안정화된 코드를 채택하여 개발된다. RHEL의 안정성은 유명하여 Oracle사의 Linux인 Oracle Linux도 RHEL을 기반으로 하고 있으며, 아마존 웹서비스에 사용되는 Amazon Linux AMI등에서도 사용되고 있다. (Amazon Linux 2022는 페도라에 기반한다는 기사가 있던데 이 부분은 잘 모르겠다)

 

CentOS --> RHEL의 소스를 가져와서 레드햇의 브랜드 로고를 제거하고 컴파일하여 만드는 배포본. RHEL의 소스를 거의 수정 없이 사용. 무료로 사용가능. 웹서버로 인기가 높으며, 업무의 중요도에 따라 RHEL과 혼용하여 사용 가능하다. 웹서버는 CentOS, WAS와 DBMS는 RHEL의 조합으로 사용 가능하다.

 

 

 

 

 

그래서 어떤 배포판을 선택하면 좋을까..?

Amazon Linux 2 가 CentOS와 별반 차이가 없고 아마존 사용할 거라면 아마존 리눅스 버전을 사용하라는 추천의 글을 하나 찾았다. [참고2]

클라우드 환경과 Docker 컨테이너에 최적화되어있고, 최신 Centos나 Ubuntu처럼 systemd 기반으로 서비스를 관리하게 되어있다고 한다 [참고3]

 

일단 Amazon Linux 2를 사용해 보아야겠다는 결론을 내리면서 글을 마무리.

 


Reference

 

[참고1]

https://tecoble.techcourse.co.kr/post/2021-09-13-linux-distribution/

[참고2]

https://www.pabburi.co.kr/content/linux_server/amazon-linux-2-%EC%82%AC%EC%9A%A9%ED%9B%84%EA%B8%B0/

[참고3]

https://www.lesstif.com/lpt/amazon-linux-2-ami-php-python-ruby-51283065.html

[참고4]

https://dejavuhyo.github.io/posts/linux-centos/

728x90

+ Recent posts