pm2+github+webhook部署转向coding自动化部署nodejs项目

1,386 阅读2分钟

背景

有一个基于koa构建nodejs,后台接口平台, 每次修改代码之后,gitHub上传到main分支,触发github webhooks勾子,再通过一个nodejs监听平台去执行对应的脚本sh文件

优点:半自动化, 本地提交后,依赖服务器进行构建发布

缺点: 需维护webhooks

项目架构

  1. nodejs + koa + typescript 技术栈

coding自动化构建

coding账号准备

注册coding账号,coding.net/

构建配置(细节不说了)

  1. 创建一个项目,并进入项目
  2. 点击左侧菜单的代码仓库,进行github仓库关联操作
  3. 点击左侧菜单,持续集成,点击构建计划
  4. 选择一个构建模板(初次使用不熟悉,可以安装一个示例),这里选择express+nodes.js模板进行创建
  5. 依次填好相关信息

注意:

  • 这里使用了docker部署,以前是pm2直接运行,docker的相关知识需要自学一下
  • 密钥凭证,需要远程服务器的密钥(自行创建),coding平台会ssh登录操作

image.png

image.png 6. 计划内容验证及维护

点击设置,进入设置界面, 可以设置分支、变量、Jenkinsfile流水等信息

image.png

  1. 开始构建 构建成功后,验证是否成功

image.png

日常构建

  1. 本地git推送分支到远端
  2. 自动化部署

😄是不是很方便呢

Jenkinsfile 流程说明

  1. 从仓库获取最新代码
  2. 安装依赖
  3. 构建镜像
  4. 推送镜像
  5. 登录远端服务器
  6. docker run镜像
  7. 部署结束
pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout([$class: 'GitSCM',
        branches: [[name: GIT_BUILD_REF]],
        userRemoteConfigs: [[
          url: GIT_REPO_URL,
          credentialsId: CREDENTIALS_ID
        ]]])
      }
    }
    stage('安装依赖') {
      steps {
        sh 'npm install'
      }
    }
    stage('依赖漏洞扫描') {
      steps {
        npmAuditInDir(directory: '/', collectResult: true)
      }
    }
    stage('构建镜像并推送到 CODING Docker 制品库') {
      steps {
        sh "docker build -t ${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION} -f ${DOCKERFILE_PATH} ${DOCKER_BUILD_CONTEXT}"
        useCustomStepPlugin(key: 'coding-public:artifact_docker_push', version: 'latest', params: [image:"${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}",repo:'github',properties:'[]'])
      }
    }
    stage('部署到远端服务') {
      steps {
        script {
          def remoteConfig = [:]
          remoteConfig.name = "my-remote-server"
          remoteConfig.host = "${REMOTE_HOST}"
          remoteConfig.port = "${REMOTE_SSH_PORT}".toInteger()
          remoteConfig.allowAnyHosts = true

          withCredentials([
            sshUserPrivateKey(
              credentialsId: "${REMOTE_CRED}",
              keyFileVariable: "privateKeyFilePath"
            ),
            usernamePassword(
              credentialsId: "${CODING_ARTIFACTS_CREDENTIALS_ID}",
              usernameVariable: 'CODING_DOCKER_REG_USERNAME',
              passwordVariable: 'CODING_DOCKER_REG_PASSWORD'
            )
          ]) {
            // SSH 登陆用户名
            remoteConfig.user = "${REMOTE_USER_NAME}"
            // SSH 私钥文件地址
            remoteConfig.identityFile = privateKeyFilePath

            // 请确保远端环境中有 Docker 环境
            sshCommand(
              remote: remoteConfig,
              command: "docker login -u ${CODING_DOCKER_REG_USERNAME} -p ${CODING_DOCKER_REG_PASSWORD} ${CODING_DOCKER_REG_HOST}",
              sudo: true,
            )

            sshCommand(
              remote: remoteConfig,
              command: "docker rm -f app-name | true",
              sudo: true,
            )

            // DOCKER_IMAGE_VERSION 中涉及到 GIT_LOCAL_BRANCH / GIT_TAG / GIT_COMMIT 的环境变量的使用
            // 需要在本地完成拼接后,再传入到远端服务器中使用
            DOCKER_IMAGE_URL = sh(
              script: "echo ${CODING_DOCKER_REG_HOST}/${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}",
              returnStdout: true
            )

            sshCommand(
              remote: remoteConfig,
              command: "docker run -d -p 3000:3000 --name app-name ${DOCKER_IMAGE_URL}",
              sudo: true,
            )

            echo "部署成功,请到 http://${REMOTE_HOST}:3000 预览效果"
          }
        }

      }
    }
  }
  environment {
    CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
    CODING_DOCKER_IMAGE_NAME = "${PROJECT_NAME.toLowerCase()}/${DOCKER_REPO_NAME}/${DOCKER_IMAGE_NAME}"
  }
}

  • ssh 凭证 云服务器创建了密钥对,但是一直连接不成功 解决: 密钥对创建后要重启服务器

  • argon2 错误 在node中一直报node_modules/argon2/lib/binding/napi-v3/argon2.node 错误

解决方法: 新建.dockerignore``文件,内容为node_modules/argon2```, 本地提交时过滤这个包,从服务器进行安装

  • 找不动dist文件 因为是ts项目,所以需要构建一下 解决: 在Dockerfile中,copy文件后进行构建
COPY . .
RUN npm run build