Jenkins로 리눅스환경에 .NET Core APP 자동 빌드/배포하기

NIMUG·2021년 4월 27일
0
post-thumbnail

시작하는 말

글을 작성하기에 앞서 아래 내용을 따라하실 때 포트에 대한 설정은 따로 설명드리지 않으니 유의하시길 바랍니다. 또한 WAS 서버 서비스 운영 환경에 대한 설정은 따로 작성하지 않고, 기본적인 설정이 되어있다는 가정하에 글을 진행합니다.


준비물

Jenkins 서버 (CentOS)
WAS 서버 (CentOS)
GitHub Repository


Web Application 만들기

우선 서버에 배포할 Web Application을 만들겠습니다.

Visual Studio 2019를 실행한 후, 새 프로젝트 만들기를 선택합니다.

웹 응용 프로그램(모델-뷰-컨트롤러)를 선택합니다.

다음을 누른 후에 나머지 부분들까지 설정하고 .NET Core MVC APP을 만들어줍니다.

Solution 화면

Kestrel 서비스 EndPoint 설정을 합니다.

appsettings.json

이렇게 빌드/배포 테스트를 위한 기본적인 MVC Application을 생성했습니다.


원격 Git Repository 연결

이제 만든 Application을 Visual Studio를 통해 GitHub에 연결하고 소스 Push까지 하겠습니다.

우측 메뉴에 Git 리포지토리 만들기를 클릭합니다.

혹시 Git 변경 내용 탭이 없다면 상단 <보기> 메뉴에서 찾아볼 수 있습니다.

이렇게 원격 Git Repository 생성과 소스 푸시까지 한번에 진행했습니다.


Jenkins서버 설정

JDK 설치

아래의 명령어를 통해 yum 저장소에 java jdk 목록을 불러옵니다.

yum list java*jdk-devel

아래의 명령어로 jdk를 설치합니다.

yum install java-1.8.0-openjdk-devel.x86_64

Jenkins 설치

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

위의 명령어들을 순차적으로 입력해 Jenkins를 설치합니다.

systemlctl start jenkins.service

위의 명령어를 통해 Jenkins를 실행할 수 있습니다.

Git 설치

아래의 명령어로 git을 설치합니다

yum install git

.NET SDK 설치

.NET Core APP 빌드를 위해 .NET SDK를 설치합니다.

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1

여기까지 설치가 되었으면 브라우저를 통해 Jenkins에 접근합니다.

Jenkins 설정

자신의 아이피 + 설정한 포트번호를 브라우저에 입력해 Jenkins에 접근합니다.

Jenkins 초기화면

화면에서 보여주는 파일을 열면 암호가 있는데 그걸 통해 접근할 수 있습니다.

vi /var/lib/jenkins/secrets/initialAdminPassword

암호를 입력하면 플러그인 설치유형을 선택할 수 있는데 여기서는 원하시는 유형을 선택해 나머지 설정을 진행합니다.

설치가 완료되면 Admin계정설정을 완료합니다.

이제 메인화면에서 새로운 Item을 클릭한 후 item 이름을 작성하고 Freestyle Project를 선택합니다.


Jenkins Plugin 설치

GitHub integration Plugin

깃허브와의 연결을 도와주는 플러그인 GitHub integration Plugin을 설치합니다.
메인화면 좌측메뉴에 Jenkins 관리를 선택합니다.

그 다음 플러그인 관리를 선택합니다.

설치가능을 클릭한 후에 GitHub integration Plugin을 검색하고 선택한후에 Install without restart 버튼을 클릭해 설치를 진행합니다.

Publish Over SSH Plugin

빌드 산출물을 원격 서버로 SSH통신을 사용해 전달하는 플러그인 Publish Over SSH Plughin을 설치합니다.


Jenkins 자동빌드

GitHub과 Jenkins 연결

GitHub에서 Settings > Developer settings > Personal access tokens로 이동합니다.

Generate new token을 클릭한 후에 repo, admin:org, admin:repo_hook 항목을 체크하고 Generate token을 클릭해 토큰을 발급받는다.

다시 Jenkins로 돌아와서 Jenkins 관리 > 시스템 설정으로 이동합니다.

Add GitHub Server를 클릭합니다.

Add > Jenkins를 선택합니다

Kind는 Secret text를 선택하고, Secret에는 발급받은 토큰, ID에는 사용자 지정 식별값을 넣고 Add버튼을 눌러 Credential을 생성한 후, 저장버튼을 눌러 Git과의 연결을 끝냅니다.

GitHub Webhook 설정

GitHub에 Push할때 Jenkins에서 Push된 소스를 빌드할 수 있게 끔 Github에서 Webhook을 생성합니다.
GitHub Repository에 Settings에서 Webhooks를 선택합니다.

Payload URL에 http://젠킨스서버IP:Port/github-webhook/ 을 입력합니다.
나머지 부분도 아래와 같이 설정한 후 Add webhook 버튼을 클릭해 Webhook을 생성합니다.

이제 GitHub과 Jenkins 연결해 자동빌드환경을 만들기 위해, 만들어둔 Item을 클릭한 후 좌측 메뉴의 구성을 선택합니다.

GitHub project를 선택한 후 Project url에 자신의 깃허브 주소를 입력합니다.

소스 코드 관리에서 Git을 선택하고, Repository URL과 Credentials를 지정합니다.
배포할 Branch도 여기서 같이 지정해줍니다.

빌드 유발탭에서 GitHub hook trigger for GITScm polling을 선택하고 저장합니다.

이제 소스를 푸시했을 때 자동으로 Jenkins가 '/var/lib/jenkins/workspace/Item이름'의 경로로 소스를 빌드하는것을 테스트할 수 있습니다.

빌드 설정

릴리즈 모드로 빌드를 하기 위해 빌드설정을 하겠습니다.
다시 Item의 구성으로 이동해서 Build탭에서 Excute Shell을 선택합니다.

그 다음 Command창에 아래의 명령어줄을 입력합니다.

dotnet restore 프로젝트명/프로젝트명.csproj
dotnet build --configuration Release 프로젝트명/프로젝트명.csproj
dotnet publish 프로젝트명/프로젝트명.csproj

저장한 후 좌측메뉴 Build Now 를 통해 빌드를 진행하면 '/var/lib/jenkins/workspace/Item이름/프로젝트명/bin/Debug/netcoreapp버전(3.1)/publish/'에 빌드 산출물이 생성된걸 확인할 수 있습니다.


Jenkins 자동배포

Publish Over SSH 설정

Jenkins 관리 > 시스템 설정으로 이동해 Publish Over SSH 설정을 합니다.

추가버튼을 클릭해 SSH Server를 추가합니다.

Name에는 서버를 구분할 별명, Hostname에는 원격서버의 IP, Username에는 원격서버에 접근할 user name, Remote Directory는 전송대상이 되는 원격서버의 디렉토리를 입력하면 됩니다.

그 후 상단 Passphrase에 암호를 입력하거나, 키를 입력하면 됩니다.

입력한 후에 정상적으로 연결되었는지 Test Connection을 통해 확인하시기 바랍니다.

빌드 후 조치 설정

다시 Item에 구성으로 와서 빌드 후 조치를 추가합니다.

Send Build artifacts over SSH를 선택합니다.

Source files 에는 배포하려는 파일의 경로와 파일
Remove prefix 에는 제거할 경로 prefix
Remote directory 는 SSH Server를 만들면서 지정한 경로 아래의 원격 경로
Exec command 는 원격 서버에서 실행할 command를 각각 입력해주세요.

Source files 에는 빌드를 진행하면서 Publish된 모든 파일을 옮길예정이기 때문에 'JenkinsTestApp/bin/Debug/netcoreapp3.1/publish/** ' 을 작성했고,
Remove prefix 는 파일 경로를 제거해주기 위해서 전체 경로를 작성했습니다.
Remote directory 같은경우에는 ssh server를 등록하면서 지정한 경로 /var/www 아래에 있는 testapp이라는 디렉토리에 저장하기 위해서 './testapp'을 작성했고,
Exec command 에는 원격 서버에 미리 작성해놓은 쉘스크립트를 실행시키는 코드를 작성했습니다.

쉘 스크립트에는 웹 서비스와, 프록시 서버를 재시작하는쉘 스크립트에는 웹 서비스와, 프록시 서버를 재시작하는 명령어를 작성해두었습니다.

#web-restart-service.sh

#!/bin/bash

nginxservice="nginx"
myappservice="testapp"

service $myappservice restart
service $nginxservice restart

주의할 점은 쉘 스크립트를 실행할 때 실행하는 사용자의 권한이 올바르지 않다면(실행할 권한이 없다면) 빌드된 파일이 정상적으로 전송되지 않기 때문에, 테스트를 통해 Jenkins 실행결과를 확인하시길 추천드립니다.


테스트

실제로 소스를 수정한 후에 GitHub에 push를 하면 Jenkins에서 빌드해서 원격지에 있는 서버에 배포하는것을 확인할 수 있습니다.

0개의 댓글