【发布时间】:2020-12-30 14:55:11
【问题描述】:
我在GitHub 上创建了一个示例项目,我想在每个 PR 上完成以下操作:
- 构建 React 应用程序并让它在 Docker 容器中运行
- 使用管道构建 Docker 映像
- 使用管道,将镜像推送到企业 Docker Hub
- 使用管道,从企业 Docker Hub 获取 Docker 映像并将其部署到 AWS Elastic Container Service
- 允许 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