You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:30:55