云效创建项目应用以及流水线主要有以下三个步骤:
-
创建项目
这个很简单略过了。。
-
创建流水线
如果项目不是云效的可以点击添加流水线源:
配置流水线源:
构建:
这里说一下deploy.sh脚本:
官方提供的例子:https://code.aliyun.com/code-template/spring-boot?spm=a2c4g.11186623.0.0.1bb17837NG6aBW
deploy.sh
#!/bin/bash # 修改APP_NAME为云效上的应用名 APP_NAME=application PROG_NAME=$0 ACTION=$1 APP_START_TIMEOUT=20 # 等待应用启动的时间 APP_PORT=8080 # 应用端口 HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT} # 应用健康检查URL HEALTH_CHECK_FILE_DIR=/home/admin/status # 脚本会在这个目录下生成nginx-status文件 APP_HOME=/home/admin/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下 JAR_NAME=${APP_HOME}/${APP_NAME}.jar # jar包的名字 JAVA_OUT=${APP_HOME}/logs/start.log #应用的启动日志 # 创建出相关目录 mkdir -p ${HEALTH_CHECK_FILE_DIR} 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" == "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
需要注意脚本在ubuntu服务器下报unexpected operator 报错问题
解决方法一
将ubuntu 默认的 shell 链接的 dash 改成传统的 bash
执行如下命令:
sudo dpkg-reconfigure dash1
在弹出的框中选 no
解决方法二
将 ==
改成 =
,因为在 dash 中默认的判断语句是 =
部署:
新建主机组,可以是阿里服务器或其他三方服务器
部署脚本需要注意
附上部署脚本:
# 部署脚本会在部署组的每台机器上执行。一个典型脚本逻辑如下:先将制品包(在下载路径中配置的下载路径)解压缩到指定目录中,再执行启动脚本(通常在代码中维护,如示例中deploy.sh)。关于这个例子的详细解释见 https://help.aliyun.com/document_detail/153848.html \n\n # tar zxvf /home/admin/app/package.tgz -C /home/admin/app/\n # sh /home/admin/app/deploy.sh restart\n # 如果你是php之类的无需制品包的制品方式,可以使用git clone 或者 git pull将源代码更新到服务器,再执行其他命令 \n # git clone ***@***.git\n mkdir -p /home/admin/application tar zxvf /home/admin/app/package.tgz -C /home/admin/application/ sh /home/admin/application/deploy.sh restart
根据需要还可以配置通知方式
最终效果
附上最终脚本
#!/bin/bash # 修改APP_NAME为云效上的应用名 APP_NAME=hbydjl.com PROG_NAME=$0 ACTION=$1 APP_START_TIMEOUT=20 # 等待应用启动的时间 APP_PORT=8080 # 应用端口 HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT} # 应用健康检查URL HEALTH_CHECK_FILE_DIR=/home/admin/status # 脚本会在这个目录下生成nginx-status文件 APP_HOME=/var/www/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下 JAR_NAME=${APP_HOME}/${APP_NAME}.jar # jar包的名字 JAVA_OUT=${APP_HOME}/logs/start.log #应用的启动日志 # 创建出相关目录 mkdir -p ${HEALTH_CHECK_FILE_DIR} 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" # 解决 unexpected operator 报错问题 方式1.将ubuntu 默认的 shell 链接的 dash 改成传统的 bash(sudo dpkg-reconfigure dash) 或方式2:将 == 改成 = ,因为在 dash 中默认的判断语句是 = if [ "$status_code" = "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() { # 需要动态加载项目配置文件 rm -rf ${JAR_NAME} cp /home/admin/application/target/xxxx.jar ${JAR_NAME} cd ${APP_HOME}/ echo "starting java process" nohup java -jar ${APP_NAME}.jar > ${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