【问题标题】:Unable to deploy typescript express app to Azure无法将 typescript express 应用程序部署到 Azure
【发布时间】:2020-01-18 02:12:56
【问题描述】:

我正在尝试将一个简单的 typescript express 应用程序部署到 Azure。我发现这篇有用的博文...

我想将 typescript 代码转换为部署的一部分。

http://Codefoster.com/tscazure

主要是安装azure cli

npm install -g azure-cli

然后创建自定义部署脚本

npm site deploymentscript --node

所以现在我在项目的根目录中有一个 .deployment 文件...

[config]
command = deploy.cmd

还在根目录下有一个 deploy.cmd,我对其进行了修改以添加以下部分...

:: 3. Install npm packages
IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
  pushd "%DEPLOYMENT_TARGET%"
  call :ExecuteCmd !NPM_CMD! install --production
  IF !ERRORLEVEL! NEQ 0 goto error
  popd
)

:: 4. Compile Typescript

TSC="$DEPLOYMENT_TARGET/node_modules/typescript/bin/tsc"
echo "Building Typescript files."
"$TSC"
exitWithMessageOnError "Could not run 'tsc'.  Did 'npm install'"

根目录中还有一个 package.json 文件,其中包含此...

{
  "name": "api-server",
  "version": "1.0.0",
  "description": "API server",
  "main": "index.js",
  "scripts": {
    "build": "tsc",
    "start": "node build/src | pino-colada",
    "dev": "ts-node src | pino-colada"
 },
 "author": "",
 "license": "ISC",
 "dependencies": {
    "@babel/types": "^7.8.0",
    "@types/express": "^4.17.2",
    "azure-cli": "^0.10.20",
    "bcrypt": "^3.0.7",
    "bookshelf": "^1.0.1",
    "express": "^4.17.1",
    "express-pino-logger": "^4.0.0",
    "jsonwebtoken": "^8.5.1",
    "knex": "^0.20.7",
    "mysql": "^2.17.1",
    "pino-colada": "^1.5.0",
    "typescript": "^3.7.4",
    "validator": "^12.1.0"
 },
 "proxy": "http://localhost:3201"
}

我将代码推送到 GitHub 并使用默认设置创建 WebApp(Linux 和 Node LTS)

我从 Azure 部署,部署失败,日志显示这个...

Command: deploy.cmd
/opt/Kudu/Scripts/starter.sh: line 2: exec: deploy.cmd: not found
/opt/Kudu/Scripts/starter.sh: line 2: exec: deploy.cmd: not found\n/opt/Kudu/Scripts/starter.sh deploy.cmd

那我做错了什么?

【问题讨论】:

    标签: node.js typescript azure express


    【解决方案1】:

    对...

    在经历了很多心痛之后,我终于做到了。根本问题是我的开发盒是 Windows,而 Azure Web App 是 Linux。因此 deploy.cmd 根本不会飞。您需要一个 deploy.sh bash 脚本才能在 Linux 上运行。显然没有办法在 Windows 上生成它......你需要启动你的 Linux 机器并使用

    azure site deploymentscript --node
    

    得到它。您无法从现有的 Web 应用程序下载脚本...文档错误或已过时。但你不必这样做......这里是:

    #!/bin/bash
    
    # ----------------------
    # KUDU Deployment Script
    # Version: 1.0.17
    # ----------------------
    
    # Helpers
    # -------
    
    exitWithMessageOnError () {
      if [ ! $? -eq 0 ]; then
        echo "An error has occurred during web site deployment."
        echo $1
        exit 1
      fi
    }
    
    # Prerequisites
    # -------------
    
    # Verify node.js installed
    hash node 2>/dev/null
    exitWithMessageOnError "Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment."
    
    # Setup
    # -----
    
    SCRIPT_DIR="${BASH_SOURCE[0]%\\*}"
    SCRIPT_DIR="${SCRIPT_DIR%/*}"
    ARTIFACTS=$SCRIPT_DIR/../artifacts
    KUDU_SYNC_CMD=${KUDU_SYNC_CMD//\"}
    
    if [[ ! -n "$DEPLOYMENT_SOURCE" ]]; then
      DEPLOYMENT_SOURCE=$SCRIPT_DIR
    fi
    
    if [[ ! -n "$NEXT_MANIFEST_PATH" ]]; then
      NEXT_MANIFEST_PATH=$ARTIFACTS/manifest
    
      if [[ ! -n "$PREVIOUS_MANIFEST_PATH" ]]; then
        PREVIOUS_MANIFEST_PATH=$NEXT_MANIFEST_PATH
      fi
    fi
    
    if [[ ! -n "$DEPLOYMENT_TARGET" ]]; then
      DEPLOYMENT_TARGET=$ARTIFACTS/wwwroot
    else
      KUDU_SERVICE=true
    fi
    
    if [[ ! -n "$KUDU_SYNC_CMD" ]]; then
      # Install kudu sync
      echo Installing Kudu Sync
      npm install kudusync -g --silent
      exitWithMessageOnError "npm failed"
    
      if [[ ! -n "$KUDU_SERVICE" ]]; then
        # In case we are running locally this is the correct location of kuduSync
        KUDU_SYNC_CMD=kuduSync
      else
        # In case we are running on kudu service this is the correct location of kuduSync
        KUDU_SYNC_CMD=$APPDATA/npm/node_modules/kuduSync/bin/kuduSync
      fi
    fi
    
    # Node Helpers
    # ------------
    
    selectNodeVersion () {
      if [[ -n "$KUDU_SELECT_NODE_VERSION_CMD" ]]; then
        SELECT_NODE_VERSION="$KUDU_SELECT_NODE_VERSION_CMD \"$DEPLOYMENT_SOURCE\" \"$DEPLOYMENT_TARGET\" \"$DEPLOYMENT_TEMP\""
        eval $SELECT_NODE_VERSION
        exitWithMessageOnError "select node version failed"
    
        if [[ -e "$DEPLOYMENT_TEMP/__nodeVersion.tmp" ]]; then
          NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"`
          exitWithMessageOnError "getting node version failed"
        fi
    
        if [[ -e "$DEPLOYMENT_TEMP/__npmVersion.tmp" ]]; then
          NPM_JS_PATH=`cat "$DEPLOYMENT_TEMP/__npmVersion.tmp"`
          exitWithMessageOnError "getting npm version failed"
        fi
    
        if [[ ! -n "$NODE_EXE" ]]; then
          NODE_EXE=node
        fi
    
        NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\""
      else
        NPM_CMD=npm
        NODE_EXE=node
      fi
    }
    
    ##################################################################################################################################
    # Deployment
    # ----------
    
    echo Handling node.js deployment.
    
    # 1. KuduSync
    if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then
      "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
      exitWithMessageOnError "Kudu Sync failed"
    fi
    
    # 2. Select node version
    # selectNodeVersion
    NPM_CMD=npm
    NODE_EXE=node
    
    # 3. Install npm packages
    if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then
      cd "$DEPLOYMENT_TARGET"
      echo "Running $NPM_CMD install --production"
      eval $NPM_CMD install --production
      exitWithMessageOnError "npm failed"
      cd - > /dev/null
    fi
    
    # 4. Compile Typescript
    
    TSC="$DEPLOYMENT_TARGET/node_modules/typescript/bin/tsc"
    echo "Building Typescript files."
    cd "$DEPLOYMENT_TARGET"
    "$TSC"
    exitWithMessageOnError "Could not run 'tsc'.  Did 'npm install'"
    cd - > /dev/null
    
    echo "Finished Typescript build."
    
    
    
    ##################################################################################################################################
    echo "Finished successfully."
    

    现在 .deployment 文件看起来像这样...

    [config]
    command = bash deploy.sh
    

    注意以下几点:

    • 在deploy.sh第2步中,我注释掉了节点选择功能,直接简单的设置了node和npm命令。节点选择功能根本不起作用。
    • 我添加了 deploy.sh 步骤 4 来编译 typescript。

    以下是您应该知道的其他一些似乎在任何地方都没有记录的事情:

    • PORT 和 SSH_PORT 环境变量包含仅有的 2 个打开的端口。这些是我的网络应用上的 8080 和 2222。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 2016-06-13
      • 2020-04-22
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2020-05-03
      相关资源
      最近更新 更多