Deploy Jenkins CI/CD with shell script

문주은·2024년 1월 16일

1. Deploy Architecture

  • Local environment : Development env for developer in personal local PC
  • WEB/WAS dev #01 : Development env where code uploaded to the development branch is deployed through Jenkins
  • WEB/WAS prod #01, #02 : Operating env where the code uploaded to the master branch is deployed through Jenkins

2. Access remote server without password

2-1. Create ssh-key

## Client side
user@localhost$ cd ~/.ssh

user@localhost$ ssh-keygen -t rsa

## Check created ssh-key files
user@localhost$ ls
id_rsa  id_rsa.pub  known_hosts

2-2. Copy ssh-key files to server

user@localhost$ cd ~/.ssh
user@localhost$ scp id_rsa.pub {destination_server_ip}:~/.ssh/authrozied_keys

2-3. Modify sshd_config file

remove authrozied_key file to enable it to connect to the remote server(target server)

user@localhost$ sudo vi /etc/ssh/sshd_config

## Remove comment in sshd_config file of target server
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

you can access to target server without password


3. CI/CD shell script

  • Data sources of development server and operation server are divided into Gitlab branches.
  • The targets of the development server and operation server are distinguished by the IP address of the server.
  • For example code “deploy_prod.sh”, configure target server redundancy

deploy_spring_prod.sh

#!/bin/sh

cDate=`date +%Y%m%d`
cDatetime=`date '+%Y-%m-%d %T'`

server_1="10.50.10.1"
server_2="10.50.10.2"
branch="master"
gitsrc="/home/SE/gitsrc/miniproject/prod"
gitsite="/home/SE/gitsite/miniproject/prod"
srchome="/home/miniproject"

### First Clone
# git clone {git address}

#### Git Pull
echo "#### Git Pull Started.... $cDatetime"
cd ${gitsrc}
git pull origin $branch

#### Exclude .git
rsync -av ${gitsrc}/ ${gitsite}/ --exclude=.git --exclude=.gitlab

#### Delete .next build
rm -rf ${gitsite}/build

#### Gradle Build
cd ${gitsite}
/usr/local/gradle/bin/gradle clean
/usr/local/gradle/bin/gradle build

#### Chown dev
ssh dev@${server_1} \
"sudo chown -R dev ${srchome}; exit;"

ssh dev@${server_2} \
 "sudo chown -R dev ${srchome}; exit;"

#### Source Copy
echo "#### Source Copying.... miniproject-WasServer-01"
rsync -av ${gitsite}/build/libs/miniproject-0.0.1-SNAPSHOT.jar dev@${server_1}:${srchome}/
echo "#### Source Copy Completed... miniproject-WasServer-01"

sleep 1

echo "#### Source Copying.... miniproject-WasServer-02"
rsync -av ${gitsite}/build/libs/miniproject-0.0.1-SNAPSHOT.jar dev@${server_2}:${srchome}/
echo "#### Source Copy Completed... miniproject-WasServer-02"

### Chown
ssh dev@${server_1} \
"sudo chown -R root ${srchome}; exit;"

ssh dev@${server_2} \
"sudo chown -R root ${srchome}; exit;"

echo "#### Java Process Restarting....."
ssh dev@${server_1} \
"sudo systemctl stop java.service; sleep 1; sudo systemctl start java.service; exit;"

ssh dev@${server_2} \
"sudo systemctl stop java.service; sleep 1; sudo systemctl start java.service; exit;"

echo "#### Java Process Completed.....!!! "
profile
Data Engineer

0개의 댓글