背景
有一个基于koa构建nodejs,后台接口平台, 每次修改代码之后,gitHub上传到main分支,触发github webhooks勾子,再通过一个nodejs监听平台去执行对应的脚本sh文件
优点:半自动化, 本地提交后,依赖服务器进行构建发布
缺点: 需维护webhooks
项目架构
- nodejs + koa + typescript 技术栈
coding自动化构建
coding账号准备
注册coding账号,coding.net/
构建配置(细节不说了)
- 创建一个项目,并进入项目
- 点击左侧菜单的代码仓库,进行github仓库关联操作
- 点击左侧菜单,持续集成,点击构建计划
- 选择一个构建模板(初次使用不熟悉,可以安装一个示例),这里选择express+nodes.js模板进行创建
- 依次填好相关信息
注意:
- 这里使用了docker部署,以前是pm2直接运行,docker的相关知识需要自学一下
- 密钥凭证,需要远程服务器的密钥(自行创建),coding平台会ssh登录操作
6. 计划内容验证及维护
点击设置,进入设置界面, 可以设置分支、变量、Jenkinsfile流水等信息
- 开始构建 构建成功后,验证是否成功
日常构建
- 本地git推送分支到远端
- 自动化部署
😄是不是很方便呢
Jenkinsfile 流程说明
- 从仓库获取最新代码
- 安装依赖
- 构建镜像
- 推送镜像
- 登录远端服务器
- docker run镜像
- 部署结束
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