Gitlab CI 之 Node.JS 优化一

背景

在小型Web应用开发过程中,开发人员并不会区分前端和后端,并且因为是简单的前后端分离,这样讲nginx和node js放在一个Pod下运行,也不用考虑,前后端更新不一致,导致网站异常。

当我们将runner丢在K8s中去运行时,如果还采用docker命令,不断要去处理sock的映射,还要考虑CNI非docker的场景下的问题,这个时候,直接使用Google的kaniko是一个很好的选择。

Dockerfile

因为前后端都需要node编译,所以这里采用multi-stage

########################################################
############### INITIALIZE IMAGE  ###################
########################################################

FROM node:16.18-buster-slim AS init
WORKDIR /app

RUN apt-get update && \
    apt-get install --no-install-recommends -y python3 make g++

RUN mkdir -p /app/backend && \
    mkdir -p /app/frontend

ADD src/ .
ADD nginx nginx

RUN cd /app/backend && \
    yarn && \
    yarn build && \
    yarn cache clean --all && \
    yarn install --production && \
    rm -rf src test && \
    cd /app/frontend && \
    yarn && \
    yarn build && \
    rm -rf src node_modules 

########################################################
############### NGINX IMAGE  ###################
########################################################

FROM nginx:1.16.1-alpine AS nginx

ENV TZ="Asia/Ho_Chi_Minh"

RUN mkdir -p /etc/nginx/whitelisted_ip

COPY --from=init /app/nginx/whitelist/* /etc/nginx/whitelisted_ip/
COPY --from=init /app/nginx/conf/* /etc/nginx/conf.d/
COPY --from=init /app/frontend/dist /var/www/frontend/dist

########################################################
############### BACKEND IMAGE  ###################
########################################################

FROM node:16.18-buster-slim AS backend

RUN mkdir -p /log

COPY --from=init /app/backend /var/www/backend

WORKDIR /var/www/backend

使用一个基础的Image,Build出2个不同的业务Image

CI

before_script:
- export EVENT_NAME="$(echo $CI_PROJECT_NAME | awk -F"." '{print tolower($1)}' )"
- export IMAGE="test/${EVENT_NAME}"
- export IMAGE_TAG=${CI_COMMIT_SHA:0:8}

stages:
- push

push:image:
  image:
    entrypoint:
    - ''
    name: gcr.io/kaniko-project/executor:debug
  rules:
  - if: $CI_PIPELINE_SOURCE == "api"
  script:
  - /kaniko/executor 
    --context ${CI_PROJECT_DIR} 
    --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
    --destination ${IMAGE}-backend:${IMAGE_TAG}
    --target backend
  - /kaniko/executor 
    --context ${CI_PROJECT_DIR} 
    --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
    --destination ${IMAGE}-nginx:${IMAGE_TAG}
    --target nginx
  stage: push
  tags:
  - k8s-runner

使用--target参数,来指定我们的目标

你可能感兴趣的:(Gitlab CI 之 Node.JS 优化一)