【问题标题】:Deploying Docker image to AWS ECS using Jenkins使用 Jenkins 将 Docker 映像部署到 AWS ECS
【发布时间】:2020-12-30 14:55:11
【问题描述】:

我在GitHub 上创建了一个示例项目,我想在每个 PR 上完成以下操作:

  1. 构建 React 应用程序并让它在 Docker 容器中运行
  2. 使用管道构建 Docker 映像
  3. 使用管道,将镜像推送到企业 Docker Hub
  4. 使用管道,从企业 Docker Hub 获取 Docker 映像并将其部署到 AWS Elastic Container Service
  5. 允许 React 应用程序侦听端口,它不必对公众开放,如果您在公司 VPN 上就可以访问它

我关注了this tutorial,但我被困在上面的第 4 步,将图像推送到 ECS。我需要使用gradle 还是可以在Jenkinsfile 中完成所有这些操作?

这是我目前所拥有的:

Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "npm", "start" ]

詹金斯文件

artifactoryHost = "sten-docker.art-bobcat.sten.com"
buildContainerVersion = "1.0"
imageName = "team-docker/minimal-react-webpack-babel-setup"
fullImageName = artifactoryHost + "/" + imageName
versionedImageName = fullImageName  + ":" + buildContainerVersion


pipeline {
    agent {
        node {
            label 'build-internal-use-containers'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh "npm install"
            }
        }

        stage('Test') {
            steps {
                sh "npm test"
            }
        }

        stage('Build Docker image') {
            steps {
                sh "docker build -t ${versionedImageName} ."
            }
        }

        stage("Push Docker image") {
            steps {
                script {
                    docker.withRegistry("https://"+ artifactoryHost,'svc_d_artifactory'){
                      sh """
                          docker push ${versionedImageName}
                        """
                    }
                }
            }
        }

        stage('Deploy image to AWS') {
            steps {
                script {
                    docker.withRegistry(httpsPrefix + artifactoryHost, 'svc_d_artifactory'){
                        withAWS(credentials: "aws_vcs_dev_vpc", region: "us-east-1") {
                            sh './gradlew awsCfnMigrateStack awsCfnWaitStackComplete -PsubnetId=$SUBNET_ID -PdockerHubUsername=$DOCKER_HUB_LOGIN_USR -Pregion=$REGION'
                        }
                    }
                }
            }
        }
    }
}

ecs.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: 'Account/VPC CFN configuration'
Parameters:
  SubnetID:
    Type: String
  ServiceName:
    Type: String
  ServiceVersion:
    Type: String
  DockerHubUsername:
    Type: String
Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: deployment-example-cluster
  ServiceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: ServiceSecurityGroup
      GroupDescription: Security group for service
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: 0.0.0.0/0
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Sub ${ServiceName}-task
      Cpu: 256
      Memory: 512
      NetworkMode: awsvpc
      ContainerDefinitions:
        - Name: !Sub ${ServiceName}-container
          Image: !Sub ${DockerHubUsername}/${ServiceName}:${ServiceVersion}
          PortMappings:
            - ContainerPort: 8080
      RequiresCompatibilities:
        - EC2
        - FARGATE
  Service:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Sub ${ServiceName}-service
      Cluster: !Ref Cluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 1
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          Subnets:
            - !Ref SubnetID
          SecurityGroups:
            - !GetAtt ServiceSecurityGroup.GroupId

build.gradle

apply plugin: 'jp.classmethod.aws.cloudformation'

version = scmVersion.version

cloudFormation {
    stackName "$project.name-stack"
    stackParams([
        SubnetID: findProperty('subnetId') ?: '',
        ServiceName: project.name,
        ServiceVersion: project.version,
        DockerHubUsername: dockerHubUsernameProperty
    ])
    templateFile project.file("ecs.yml")
}

【问题讨论】:

  • 它在公司网络之外工作吗?在企业网络中,防火墙将阻止连接。 jenkins 有可以做到这一点的插件,例如plugins.jenkins.io/amazon-ecs

标签: dockerfile jenkins-pipeline amazon-cloudformation amazon-ecs


【解决方案1】:

不确定它是否会 100% 匹配您的场景,因为您使用的是 Cloud Formation,但仍在使用 Jenkins,我们刚刚开源了我们的“粘合”工具:

https://github.com/GuccioGucci/yoke

网络问题可能更多地在于配置,我们正在使用 Terraform 进行管理,与应用程序部署分离。

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 2019-09-10
    • 2021-06-16
    • 2021-12-11
    • 2018-03-25
    • 2019-01-25
    • 2015-04-16
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多