Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in AWS by (19.1k points)

I have the following command in my buildspec.yml file in my gatsby site root directory.

version: 0.2

phases:

  install:

    commands:

      - npm i npm@latest -g

      - npm install --global gatsby-cli

      - npm install

      - pip install --upgrade pip

      - pip install --upgrade awscli

  build:

    commands:

      - gatsby build

  post_build:

    commands:

      - aws s3 sync public/ s3://stagging

I have 2 environments, staging and production. Is there a way that I can maybe automate the sync command here to use some kind of variable to change the environment when I do codebuild. Maybe I can pass the environment name via command line.

1 Answer

0 votes
by (44.4k points)

When you create a codebuild you can pass environment variables.

{

  "name": "sample-docker-project",

  "source": {

    "type": "S3",

    "location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip"

  },

  "artifacts": {

    "type": "NO_ARTIFACTS"

  },

  "environment": {

    "type": "LINUX_CONTAINER",

    "image": "aws/codebuild/docker:17.09.0",

    "computeType": "BUILD_GENERAL1_SMALL",

    "environmentVariables": [

      {

        "name": "AWS_DEFAULT_REGION",

        "value": "region-ID"

      },

      {

        "name": "AWS_ACCOUNT_ID",

        "value": "account-ID"

      },

      {

        "name": "IMAGE_REPO_NAME",

        "value": "Amazon-ECR-repo-name"

      },

      {

        "name": "IMAGE_TAG",

        "value": "latest"

      }

    ]

  },

  "serviceRole": "arn:aws:iam::account-ID:role/role-name",

  "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"

}

The in your buildspec.yml you can refer them like regular environment variables with $IMAGE_REPO_NAME.

version: 0.2

phases:

  pre_build:

    commands:

      - echo Logging in to Amazon ECR...

      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)

  build:

    commands:

      - echo Build started on `date`

      - echo Building the Docker image...          

      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .

      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      

  post_build:

    commands:

      - echo Build completed on `date`

      - echo Pushing the Docker image...

      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

What you can not do is create only 1 codebuild and pass variables to it as a script, so you need to create 2 codebuilds, but 1 buildspec.yml.

More information here: https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html

In addition, you can read the AWS Tutorial to get a clearer view of the concept.

Related questions

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

0 votes
1 answer

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...