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
모든 파이프라인이 이 세 단계를 포함하는 건 아니지만 대부분의 프로젝트에서 세 단계가 포함되면 좋다.
파일을 만들 때 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'
}
}
}
}
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
깃 레파지토리 적을 때, "new accept" 에러가 난다면 git client plugin에러일 가능성이 있다. 글 작성 당시 기준으로, 이 플러그인 버전이 3.11.1은 해당 에러가 난다고 한다. 플러그인을 3.11.0으로 설치한 다음에 다시 연결해보면 잘 된다 :) [참고5]
Jenkins Github Webhook설정
Github Repository > Settings > Webhook > add webhook에 들어간 뒤
탄력적 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 리눅스 배포판 선택에 앞서, 어떤 걸 선택하면 좋을지 먼저 조사 후 작업을 진행해보려 한다.
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]