如何实现Jenkins流水线构建推送ECR镜像至EC2及配套Node安装脚本
Jenkins前端应用EC2部署实现方案
基础配置前提
- 关联代码仓库:示例代码仓库
- 已在AWS侧创建私有ECR镜像仓库
frontend_app,Jenkins已配置好对应AWS操作凭证,远程EC2实例已完成Docker部署、ECR镜像拉取权限配置 - 流水线运行节点需提前预装Git、Docker、AWS CLI、SSH客户端基础依赖
1. 脚本式Jenkinsfile(Groovy)
将以下内容存为Jenkinsfile放在代码仓库根目录,覆盖代码拉取、前端构建、镜像构建推送、远程EC2部署全流程,使用前替换脚本中占位的AWS区域、ECR地址、EC2连接信息为实际值:
node('linux-build-node') { // 可通过Jenkins参数化构建自定义配置项 def AWS_REGION = "替换为你的AWS区域,如cn-north-1" def ECR_REGISTRY = "替换为你的ECR仓库地址,格式为<AWS账号ID>.dkr.ecr.<区域>.amazonaws.com" def IMAGE_TAG = "${BUILD_NUMBER}-${sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}" def EC2_PUBLIC_IP = "替换为目标EC2公网IP" def EC2_LOGIN_USER = "ec2-user" withCredentials([ sshUserPrivateKey(credentialsId: 'ec2-ssh-private-key', keyFileVariable: 'SSH_PRIVATE_KEY'), string(credentialsId: 'aws-access-secret', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY') ]) { stage('拉取代码') { git branch: 'main', url: 'https://gitlab.com/arindam' } stage('前端项目构建') { sh ''' chmod +x ./install_node.sh # 可通过Jenkins参数NODE_VERSION指定Node版本,未指定默认安装18.17.0 ./install_node.sh ${NODE_VERSION:-18.17.0} export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" npm install npm run build ''' } stage('构建镜像并推送至ECR') { sh ''' export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY export AWS_DEFAULT_REGION=$AWS_REGION aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_REGISTRY docker build -t $ECR_REGISTRY/frontend_app:$IMAGE_TAG . docker tag $ECR_REGISTRY/frontend_app:$IMAGE_TAG $ECR_REGISTRY/frontend_app:latest docker push $ECR_REGISTRY/frontend_app:$IMAGE_TAG docker push $ECR_REGISTRY/frontend_app:latest ''' } stage('远程EC2部署') { sh ''' ssh -i $SSH_PRIVATE_KEY -o StrictHostKeyChecking=no $EC2_LOGIN_USER@$EC2_PUBLIC_IP << EOF # EC2侧拉取镜像启动服务 aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY docker stop frontend_app || true docker rm frontend_app || true docker pull $ECR_REGISTRY/frontend_app:$IMAGE_TAG docker run -d -p 80:80 --restart=always --name frontend_app $ECR_REGISTRY/frontend_app:$IMAGE_TAG docker image prune -af EOF ''' } } }
注意:所有密钥、私钥类敏感信息必须存储在Jenkins凭证管理模块,禁止硬编码在脚本中。代码仓库根目录需自行配套前端项目对应的Dockerfile(例如基于Nginx镜像托管构建生成的dist目录)。
2. nvm安装Node的bash脚本
将以下内容存为install_node.sh放在代码仓库根目录,支持执行时传入参数指定要安装的Node版本,未传参默认安装18.17.0版本:
#!/bin/bash set -eu # 读取传入的Node版本参数 TARGET_NODE_VERSION=${1:-"18.17.0"} # 安装nvm(若未安装) if [ ! -d "$HOME/.nvm" ]; then echo "检测到未安装nvm,开始执行nvm安装" curl -fsSL https://nvm.sh/install.sh | bash fi # 加载nvm环境 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # 安装指定版本Node并设为默认 echo "开始安装Node v${TARGET_NODE_VERSION}" nvm install "$TARGET_NODE_VERSION" nvm use "$TARGET_NODE_VERSION" nvm alias default "$TARGET_NODE_VERSION" # 输出安装结果 echo "Node版本:$(node -v)" echo "npm版本:$(npm -v)" echo "Node v${TARGET_NODE_VERSION} 安装配置完成"
脚本执行前需赋予可执行权限,手动执行示例:
./install_node.sh 20.11.0即可安装v20.11.0版本Node。
配置说明
- 可在Jenkins任务中开启参数化构建,添加
NODE_VERSION字符串参数,实现构建时灵活选择Node版本 - EC2实例绑定的IAM角色需配置ECR镜像拉取对应权限,安全组需开放前端服务对应端口(示例中为80端口)的访问规则
- 若需要多环境部署,可在流水线中新增环境参数,区分不同EC2实例、镜像标签配置
内容的提问来源于stack exchange,提问作者Arindam Gupta Roy
相关产品推荐
相关产品推荐

