070 Shell script - kimdonggwan337/dongdong GitHub Wiki

[ํŒŒ์ผ ๋‚ด์šฉ ์น˜ํ™˜]

#!/bin/bash

### ๊ณตํ†ต ํ•จ์ˆ˜(git clone, git push) ###
RETRY_RUN() {
    local CMD="$1"      
    local MAX_TRY=3 
    local TRY=1
    # TRY =< MAX_TRY  
    while [ $TRY -le $MAX_TRY ]; do
        
        echo "[์‹œ๋„ $TRY/$MAX_TRY] ์‹คํ–‰: $CMD"
        if eval "$CMD"; then
            return 0
        fi

        echo "[์‹คํŒจ] $CMD"
        # TRY == MAX_TRY
        if [ $TRY -eq $MAX_TRY ]; then
            echo "$MAX_TRY ๋ฒˆ ๋ชจ๋‘ ์‹คํŒจ โ†’ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ"
            exit 1
        fi

        TRY=$((TRY + 1))
        sleep 1
    done
}

### git clone ###
GIT_REPO_PATH() {
    # patch pod ์กด์žฌ ์—ฌ๋ถ€ 
    CHECK_POD=$(kubectl get deployment -n patch patch --ignore-not-found)
    
    if [ -n "$CHECK_POD" ]; then
        # NAS PATH๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ BASE_PATH ์„ ์–ธ
        NAS_PATH=$(kubectl get deployment -n webapps event -o json | jq -r \
            '.spec.template.spec.volumes[] | select(.name=="nfs-vol-data") | .hostPath.path')
        BASE_PATH="${NAS_PATH}/patch"
    else
        BASE_PATH="/home/install"
    fi

    #### ๊ฐ€์žฅ ์ตœ์‹ ๊ฒƒ๋งŒ ๋ฐ›๊ฒŒ ํ• ์ˆ˜๋„์žˆ๋‹ค.####
    cd "$BASE_PATH"
    GIT_URL="https://{ID, PWD}@kdocker.amaranth10.co.kr/amaranth10/gcmsAmaranth${NEW_GCMSID}"
    RETRY_RUN "git clone \"$GIT_URL\""
}

### ๋ฌธ์ž์—ด ์น˜ํ™˜ ###
GCMSID_CHANGE() {
    NEW_BASE_PATH="${BASE_PATH}/gcmsAmaranth${NEW_GCMSID}"
    
    echo "์น˜ํ™˜ ์ค‘"
    while true; do
        # NEW_BASE_PATH์— ๋ชจ๋“ ํŒŒ์ผ ๋‚ด์šฉ ์ค‘ _${OLD_GCMSID}, gcmsAmaranth${OLD_GCMSID} ์น˜ํ™˜
        find "$NEW_BASE_PATH" -type f -exec sed -i \
            -e "s/_${OLD_GCMSID}/_${NEW_GCMSID}/g" \
            -e "s/gcmsAmaranth${OLD_GCMSID}/gcmsAmaranth${NEW_GCMSID}/g" {} +
        
        # ์น˜ํ™˜๋˜์ง€ ์•Š์€ OLD_GCMSID ์กฐํšŒ
        RETRY_COUNT=$(grep -R "${OLD_GCMSID}" "$NEW_BASE_PATH" | wc -l)
        if [ "$RETRY_COUNT" -eq 0 ]; then
            echo "์น˜ํ™˜ ์™„๋ฃŒ"
            return 0
        fi

        # ์น˜ํ™˜๋˜์ง€ ์•Š์€ ๋ชฉ๋ก ์ถœ๋ ฅ
        grep -R "${OLD_GCMSID}" "$NEW_BASE_PATH"

        while true; do
            read -p "์น˜ํ™˜๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์žฌ์น˜ํ™˜์„ ์ง„ํ–‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (Y=์žฌ์น˜ํ™˜, N=์ข…๋ฃŒ, S=git push ์‹คํ–‰)" ANSWER 
            case "$ANSWER" in
                Y|y)
                    echo "์žฌ์น˜ํ™˜์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค."
                    break
                    ;;
                N|n)
                    echo "์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
                    exit 0
                    ;;
                S|s)
                    echo "์žฌ์น˜ํ™˜ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  git push๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค."
                    return 0
                    ;;
                *)
                    echo "์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
                    ;;
            esac
        done
    done
}

### git push ###
GIT_REPO_PUSH() {
    # ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ ์‚ญ์ œ
    OLD_BASE_PATH="${BASE_PATH}/gcmsAmaranth${OLD_GCMSID}"
    rm -rf "$OLD_BASE_PATH"
    cd "$NEW_BASE_PATH"

    # git push
    RETRY_RUN "git add --all && git commit -m \"๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(SaaSํ˜• -> ๊ตฌ์ถ•ํ˜•)\" && git push"
}

main() {
    # ์‚ฌ์šฉ์ž ์ž…๋ ฅ
    read -p "๋ณ€๊ฒฝ ์ „ GCMSID ์ž…๋ ฅ -> ex) 29866 : " OLD_GCMSID
    read -p "๋ณ€๊ฒฝ ํ›„ GCMSID ์ž…๋ ฅ -> ex) 35542 : " NEW_GCMSID
    
    # gitlab clone, ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์ง€์ •
    GIT_REPO_PATH
    # ๋ฌธ์ž ์น˜ํ™˜
    GCMSID_CHANGE
    # git push, ๊ธฐ์กด ๋””๋ ‰ํ„ฐ๋ฆฌ ์‚ญ์ œ
    GIT_REPO_PUSH
}

main

[๋ชจ๋“ˆ ์„ค์น˜]

#!/bin/bash

# ๊ณตํ†ต ์žฌ์‹œ๋„ ํ•จ์ˆ˜
## ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ, ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, deploy-webhwpctrl.yml ์น˜ํ™˜, git push, ์••์ถ•ํ•ด์ œ
function RETRY_RUN() {
    local CMD="$1"
    local MAX_TRY=3
    local TRY=1

    while [ $TRY -le $MAX_TRY ]; do
        echo "[์‹œ๋„ $TRY/$MAX_TRY] ์‹คํ–‰: $CMD"
        if eval "$CMD"; then
            echo "[์„ฑ๊ณต]"
            return 0
        fi

        TRY=$((TRY+1))  
        sleep 1

    done
    echo "$MAX_TRYํšŒ ๋ชจ๋‘ ์‹คํŒจ โ†’ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ"
    exit 1
}

function MODULE_FILE_DOWN() {
    # PATCH POD ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ(์„ค์น˜ ๊ฒฝ๋กœ ์„ค์ •)
    CHECK_POD=$(kubectl get deployment -n patch patch --ignore-not-found)
    # NAS ๊ฒฝ๋กœ (ex: /data), dirname์œผ๋กœ ์ƒ์œ„ ๊ฒฝ๋กœ ์ถ”์ถœ
    NAS_PATH=$(dirname "$(kubectl describe deploy gw -n webapps | grep -A 2 'nfs-vol-data' | tail -n 1 | awk '{print $2}')")
    # ๋‹ค์šด๋กœ๋“œ URL ๋ฐ ์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ •
    DOWNLOAD_URL="https://kdocker.amaranth10.co.kr/api/v4/projects/702/repository/files/module_install.tar.gz/raw?ref=master"

    # ์„ค์น˜ ๊ฒฝ๋กœ ์„ค์ •
    if [ -n "$CHECK_POD" ]; then
        BASE_PATH="${NAS_PATH}/data/patch"
    else
        BASE_PATH="/home/install"
    fi

    OUT_FILE="$BASE_PATH/module_add/module_install.tar.gz"
    # ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
    RETRY_RUN "mkdir -p $BASE_PATH/module_add"

    if [ -f "$BASE_PATH/module_add/module_install/webhwpctrl/deploy-webhwpctrl-v2.yml" ]; then
        echo "์ด๋ฏธ ๋””๋ ‰ํ„ฐ๋ฆฌ/ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค โ†’ ์••์ถ•ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์ƒ๋žต"
    else
        RETRY_RUN "curl -s -X GET --header \"PRIVATE-TOKEN: YE-Gp1-sudfnc1xnGVPt\" \"$DOWNLOAD_URL\" -o \"$OUT_FILE\""
        RETRY_RUN "tar -xzf \"$OUT_FILE\" -C \"$BASE_PATH/module_add\""
        echo "๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ•ํ•ด์ œ ์™„๋ฃŒ"
    fi
}

# cm-auth.yaml, nginx-cm.yaml ์ˆ˜์ • ํ•จ์ˆ˜
function CM_EDIT() {  
    local MAX_TRY=3
    local TRY=1

    while [ $TRY -le $MAX_TRY ]; do
        read -p "GCMSID ๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š” (์˜ˆ: 29135): " GCMSID
        GCMS_DIR="${BASE_PATH}/gcmsAmaranth${GCMSID}"
        # ๋””๋ ‰ํ„ฐ๋ฆฌ ํ™•์ธ
        if [ -d "$GCMS_DIR" ]; then
            break
        fi

        echo "๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
        TRY=$((TRY+1))
    done

    if [ $TRY -gt $MAX_TRY ]; then
        echo "${MAX_TRY}ํšŒ ๋ชจ๋‘ ์‹คํŒจ โ†’ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
        exit 1
    fi

    # cm-auth.yaml, nginx-cm.yaml ๊ฒฝ๋กœ ์„ค์ •
    CM_AUTH="${GCMS_DIR}/auth/cm/cm-auth.yaml"
    CM_NGINX="${GCMS_DIR}/nginx/cm/cm-nginx.yaml"

    # auth, nginx ๋ฐฑ์—… ์ƒ์„ฑ
    RETRY_RUN "cp \"$CM_AUTH\" \"${CM_AUTH}.bak\""
    RETRY_RUN "cp \"$CM_NGINX\" \"${CM_NGINX}.bak\""

    # cm-nginx.yaml -> location ~ /( ๋กœ ์‹œ์ž‘ํ•˜๊ณ  event, apiproxy ํฌํ•จ๋œ ๋ผ์ธ ์ฐพ๊ธฐ
    NGINX_NUM=$(awk '/^[:space:](/kimdonggwan337/dongdong/wiki/:space:)*location[:space:](/kimdonggwan337/dongdong/wiki/:space:)+~[:space:](/kimdonggwan337/dongdong/wiki/:space:)+\/\(/ && /event/ && /apiproxy/ {print NR; exit}' "$CM_NGINX")

    # location ๋ผ์ธ์„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ์ข…๋ฃŒ
    if [ -z "$NGINX_NUM" ]; then
        echo "location ๋ผ์ธ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"
        exit 1
    fi
       
    WEBHWP=("webhwpctrl" "webhwpctrl-admin")
    for HWP in "${WEBHWP[@]}"; do
        # location ๋ชฉ๋ก์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ญ๋ชฉ ์ถ”๊ฐ€ ๋ฐ ๊ฒ€์ฆ
        # 1. ์ค„ ๋ ๊ณต๋ฐฑ ์ œ๊ฑฐ
        # 2. )/{ , ) / {, )    / { ๋“ฑ ๊ณต๋ฐฑ ์ œ๊ฑฐ 
        # 3. ์น˜ํ™˜ ํ›„ ์กด์žฌ ์—ฌ๋ถ€ ๊ฒ€์ฆ
        if ! sed -n "${NGINX_NUM}p" "$CM_NGINX" | grep -qE "(\(|\|)${HWP}(\||\))"; then
            RETRY_RUN "
                sed -i \"${NGINX_NUM}s/[:space:](/kimdonggwan337/dongdong/wiki/:space:)*$//\" \"$CM_NGINX\" &&
                sed -i \"${NGINX_NUM}s/)[:space:](/kimdonggwan337/dongdong/wiki/:space:)*\/[:space:](/kimdonggwan337/dongdong/wiki/:space:)*{/|${HWP})\/ {/\" \"$CM_NGINX\" &&
                sed -n \"${NGINX_NUM}p\" \"$CM_NGINX\" | grep -qE \"(\\(|\\|)${HWP}(\\||\\))\"
            "
        fi
    
        # auth ROUTING
        # 1. routing, freepath, request ๋งˆ์ง€๋ง‰ ์ค„ ๋ฒˆํ˜ธ ์กฐํšŒ
        # 2. ๋งˆ์ง€๋ง‰ ์ค„ ๋ฐ”๋กœ ์•„๋ž˜ Klago.freepath.${HWP}=* ์ถ”๊ฐ€
        # 3. ๊ฒ€์ฆ
        if ! grep -qF "Klago.routing.${HWP}=webhwpctrl-svc.webapps:8080" "$CM_AUTH"; then
            RETRY_RUN "
                ROUT_LINE=\$(grep -n 'Klago.routing.' \"$CM_AUTH\" | tail -n 1 | cut -d ':' -f1) &&
                sed -i \"\${ROUT_LINE} a\\"Klago.routing.${HWP}=webhwpctrl-svc.webapps:8080"\" \"$CM_AUTH\" &&
                grep -qF \""Klago.routing.${HWP}=webhwpctrl-svc.webapps:8080"\" \"$CM_AUTH\"
            "
        fi

        # auth FREEPATH
        if ! grep -qF "Klago.freepath.${HWP}=*" "$CM_AUTH"; then
            RETRY_RUN "
                FREE_LINE=\$(grep -n 'Klago.freepath.' \"$CM_AUTH\" | tail -n 1 | cut -d ':' -f1) &&
                sed -i \"\${FREE_LINE} a\\Klago.freepath.${HWP}=*\" \"$CM_AUTH\" &&
                grep -qF \"Klago.freepath.${HWP}=*\" \"$CM_AUTH\"
            "
        fi

        # auth REQUEST
        if ! grep -qE \"\\|${HWP}(\\||$)\" \"$CM_AUTH\"; then
            RETRY_RUN "
                REQU_LINE=\$(grep -n 'Klago.request.body.out' \"$CM_AUTH\" | tail -n 1 | cut -d ':' -f1) &&
                sed -i \"\${REQU_LINE}s/\\$/|${HWP}/\" \"$CM_AUTH\" &&
                grep -qE \"\\|${HWP}(\\||$)\" \"$CM_AUTH\"
            "
        fi

    done
    RETRY_RUN "kubectl apply -f \"$CM_AUTH\""
    RETRY_RUN "kubectl apply -f \"$CM_NGINX\""
}

function FILE_REPLACE() {
    # webhwpctrl-v2 ๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ ๊ฒฝ๋กœ
    HWP2_PATH="${BASE_PATH}/module_add/module_install/webhwpctrl/deploy-webhwpctrl-v2.yml"

    # ์†Œ์Šค ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
    if [ ! -f "$HWP2_PATH" ]; then
        echo "์†Œ์Šค ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: $HWP2_PATH"
        exit 1
    fi

    RETRY_RUN "cp \"$HWP2_PATH\" \"${GCMS_DIR}/webapps/deploy\"" 

    #  gw ๋ฐฐํฌ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ถ”์ถœ
    IMAGE=$(kubectl get deploy gw -n webapps -o jsonpath='{.spec.template.spec.containers[0].image}' | awk -F: '{print $NF}')
    
    # 1. ์น˜ํ™˜
    # 2. ๊ฒ€์ฆ
    RETRY_RUN "
        sed -i \"s|/var_data|${NAS_PATH}|g\" \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl-v2.yml\" &&
        grep -q \"${NAS_PATH}\" \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl-v2.yml\"
    "
    RETRY_RUN "
        sed -i \"s|:lastest|:${IMAGE}|g\" \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl-v2.yml\" &&
        grep -q \":${IMAGE}\" \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl-v2.yml\"
    "
    
    if [ -f "${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl.yml" ]; then
        RETRY_RUN "mv \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl.yml\" \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl.yml.bak\""
    fi
    
    cd "$GCMS_DIR"
    # git push
    RETRY_RUN "git add --all && git commit -m \"์›นํ•œ๊ธ€๊ธฐ์•ˆ๊ธฐv2 ์„ค์น˜\" && git push"
}

function LICENSE_DIR_CREATE() {

    # webhwpctrl ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ
    LICENSE_PATH="${NAS_PATH}/data/webhwpctrl"
    CUST_PATH="${LICENSE_PATH}/customfont"
    FRON_PATH="${LICENSE_PATH}/Fonts"

    # ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
    RETRY_RUN "mkdir -p \"${LICENSE_PATH}/customfont\" \"${LICENSE_PATH}/Fonts\""
    # ๊ถŒํ•œ ๋ณ€๊ฒฝ, ๊ฒ€์ฆ
    RETRY_RUN "chown -R 1000:1000 \"$LICENSE_PATH\" && stat -c '%u' \"$LICENSE_PATH\" | grep -q '^1000$'"

}

function POD_DEPLOY() {

    echo " Pod ์ ์šฉ ์‹œ์ž‘ "
    # auth ํŒŒ๋“œ ์ ์šฉ
    RETRY_RUN "kubectl rollout restart deployment go-auth -n auth"

    # nginx ํŒŒ๋“œ ์ ์šฉ 
    RETRY_RUN "kubectl rollout restart deployment nginx nginx-front -n nginx"

    # ์›นํ•œ๊ธ€๊ธฐ์•ˆ๊ธฐ v2 ๋ฐฐํฌ
    RETRY_RUN "kubectl apply -f \"${GCMS_DIR}/webapps/deploy/deploy-webhwpctrl-v2.yml\""

}

#์›นํ•œ๊ธ€๊ธฐ์•ˆ๊ธฐ v2 ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ
main() {

    #module_install.tar.gz ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ•ํ•ด์ œ
    MODULE_FILE_DOWN

    # auth, nginx cm.yaml์ˆ˜์ •
    CM_EDIT

    # deploy-webhwpctrl-v2.yml ์น˜ํ™˜ ๋ฐ git push
    FILE_REPLACE

    # ๋ผ์ด์„ ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ๋ณ€๊ฒฝ
    LICENSE_DIR_CREATE

    # ์›นํ•œ๊ธ€๊ธฐ์•ˆ๊ธฐ v2 ๋ฐฐํฌ ํŒŒ๋“œ ์ ์šฉ
    POD_DEPLOY
}

main