教学搭建一个gitlab + jenkins+k8s+docker自动化部署的项目

1. gitlab配置

这里主要是在gitlab上新建一个Project,作为自己的代码仓库。

在这里插入图片描述

在这里插入图片描述

把自己需要部署的项目推上去即可。

在这里插入图片描述

在这里插入图片描述


这里大家可以看到 .idea 文件夹下的文件报红,通常情况下我们不想让它被git记录,我们可以向下面那样新建一个 .gitignore 文件中 配置一下即可。

在这里插入图片描述

接下来我们在这里写自己的项目代码即可。这套自动化部署流程主要地方还是在 jenkins+k8s+docker。

2. jenkins 配置

1. 创建jenkins流水线项目

这个的前提是你已经安装过 jenkins,首先新建一个jenkins 任务

在这里插入图片描述


这里我选择的是多分支流水线,你们可以根据自己实际情况来选择

在这里插入图片描述

在这个地方主要配置一下自己的git 账号信息

在这里插入图片描述

在这里插入图片描述


这部分也是根据自己需要选的

  1. 在这里插入图片描述

  2. 在这里插入图片描述

  3. 这里已经配置完成,我们电击save,跳到下图所示页面就说明已经配置完成了

在这里插入图片描述

2.编写Jenkinsfile

注意:文件名只能叫 Jenkinsfile ,且把文件放在当前项目的根目录下

pipeline {
  options {
    buildDiscarder(logRotator(numToKeepStr: '5'))
  }
  agent none
  triggers {
    pollSCM 'H/5 * * * *'
  }
  stages {
    stage('build & upload for qa & deploy') {
      agent {
        label 'docker' // 指定docker
      }
      when {
        branch "master" // 选择指定的分支
      }
      environment {
        NAMESPACE = "k8s中项目需要放到的名称空间"
        NODE_PORT = "访问的端口号,k8s暴露给我们的"
        APP_PORT = "项目自己运行的端口号"
        ENV = "分支"
        DEV_MODE = "true"
      }
      steps {
        withKubeConfig([
          credentialsId: 'k8s容器的id',
          contextName  : 'kubernetes']) { // 下面是执行的命令
          sh 'chmod +x go' // 给当前文件夹下的go文件一个可执行权限
          sh './go npm_build_package' // 执行go 文件中的 npm_build_package
          sh './go k8s_deploy'
          sh './go k8s_service'
        }
      }
    }


  }
}

3. 编写go文件

注意:文件名就叫 go ,根据前面的jenkins文件中的配置,这里是放在和jenkins同一目录下

#!/bin/bash

# 异常即退出
set -e
CI_COMMIT_SHA=${GIT_COMMIT:=$(git log -n 1 --pretty=format:'%h')}
# 镜像标签 这里
IMAGE_TAG="$CI_COMMIT_SHA"
# docker 服务器地址
DOCKER_REGISTRY_SERVER=${DOCKER_REGISTRY_SERVER:=http://ip}
#  docker 仓库名
DOCKER_REGISTRY_NAME="仓库名"
# 用户名 这里是在k8s保密字典中配置过 一个名为 regcred 的文件,也可以直接写
# DOCKER_USER=$(kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode | jq .[] | jq .[].username | sed -e 's/^"//' -e 's/"$//')
DOCKER_USER="用户名"
# 密码
DOCKER_PASSWORD="密码"
# harbour 中存放镜像的项目名
HARBOUR_ITEM_NAME="项目名"
# 应用名
APP_NAME="test123"
# docker 镜像地址
DOCKER_IMAGE_URL=$DOCKER_REGISTRY_NAME/$HARBOUR_ITEM_NAME/$APP_NAME:$IMAGE_TAG

# 构建和上传私有仓库   公网正式环境的镜像
npm_build_package() {
  # 将所属的依赖的node_modules复制到项目下
  # rm -rf node_modules/
  # mkdir node_modules || true
  # chmod +x node_modules/
  # cp -r ${MODULES_FOLDER}/* node_modules/
  # 对项目进行构建
  #echo "开始构建公网prod环境的镜像"
  echo "开始构建生产环境的docker镜像"
  pwd
  ls
  docker build -t $DOCKER_IMAGE_URL  .
  docker login --username=$DOCKER_USER --password=$DOCKER_PASSWORD $DOCKER_REGISTRY_SERVER
  docker push $DOCKER_IMAGE_URL
  docker rmi $DOCKER_IMAGE_URL
}




k8s_deploy() {
  # 使用k8s拉取镜像并部署,需要在 k8s 新建一个 deploy.yaml.tmpl 文件,需要配置了所有 ${名称} 对应的属性
  cat k8s/deploy.yaml.tmpl |
    sed 's/\$NAMESPACE'"/$NAMESPACE/g" |
    sed 's/\$ENV'"/$ENV/g" |
    sed 's/\$APP_NAME'"/$APP_NAME/g" |
    sed 's/\$DOCKER_REGISTRY_NAME'"/$DOCKER_REGISTRY_NAME/g" |
    sed 's/\$HARBOUR_ITEM_NAME'"/$HARBOUR_ITEM_NAME/g" |
    sed 's/\$IMAGE_TAG'"/$IMAGE_TAG/g" |
    kubectl apply -n $NAMESPACE -f - || true
}

k8s_service() {
  # 需要在 k8s 新建一个 service.yaml.tmpl 文件
  cat k8s/service.yaml.tmpl |
    sed 's/\$NAMESPACE'"/$NAMESPACE/g" |
    sed 's/\$ENV'"/$ENV/g" |
    sed 's/\$APP_NAME'"/$APP_NAME/g" |
    sed 's/\$NODE_PORT'"/$NODE_PORT/g" |
    sed 's/\$APP_PORT'"/$APP_PORT/g" |
    kubectl apply -n $NAMESPACE -f - || true
}

case $1 in
init |npm_build_package|k8s_deploy|k8s_service)
  $1
  ;;
*)
  echo "not support!!! example: go <init,npm_build_package|k8s_deploy|k8s_service>"
  exit 1
  ;;
esac


k8s配置

1.新建一个k8s文件夹
这里我把上面那两个文件贴一下

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: $NAMESPACE
  annotations:
    deployment.kubernetes.io/revision: "1"
  labels:
    app: $APP_NAME
  name: $APP_NAME
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: $APP_NAME
      env: $ENV
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: $APP_NAME
        env: $ENV
    spec:
      imagePullSecrets:
      - name: regcred
      containers:
      - name: $APP_NAME
        image: $DOCKER_REGISTRY_NAME/$HARBOUR_ITEM_NAME/$APP_NAME:$IMAGE_TAG
        imagePullPolicy: Always
        securityContext:
          runAsUser: 0



apiVersion: v1
kind: Service
metadata:
  namespace: $NAMESPACE
  labels:
    app: $APP_NAME
    env: $ENV
  name: $APP_NAME
spec:
  type: NodePort
  selector:
    app: $APP_NAME
    env: $ENV
  ports:
  - name: $APP_NAME
    port: $APP_PORT
    protocol: TCP
    targetPort: $APP_PORT
    nodePort: $NODE_PORT

4.Dockerfile

FROM node:latest
LABEL description="A demo Dockerfile for build Docsify."

# 把当前文件夹 复制到服务器上的 /usr/share/nginx/html
COPY ./ /usr/share/nginx/html
# 设置工作空间 /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
# 构建镜像是 先执行的命令; 注意RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定 --no-cache
RUN npm install -g docsify-cli@4.4.3 --registry=http://npmjs.gree.com/
# EXPOSE 指定与外界交互的端口
EXPOSE 3000/tcp
# 只允许由一个 ENTRYPOINT 指令,配置容器使其 可执行化
# 在 /usr/share/nginx/html 执行 docsify serve 命令
ENTRYPOINT docsify serve /usr/share/nginx/html

# 维护者的信息
MAINTAINER bdc@gree.com.cn

把项目推上去,完成

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340