반응형

jenkins를 이용해서 배포를 자동화해보겠습니다.

깃허브에 push를 하거나, 로컬에 설치해 둔 jenkins에서 빌드를 하면 자동으로 깃허브의 소스코드로 배포를 진행할 것입니다.

먼저 docker를 이용해 jenkins를 설치하겠습니다.

$ docker pull jenkins/jenkins:jdk11

jdk11로 이미지를 가져왔습니다.

 

$ docker run -d -p 8090:8080 -v /jenkins:/var/jenkins_home --name myjenkins -u root jenkins/jenkins:jdk11

-p : jenkins 컨테이너의 8080 포트를 로컬의 8090 포트와 매핑시킵니다.

-v : 컨테이너의 /var/jenkins_home을 로컬의 /jenkins 디렉토리와 공유합니다.

--name : 컨테이너에 myjenkins라는 이름을 주었습니다.

-u : root 권한을 줍니다.

 

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                               NAMES
793d4b0e2ca0        jenkins/jenkins:jdk11   "/sbin/tini -- /usr/…"   8 seconds ago       Up 6 seconds        50000/tcp, 0.0.0.0:8090->8080/tcp   myjenkins

컨테이너가 잘 실행되고 있습니다.

브라우저를 열어서 해당 컨테이너의 포트 번호로 접속해보겠습니다.

jenkins image

해당 경로에 저장된 비밀번호를 입력하면 됩니다.

 

$ docker exec -it myjenkins /bin/bash
root@793d4b0e2ca0:/# cat /var/jenkins_home/secrets/initialAdminPassword
becb482c05774f58b91ed8d1cc6c5b1e

컨테이너에 접속해서 비밀번호를 확인하고, 빈 칸에 입력해줍니다.

접속되면, 기본 설치를 마치고 jenkins 관리자 계정을 입력합니다.

계정 입력을 스킵하면 아이디는 admin, 비밀번호는 initialAdminPassword로 유지됩니다.

 

 

jenkins image

접속 화면입니다.

SSH로 서버에 접속하고 전송할 수 있도록 설정부터 해두겠습니다.

좌측 메뉴의 jenkins 관리 -> 플러그인 관리로 들어갑니다.

jenkins image

설치 가능 탭에서 public over ssh를 찾아서 설치해준 뒤에, jenkins를 재시작해줍니다.

재시작되었으면, 이제 초기화면으로 돌아가서 jenkins 관리 -> 시스템 설정으로 들어갑니다.

jenkins image

아래로 내려오면, 위와 같은 메뉴가 있을 것입니다.

Key에다가 서버에 접속할 수 있는 private key를 입력해줍니다.

***

여기에서 저는 GCP를 이용하기 때문에, 별도의 ssh키를 생성해야했습니다.

$ ssh-keygen -t rsa -f ~/.ssh/testkey  -C "gmlwo308@gmail.com" -m 'PEM'

터미널에 다음과 같이 입력합니다.

-m 옵션 없이 그냥 만들면, 첫줄에 open ssh private key로 만들어지는데,

jenkins에서 invalid format 오류가 떠서 해당 옵션을 넣어주었습니다.

그러면 첫줄에 private key라고 만들어지는데, 뭐가 문제인지는 정확히 모르겠습니다.

GCP에 접속하셔서 메타데이터에 public key를 입력하시면 ssh로 서버 인스턴스에 접속할 수 있습니다.

***

 

 

jenkins image

name에는 해당 ssh server를 식별할 수 있는 이름을 적어주면 됩니다.

hostname은 서버의 ip주소, username은 서버의 사용자명, remote directory에는 서버에서 사용할 디렉토리를 설정하면 됩니다.

이제 다시 초기화면으로 돌아가서 new item을 눌러줍니다.

jenkins image

item name을 입력하고, Freestyle project를 선택하고 OK를 눌러줍니다.

jenkins image

General 탭에는 깃허브 프로젝트를 체크하고, 프로젝트 url을 입력해줍니다.

jenkins image

소스 코드 관리 탭에서도 Git을 선택해서 Repository URL을 클릭해줍니다.

Credentials에서는 Add버튼을 눌러서 계정을 추가해줍니다.

jenkins image

깃허브 아이디와 비밀번호를 입력해주신 뒤에, Add 버튼을 누르고 해당 계정을 선택해주시면 됩니다.

jenkins image

빌드할 branch를 지정하시면됩니다.

저는 deploy branch를 따로 만들었지만, 별도로 만들지 않았다면 기존 설정 */master를 그대로 사용하시면 됩니다.

jenkins image

다음은 빌드 유발 탭입니다. Github hook trigger for GITScm polling을 선택합니다.

깃허브에서 webhook을 지정하면, 푸시가 들어올 때 빌드를 하게 될 것입니다.

jenkins image

다음은 Build 탭입니다. Add build step을 눌러서 Invoke Gradle script를 선택해줍니다.

Make gradlew executable을 체크해줍니다.

${workspace}는 현재 생성한 해당 아이템의 경로입니다.

Tasks에는 빌드 명령어를 입력해주면 됩니다.

저는 clean과 bootJar를 입력하였습니다.

jenkins image

이어서 Add build step을 눌러서 Send files or execute command over SSH를 지정해줍니다.

SSH server의 Name은 위에서 만들었던 이름을 선택해줍니다.

Transfers에는 상대경로로 입력해야합니다.

위 시스템 설정에서 만들었던 Remote directory를 기준으로 경로를 잡으시면 됩니다.

source files에는 전송할 파일을 입력합니다.

remove prefix는 전송한 파일을 저장할 때, source files에 입력한 파일의 접두 경로를 제거할 수 있습니다.

Remote directory는 파일이 저장될 경로를 입력해줍니다.

Exec command는 실행할 명령어를 입력하시면 됩니다.

저는 shell script를 실행하게 했습니다.

Exec command의 기준 경로는 지금 여기에서 입력한 Remote directory가 아니라, 위 시스템 설정에서 만들었던 Remote directory입니다.

입력을 다 했으면 저장해줍니다.

 

 

 

#!/bin/bash

echo "script start.."

main_container="test"
path="jenkins/docker-compose.yml"


if [ -z `docker-compose -f $path ps -q $main_container` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose -f $path ps -q $main_container)` ]; then
        echo "container is not running."
        docker-compose -f $path up --build -d
else
        echo "container is running. restart only $main_container, redis"
        docker-compose -f $path stop $main_container redis
        echo "wait 3 seconds..."
        sleep 3
        echo "container remove..."
        docker-compose -f $path rm -f $main_container redis
        echo "container build.."
        docker-compose -f $path up --build -d

        echo "remove all docker caches"
        sudo docker system prune --all -f
fi

echo "restart completed"

다음은 임의로 작성한 docker-compose를 시작하기 위한 스크립트 파일입니다.

처음 작성해보는거라 잘 몰라서 제대로 작성한지는 잘 모르겠습니다..

docker-compose로 redis, mysql, test 컨테이너를 실행하는데,

이미 실행 중이라면 redis와 test만 다시 빌드하여 재시작하고, 그렇지 않다면 모든 컨테이너를 빌드하여 시작해주었습니다.

jenkins image

이제 저장된 아이템으로 들어와서 Build Now를 눌러줍니다.

jenkins image

Build history에서 새로이 올라온 내역을 누르고, console output을 보면 실행되고 있는 것을 확인할 수 있습니다.

 

BUILD SUCCESSFUL in 1m 56s
8 actionable tasks: 8 executed
Build step 'Invoke Gradle script' changed build result to SUCCESS
SSH: Connecting from host [2127473ce237]
SSH: Connecting with configuration [...] ...
SSH: EXEC: completed after 24,368 ms
SSH: Disconnecting configuration [...] ...
SSH: Transferred 3 file(s)
Finished: SUCCESS

build가 잘 된 것을 확인할 수 있습니다.

서버에도 잘 배포가 되었는지 확인해보겠습니다.

$ ssh -i ./priv-key gmlwo308@IP-address
$ docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                               NAMES
564ef5e86910   test                          "java -Dspring.profi…"   29 seconds ago   Up 27 seconds   0.0.0.0:8080->8080/tcp              test_test_1
76f7ad5b0c9c   redis                         "docker-entrypoint.s…"   29 seconds ago   Up 28 seconds   0.0.0.0:6379->6379/tcp              test_redis_1
13fbc4fbf211   mysql                         "docker-entrypoint.s…"   15 hours ago     Up 13 hours     0.0.0.0:3306->3306/tcp, 33060/tcp   test_mysql_1

STATUS를 보면, 방금 다시 시작된 것을 확인해볼 수 있습니다.

이제 push가 되면, 자동으로 build가 될 수 있도록 해보겠습니다.

github의 해당 repository로 이동해서 settings -> Webhooks -> add webhook을 눌러줍니다.

Payload URL을 위처럼 입력해주시고, Content type을 application/json으로 변경한 뒤에 webhook을 생성합니다.

이제 푸시를 하면, 빌드가 될 것입니다.

(이 부분은 제대로 확인을 못해봤습니다)

 

 

* 예전에 처음 사용해보면서 진행했던 내용이라 부족한 점이 있을 수 있습니다.

반응형

+ Recent posts