Home > Mobile >  How will I combine or differentiate the two docker file for one GitLab ci cd yaml script file?
How will I combine or differentiate the two docker file for one GitLab ci cd yaml script file?

Time:04-21

I've the GitLab ci/cd yaml file script

services:
  - docker:19.03.11-dind
workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "developer" || $CI_COMMIT_BRANCH == "stage"|| ($CI_COMMIT_BRANCH =~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?) /i))
      when: always
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH != "developer" || $CI_COMMIT_BRANCH != "stage"|| ($CI_COMMIT_BRANCH !~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?) /i))
      when: never 
stages:
  - build
  - Publish
  - deploy
cache:
  paths:
    - .m2/repository
    - target
build_jar:
  image: maven:3.8.3-jdk-11
  stage: build
  script: 
    - mvn clean install package -DskipTests=true
  artifacts:
    paths:
      - target/*.jar
docker_build:
  stage: Publish
  image: docker:19.03.11
  services:
    - docker:19.03.11-dind
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script: 
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
deploy_dev:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" provider-service-dev.yml    
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_DEV $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - kubectl apply -f provider-service-dev.yml
  only:
    - developer 
deploy_stage:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" provider-service-stage.yml    
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_STAGE $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - kubectl apply -f provider-service-stage.yml
  only:
    - stage    

this yaml script which I combine into two branches i.e developer and stage but I'm having two docker files for separate branches (for developer and stage)

dockerfile-developer:
    FROM maven:3.8.3-jdk-11 AS MAVEN_BUILD
    COPY pom.xml /build/
    COPY src /build/src/
    WORKDIR /build/
    RUN mvn clean install package -DskipTests=true
    FROM openjdk:11
    WORKDIR /app
    COPY --from=MAVEN_BUILD /build/target/provider-service-*.jar /app/provider-service.jar
    ENV PORT 8092
    EXPOSE $PORT
    ENTRYPOINT ["java","-Dspring.profiles.active=development","-jar","/app/provider-service.jar"]

This is for stage

 dockerfile-stage:
    FROM maven:3.8.3-jdk-11 AS MAVEN_BUILD
    COPY pom.xml /build/
    COPY src /build/src/
    WORKDIR /build/
    RUN mvn clean install package -DskipTests=true
    FROM openjdk:11
    WORKDIR /app
    COPY --from=MAVEN_BUILD /build/target/provider-service-*.jar /app/provider-service.jar
    ENV PORT 8092
    EXPOSE $PORT
    ENTRYPOINT ["java","-Dspring.profiles.active=stage","-jar","/app/provider-service.jar"]

How will I integrate these docker file commonly in yaml script? How will it take? Can I use any variables for that?

CodePudding user response:

If i understand your issue properly you can do it by editing this stage and add one variable : CI_COMMIT_BRANCH

Docker build command will be something like : docker build -t $IMAGE_TAG -f $CI_COMMIT_BRANCH .

docker_build:
  stage: Publish
  image: docker:19.03.11
  services:
    - docker:19.03.11-dind
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script: 
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG -f $CI_COMMIT_BRANCH .
    - docker push $IMAGE_TAG

So now you have to keep both docker files in the repo however just change the name of those files as per the branch name.

developer:
    FROM maven:3.8.3-jdk-11 AS MAVEN_BUILD
    COPY pom.xml /build/
    COPY src /build/src/
    WORKDIR /build/
    RUN mvn clean install package -DskipTests=true
    FROM openjdk:11
    WORKDIR /app
    COPY --from=MAVEN_BUILD /build/target/provider-service-*.jar /app/provider-service.jar
    ENV PORT 8092
    EXPOSE $PORT
    ENTRYPOINT ["java","-Dspring.profiles.active=development","-jar","/app/provider-service.jar"]

and

stage:
    FROM maven:3.8.3-jdk-11 AS MAVEN_BUILD
    COPY pom.xml /build/
    COPY src /build/src/
    WORKDIR /build/
    RUN mvn clean install package -DskipTests=true
    FROM openjdk:11
    WORKDIR /app
    COPY --from=MAVEN_BUILD /build/target/provider-service-*.jar /app/provider-service.jar
    ENV PORT 8092
    EXPOSE $PORT
    ENTRYPOINT ["java","-Dspring.profiles.active=stage","-jar","/app/provider-service.jar"]

CodePudding user response:

rules:variables: likely fits this use case nicely. You can use rules: to change environment variables. Use this to set the location of your dockerfile based on the branch name. Pass this variable to the -f flag in docker build to make it use that dockerfile.

docker_build:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:
        DOCKERFILE_PATH: "Dockerfile"
    - if: '"$CI_COMMIT_BRANCH == "stage"'
      variables:
        DOCKERFILE_PATH: "staging.Dockerfile"
    # and so on
  script:
    # ...
    - echo "Building dockerfile: ${DOCKERFILE_PATH}"
    - docker build -t registry.tld/myimage:latest -f "$DOCKERFILE_PATH" .

  • Related