0%

Jenkins 설치하고 빌드하기

Jenkins 설치하기

공식 image에 가보면 docker에 Jenkins를 설치하는 방법이 나와 있습니다. 하지만 저는 docker-compose를 사용해서 설치하겠습니다.

저는 nginx를 사용해서 접속 관리를 하기 때문에 8080을 expose로 노출시키지 않았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#docker-compose.yml
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
# - "8080:8080"
volumes:
- jenkins_home:/var/jenkins_home
restart: unless-stopped
expose:
- 8080
volumes:
jenkins_home:
driver: local

docker-compose.yml 파일을 만들고 docker-compose up -d jenkins로 실행하면 Jenkins가 설치됩니다.

추가 보안 설정

Jenkins에는 중요한 정보가 많이 들어가 있기 때문에 추가 보안 설정을 했습니다. nginx를 활용해 특정 ip에서만 접속할 수 있도록 설정했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#(nginx)app.conf
upstream jenkins {
server jenkins:8080;
}
server {
listen 443 ssl;
server_name jenkins.marinesnow34.com;

ssl_certificate /etc/letsencrypt/live/jenkins.marinesnow34.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jenkins.marinesnow34.com/privkey.pem;

location /github-webhook {
allow all;

proxy_pass http://jenkins/github-webhook;
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-Proto $scheme;
}

location / {
allow 140.238.xxx.xxx;
allow 217.142.xxx.xxx;

deny all;

proxy_pass http://jenkins;
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-Proto $scheme;
}
}

vpn을 끄고 접속하면 다음과 같이 접근이 불가능합니다.
no-vpn

정상적으로 설치가 됐다면 다음과 같은 화면이 나옵니다.
vpn

젠킨스 로그를 확인하면 초기 비밀번호를 확인 가능합니다.
passwd

그 다음에 추천해주는 플러그인을 설치 합니다.
plugins

어드민 계정도 설정해 주고
admin

접속 가능한 url도 알려주면
url

이제 젠킨스를 사용할 수 있습니다.
main

jenkins 설정

플러그인 설치

Manage Jenkins -> Plugins -> Available plugins에서 플러그인을 설치할 수 있습니다. 플러그인 설치 후 재시작합니다.
manage plugin

  1. publish over ssh
  2. Generic Webhook Trigger Plugin

publish over ssh 설정

Manage Jenkins -> Configure System -> Publish over SSH에서 설정합니다.

ssh-key

1
2
3
4
# ssh key 생성
## passphrase 없이 생성
ssh-keygen -t rsa -b 4096 -C "jenkins@yourdomain.com"
cat id_rsa

id_rsa내용을 복사해서 Key에 붙여넣기 합니다.

ssh
원격지 서버에서 ~/.ssh/authorized_keysid_rsa.pub내용을 붙여넣기 합니다.

1
echo "id_rsa.pub 내용" >> ~/.ssh/authorized_keys

Test Configuration을 눌러서 연결이 잘 되는지 확인합니다.

github 권한 설정

Manage Jenkins -> Credentials -> System -> Global credentials -> Add Credentials에서 github 계정을 추가합니다.

다음과 같은 창이 나올 것 입니다.
github

Github에서 Settings -> Developer settings -> Personal access tokens -> Tokens (classic) -> Generate new token을 해줍니다.

github

Build하기

이제 기본적인 설정을 마쳤습니다. 이제 New Item을 눌러서 새로운 작업을 만들어 봅니다.

pipeline을 선택하고 이름을 설정합니다.
new-item

do not allow concurrent builds를 선택하고 github project에 github 주소를 입력합니다.
general

Build Triggers에서 GitHub hook trigger for GITScm polling을 선택합니다.

Github에서 Settings -> Webhooks -> Add webhook을 눌러서 webhook을 추가합니다.
webhook

Pipeline에서 Pipeline script from SCM을 선택하고 Repository URL을 입력합니다. Credentials에서 아까 추가한 github 계정을 선택합니다.

pipeline
이제 실행할 Jenkinsfilerepository루트에 만들어 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pipeline {
agent any

stages {
stage('Checkout') {
steps {
echo 'Checking out the repository...'
checkout scm
}
}
stage('Test') {
steps {
echo 'Running tests...'
sh './gradlew test'
}
}
stage('Build') {
steps {
echo 'Building the application...'
sh 'chmod +x gradlew'
sh './gradlew clean build -x test'
}
}
}
}

확인하기

이제 모든게 끝났습니다. github에 push를 하면 자동으로 빌드가 되는 것을 확인할 수 있고, 아니면 Build Now를 눌러서 빌드를 수동으로 할 수 있습니다.

마치며

글의 호흡이 길어져 먼저 CI과정 까지만 알아보았습니다. 다음 글에서는 CD과정까지 이어서 해보겠습니다.