아무거나

jenkins php 빌드 버저닝 도입 본문

Infra/DevOps

jenkins php 빌드 버저닝 도입

전봉근 2019. 3. 6. 10:42
반응형

* 버킷경로가 / 로 인하여 명령어가 제대로 실행되지 않을 수 있으므로 주의하자. ( jenkins로 로그인하여 aws configure 설정 필요)

  - 패키지 배포 및 버전관리

    버전은 크게 major 버전, minor 버전, 패치의 3개의 번호로 부여합니다. 

 

   - jenkins프로젝트 관련 버저닝할 폴더 생성, jenkins접속 -> 프로젝트 아이템 설정 -> build -> Execute shell 에 압축 스크립트 작성

     [스크립트]

     #!/bin/bash

     tar -zcvf /usr/share/tomcat8/.jenkins/workspace/chatbot_project/$2/chatbot_$1.tar.gz /usr/share/tomcat8/.jenkins/workspace/chatbot_$3/*

     echo "build finish !! [version : $1, buildType : $2, jenkins item : $3] "

     *** 쉘스크립트를 젠킨스 아이템별 / 브랜치별 등 조건문을 넣어서 조건에 따른 빌드버전 관리 스크립트를 구성할 수 있다.

     [설명]

     1. buildType

        - develop, qa

 

     2. jenkins project item (static)

        - develop

     [jenkins execute shell 입력 파라미터 예시]

     sh /usr/share/tomcat8/.jenkins/scripts/build_version.sh 0.0.0 ${buildType} develop 

 

스크립트파일 경로 https://github.com/bkjeon1614/devops/tree/master/jenkins


 

가. 프로젝트별 버저닝(서버에서 관리할 경우)


​1. 개발 스크립트[ build_version.sh ]

   ex) sh build_version.sh {프로젝트명} {압축파일임시저장폴더명} {젠킨스아이템명} 

       - sh /usr/share/tomcat8/.jenkins/scripts/build_version.sh chatobt ${buildType} dev​

 

       [코드]

#!/bin/bash

if [ $1 = "chatbot" -o $1 = "etc" ]

then

        cd $jenkinsDir && tar -zcvf $projectDir/$1_0.0.0.tar.gz $1_$3/*

else

        echo "joongna api maintenance"

fi

 

echo "$1 build finish !! [buildType : $2, jenkins item : $3] " 

 

 

2. 라이브 스크립트[ live_build_version.sh ]

   ex) sh live_build_version.sh {프로젝트명} {젠킨스아이템명}   // 개발과는 다르게 압축파일임시저장폴더명 default 

       - sh /usr/share/tomcat8/.jenkins/scripts/live_build_version.sh chatobt ${buildType} live​​

 

[코드내용]

#!/bin/bash

 

# check

if [ $1 = "chatbot" ]

then

        if [ -f "/usr/share/tomcat8/.jenkins/workspace/chatbot_project/live/$1_0.0.0.tar.gz" ]; then

                vn=$(cd /usr/share/tomcat8/.jenkins/workspace/$1_project/live/ && ls -td1 *.gz | head -n 1)

                vc=$(echo $vn | cut -f 2 -d '_')

 

                vMajor=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[1] }')

                vMinor=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[2] }')

                vPatch=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[3] }')

 

                # version terms

                if [ $vPatch -ge 9 ]

                then

                        vPatch=0

                        vMinor=$(($vMinor+1))

                else

                        vPatch=$(($vPatch+1))

                fi

 

                test1=$vMajor.$vMinor.$vPatch

                echo 'test1:'.$test1

 

                if [ $vMinor -ge 9 ]

                then

                        vMinor=0

                        vMajor=$(($vMajor+1))

                fi

 

 

                test2=$vMajor.$vMinor.$vPatch

                echo 'test2:'.$test2

 

 

                if [ $vMajor -ge 9 ]; then

                        echo "Major Version Max Error"

                fi

 

                version=$vMajor.$vMinor.$vPatch

        else

                version="0.0.0"

        fi

 

        cd /usr/share/tomcat8/.jenkins/workspace​ && tar -zcvf /usr/share/tomcat8/.jenkins/workspace/$1_project/live/$1_$version.tar.gz $1_$2/*

else

        echo "$1 maintenance"

fi

 

echo "$1 build finish !! [jenkins item : $2 , version : $version ] " 

 

 

나. 프로젝트별 버저닝(s3+서버+aws-cli)

​ 

1. ec2에 aws-cli 설치

   - sudo apt-get install awscli

2. credential 설정(배포하는 계정권한으로 할당해줘야됨)

   - $ aws configure

     AWS Access Key ID [None]: AKIA****************

     AWS Secret Access Key [None]: ****************************************

     Default region name [None]: ap-northeast-1

     Default output format [None]: json

     $ ls -l ~/.aws

     // 결과

     -rw------- 1 ec2-user ec2-user 48  1月 30 05:21 config

   - set configure

     aws configure set aws_access_key_id AKIA****************

     aws configure set aws_secret_access_key ****************************************

     aws configure set region ap-northeast-1

     aws configure set output text

     cat ~/.aws/credentials

     // 결과

     [default]

     aws_access_key_id = AKIA****************

     aws_secret_access_key = **************************************** 

 

** build 하는 Execute shell 위에 서버에서 배포할때의 스텝 확인

dev - - sh /usr/share/tomcat8/.jenkins/scripts/build_version.sh chatobt dev​​ ${buildType}​

 

 

live - sh /usr/share/tomcat8/.jenkins/scripts/live_build_version.sh chatobt live ${buildType}​

 

 

 

3. 개발버전 스크립트

[코드내용]

#!/bin/bash

if [ $1 = "chatbot" ]

then

        #aws config

        projectDir="/usr/share/tomcat8/.jenkins/workspace/chatbot_project/$2"

        projectVersion="0.0.0"

        jenkinsDir="/usr/share/tomcat8/.jenkins/workspace"

        s3Buckets="s3://deploy.versioning/project/chatbot/$2/"

        s3Region="ap-northeast-2"

 

        cd $jenkinsDir && tar -zcvf $projectDir/$1_$projectVersion.tar.gz $1_$3/*

        sudo aws s3 cp $projectDir/chatbot_$projectVersion.tar.gz $s3Buckets --region $s3Region

        sudo rm -r $projectDir/chatbot_$projectVersion.tar.gz

else

        echo "joongna api maintenance"

fi

 

echo "$1 build finish !! [buildType : $2, jenkins item : $3] " 

 

4. 라이브버전 스크립트

[코드내용]

#!/bin/bash

 

# aws config

projectDir="/usr/share/tomcat8/.jenkins/workspace/chatbot_project/live"

current_version="0.0.0"

before_version="0.0.0"

jenkinsDir="/usr/share/tomcat8/.jenkins/workspace"

s3Buckets="s3://deploy.versioning/project/chatbot/live"

s3Region="ap-northeast-2"

 

# check

if [ -f "$projectDir/current_version.txt"  ]

then

        before_version=$(cat $projectDir/current_version.txt)

        echo "current version : $before_version"

else

        echo "0.0.0" > $projectDir/current_version.txt

fi

 

sudo aws s3 cp $s3Buckets/chatbot_0.0.0.tar.gz $projectDir/chatbot_0.0.0.tar.gz --region $s3Region

sleep 3

sudo aws s3 cp $s3Buckets/chatbot_$before_version.tar.gz $projectDir/chatbot_$before_version.tar.gz --region $s3Region

sleep 3

 

if [ $1 = "chatbot" ]

then

        if [ -f "$projectDir/chatbot_0.0.0.tar.gz" ]; then

                vn=$(cd $projectDir/ && ls -td1 *.gz | head -n 1)

                vc=$(echo $vn | cut -f 2 -d '_')

 

                vMajor=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[1] }')

                vMinor=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[2] }')

                vPatch=$(echo $vc | awk '{ split($0, vArr, "."); print vArr[3] }')

 

                # version terms

 

                # patch

                if [ $vPatch -ge 9 ]

                then

                        vPatch=0

                        vMinor=$(($vMinor+1))

                else

                        vPatch=$(($vPatch+1))

                fi

 

                # minor

                if [ $vMinor -ge 9 ]

                then

                        vMinor=0

                        vMajor=$(($vMajor+1))

                fi

 

                # major

                if [ $vMajor -ge 9 ]; then

                        echo "Major Version Max Error"

                fi

 

                current_version=$vMajor.$vMinor.$vPatch

                sudo rm -r $projectDir/current_version.txt

                echo $current_version > $projectDir/current_version.txt

                sudo rm -r $projectDir/chatbot_0.0.0.tar.gz

                sudo rm -r $projectDir/chatbot_$before_version.tar.gz

        fi

 

        cd $jenkinsDir && tar -zcvf $projectDir/$1_$current_version.tar.gz $1_$2/*

        sudo aws s3 cp $projectDir/chatbot_$current_version.tar.gz $s3Buckets/ --region $s3Region

        sudo rm -r $projectDir/chatbot_$current_version.tar.gz

else

        echo "joongna api maintenance"

fi

 

echo "$1 build finish !! [jenkins item : $2 , version : $current_version ] " 

반응형
Comments