天天看點

【流水線入門】解放運維,一鍵部署準備項目開始配置

本文隻涉及到雲效流水線的配置及部署,前提是linux伺服器已經裝好java環境。

雲效提供任務、日程、統計、流水線等功能,豐富多樣。由于文章篇幅有限,本文隻涉及到流水線功能。

準備項目

小白寫一個簡單的springboot項目,功能是列印請求IP,寫好後上傳到github遠端倉庫(也可以是Gitlab,自建Gitlab,碼雲,Codeup等外網可以通路的代碼托管平台)。這裡注意一定要有空URL的映射,因為啟動腳本要檢測項目是否啟動成功。或者可以自行修改啟動腳本

@RestController
@RequestMapping("/")
public class ShowIpController {

    @GetMapping("/")
    public String index(HttpServletRequest request){
        String ip = getIp(request);
        System.out.println("ip:[" + ip + "]");
        return "thanks";
    }

    @GetMapping("/ip/show")
    public String show(HttpServletRequest request){
        String ip = getIp(request);
        System.out.println("ip:[" + ip + "]");
        return "thanks";
    }

    private static String getIp(HttpServletRequest request) {
        if (request == null) {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
}
           

建立啟動腳本 deploy.sh 并放入resources目錄下,下文能用得到,有了啟動腳本我們就不需要手動去啟動建構的項目

#!/bin/bash

# 修改APP_NAME為雲效上的應用名
APP_NAME=ip
VERSION=1.0


PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20    # 等待應用啟動的時間
APP_PORT=8080          # 應用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 應用健康檢查URL
APP_HOME=/home/devops/${APP_NAME} # 從package.tgz中解壓出來的jar包放到這個目錄下
JAR_NAME=${APP_HOME}/${APP_NAME}-${VERSION}.jar # jar包的名字
JAVA_OUT=${APP_HOME}/logs/start.log  #應用的啟動日志

# 建立出相關目錄
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
    echo "Usage: $PROG_NAME {start|stop|restart}"
    exit 2
}

health_check() {
    exptime=0
    echo "checking ${HEALTH_CHECK_URL}"
    while true
        do
            status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
            if [ "$?" != "0" ]; then
               echo -n -e "\rapplication not started"
            else
                echo "code is $status_code"
                if [ $status_code -eq 200 ];then
                    break
                fi
            fi
            sleep 1
            ((exptime++))

            echo -e "\rWait app to pass health check: $exptime..."

            if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
                echo 'app start failed'
               exit 1
            fi
        done
    echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
    echo "starting java process"
    nohup java -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
    echo "started java process"
}

stop_application() {
   checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
   
   if [[ ! $checkjavapid ]];then
      echo -e "\rno java process"
      return
   fi

   echo "stop java process"
   times=60
   for e in $(seq 60)
   do
        sleep 1
        COSTTIME=$(($times - $e ))
        checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
        if [[ $checkjavapid ]];then
            kill -9 $checkjavapid
            echo -e  "\r        -- stopping java lasts `expr $COSTTIME` seconds."
        else
            echo -e "\rjava process has exited"
            break;
        fi
   done
   echo ""
}
start() {
    start_application
    health_check
}
stop() {
    stop_application
}
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac           

開始配置

建立項目

登入

阿裡雲雲效

。進到雲效管理背景後,點選建立項目,雲效提供産品研發,遊戲研發等多種企業模闆。此處我選擇了空白模闆,大家可以根據自己的需要選擇不同的模闆。輸入項目名ip,選擇ip項目分組,點選建立即可建立成功,操作十分簡單。

【流水線入門】解放運維,一鍵部署準備項目開始配置

建立流水線

建立完成後就自動跳轉到了我們剛剛建立的ip項目,切到"流水線"TAB,點選建立流水線。選擇第一項

`

Java · 建構、部署到阿裡雲ECS/自有主機

![image.png](https://ucc.alicdn.com/pic/developer-ecology/aa42470e6d5342fdaf137e62b42a1a9e.png)

##關聯遠端倉庫并設定代碼源
代碼源選擇你已經上傳的外網遠端倉庫,我關聯github,完成授權後依次選擇命名空間,倉庫,填入分支名"master"。
![image.png](https://ucc.alicdn.com/pic/developer-ecology/dd4fea2290cd48f8a55fd79931f0dc35.png)

##編輯java建構上傳
單工程項目直接預設的就可以了,如果是有父子層級的項目就需要配置 ***建構物上傳-打包路徑***,有幾個需要釋出的工程就需要幾條打包路徑,需要注意的是開頭沒有/,結尾有/。例如app/target/
還可以選擇任務插件,将成功,失敗等狀态直接發送到你自定義的郵箱或者是釘釘群
![image.png](https://ucc.alicdn.com/pic/developer-ecology/99d05d691bca484a9e2e5b237b39414e.png)
##編輯主機部署
制品選擇我們剛剛建構時建立的制品,建立主機組,選擇 ***自有主機*** ,将頁面中的指令複制到你的遠端主機上運作一下,等待安裝成功即可。注意此指令15分鐘有效,超出後需要重新擷取。
![image.png](https://ucc.alicdn.com/pic/developer-ecology/a5caa7dbc7b9435ba2fb186f6d74e1c6.png)
這樣我們的清單中就出現了一台機器,這台機器已經與這條流水線關聯了。代碼會自動部署到這台機器上。主機組就選擇剛剛建立的主機,你想把建構好的jar包放在哪,下載下傳路徑就填入你想放的路徑,這裡我填入*/home/devops/ip/ip.tgz*。部署腳本填入解壓縮指令及運作 *啟動腳本*
*tar zxvf /home/devops/ip/ip.tgz -C /home/devops/ip/
sh /home/devops/ip/classes/deploy.sh start*
[關于部署腳本例子的詳細解釋](https://thoughts.aliyun.com/sharespace/5e86a419546fd9001aee81f2/docs/5e86a416546fd9001aee81b9)
至此點選右上角儲存并運作,然後靜靜的等待項目運作即可。

![image.png](https://ucc.alicdn.com/pic/developer-ecology/f826243431ae4d22943427112c933444.png)
##運作成功後效果
![image.png](https://ucc.alicdn.com/pic/developer-ecology/3dfdd1659d3f41edb0ecf20d6f645df2.png)


----
【雲效官網】https://www.aliyun.com/product/yunxiao?channel=zhibo