K8S发版脚本

# tree 
.
├── generateyaml.sh
├── Jenkinsfiletemplate
├── kubernetes
│   ├── Dockerfile_template
│   ├── start
│   ├── template-deployment-addnew.yaml
│   └── template-ingress.yaml
└── shell
    └── template.sh

3 directories, 6 files

template.sh

#!/bin/bash
#定义变量
shell_version=shell_dev

config_version=config_dev

Dockerfile_version=Dockerfiledev

JOB_NAME=

service_name=

pod_name=

# ingresshost=

# secret_name=
# 定义数组
port_state=(
)
service_state=(
)
# 更新时间:2021年5月18日18点19分
# 优化:将容器启动命令放置yaml文件
# 优化:修改yaml文件的镜像
# 最新更新:2021年5月19日18点22分
# 修改:添加了config_version
# ==========================脚本开始===================================
# ====================================================================

#清理环境

mkdir -p ${shell_version}
# 备份
cp -a ./kubernetes/Dockerfile_template ./kubernetes/${Dockerfile_version}
cp -a Jenkinsfiletemplate Jenkinsfile

sed -i s/config_version/${config_version}/g ./kubernetes/${Dockerfile_version}


# # ==================================ingress=================================================
# for i in ${service_state[*]}
# do
# ##### ==================================ingress.yaml====================================
#     cp ./kubernetes/template-ingress.yaml ./kubernetes/${JOB_NAME}_$i-ingress.yaml
    
#     sed -i s/pod-name/${pod_name}-$i/g ./kubernetes/${JOB_NAME}_$i-ingress.yaml
#     sed -i s/ingresshost/${ingresshost}/g ./kubernetes/${JOB_NAME}_$i-ingress.yaml
#     sed -i s/secret-name/${secret_name}/g ./kubernetes/${JOB_NAME}_$i-ingress.yaml
# done

# for j in ${!service_state[*]}
# do
#     # ingress端口替换
#     sed -i s/PORTnumber/${port_state[j]}/g ./kubernetes/${JOB_NAME}_${service_state[j]}-ingress.yaml
# done
# ##### ==================================================================================
# ##### ==================================ingress.sh======================================
# for i in ${service_state[*]}
# do
#     echo "setsid script -c 'sudo kubectl apply -f ./kubernetes/${JOB_NAME}_$i-ingress.yaml --record'">>./${shell_version}/ingress.sh
# done
# # ==============================================================================================



# 批量生成不同服务的yaml文件
for i in ${service_state[*]}
do
    cp ./kubernetes/template-deployment-addnew.yaml ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml
    
    sed -i s/pod-name/${pod_name}-$i/g ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml
    sed -i s/images_name/${JOB_NAME}/g ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml
    sed -i s/service_state/$i/g ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml
    sed -i s/service_name/${service_name}/g ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml
    sed -i s/config_version/${config_version}/g ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml

done

for j in ${!service_state[*]}
do
    # deployment端口替换
    sed -i s/PORTnumber/${port_state[j]}/g ./kubernetes/${JOB_NAME}_${service_state[j]}-deployment-addnew.yaml
done

# ====================================================================
# ====================buildrsync.sh===================================

cat > ./${shell_version}/build.sh << EOF
#!/bin/bash
export GO111MODULE=on
export GOROOT=/usr/local/go16
export GOPROXY=https://goproxy.cn,direct
git config --global url."ssh://git@gitlab.heywoods.cn/".insteadOf "https://gitlab.heywoods.cn/"
export GOPRIVATE=gitlab.heywoods.cn
export GONOPROXY=gitlab.heywoods.cn
export GONOSUMDB=gitlab.heywoods.cn
/usr/local/go16/bin/go build  -mod=mod -o ./${service_name} /opt/applications/go/src/${JOB_NAME}/${service_name}.go
if [ $? -ne 0 ]; then
    exit 1
fi
cp ${service_name} kubernetes/start/${service_name}

EOF

# ====================================================================
# ====================buildrsync.sh===================================

cat > ./${shell_version}/buildrsync.sh << EOF
/usr/bin/rsync  -avz  ./* /opt/applications/go/src/${JOB_NAME}/
/usr/bin/rsync  -avz   --exclude={kubernetes,Jenkinsfile_dev,shell_version,${shell_version}}  ./*   ./kubernetes/start/
EOF
# ====================================================================
# =======================buildocker.sh================================
cat > ./${shell_version}/buildocker.sh << EOF
build_tag=\$1

docker build -t heywoods/${JOB_NAME}:\${build_tag} -f ./kubernetes/${Dockerfile_version} .
docker tag heywoods/${JOB_NAME}:\${build_tag} harboral.heywoods.cn/app/${JOB_NAME}:\${build_tag}

EOF

# ====================================================================
# ========================pushdocker.sh===============================
cat > ./${shell_version}/pushdocker.sh << EOF
harborUser=\$1
harborPassword=\$2
build_tag=\$3

docker login -u \${harborUser} -p \${harborPassword} harboral.heywoods.cn
docker push harboral.heywoods.cn/app/${JOB_NAME}:\${build_tag}

EOF

# ====================================================================
# ===================cleandocker.sh===================================
cat > ./${shell_version}/cleandocker.sh << EOF
build_tag=\$1

docker rmi heywoods/${JOB_NAME}:\${build_tag}
docker rmi harboral.heywoods.cn/app/${JOB_NAME}:\${build_tag}
EOF

# ==================deployment.sh=====================================
for i in ${service_state[*]}
do
    echo setsid script -c \"sudo kubectl apply -f ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml --record\">>./${shell_version}/deployment.sh
done

# ===================Jenkinsfile======================================
sed -i s/shell_version/${shell_version}/g Jenkinsfile

for i in ${service_state[*]}
do
    echo    sh \"sed -i "'"s/\<BUILD_TAG\>/\$\{build_tag\}/"'" ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml\">>Jenkinsfile
    echo    sh \"sed -i "'"s/\<BRANCH_NAME\>/\$\{env.BRANCH_NAME\}/"'" ./kubernetes/${JOB_NAME}_$i-deployment-addnew.yaml\">>Jenkinsfile
    
done

cat >>Jenkinsfile <<EOF
            sh "./shell/deployment.sh"
            sh "./shell/ingress.sh"
            }
}
EOF
# ====================================================================
# ==========================脚本结束===================================




Dockerfile_template

FROM centos:7.5.1804

MAINTAINER heywoods
ENV PROJECT_DIR=/usr/src
ENV TZ=Asia/Shanghai


RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN yum install -y glibc-devel gcc c++ net-tools psmisc

COPY ./kubernetes/start /usr/src/start
# 2021年5月18日18点48分:删除了复制二进制包的步骤
COPY config_version.yml /usr/src/start/config_version.yml


WORKDIR $PROJECT_DIR/start


template-deployment-addnew.yaml

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pod-name-deployment
  namespace: heywoods-app
spec:
  strategy:
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0%
  replicas: 1
  template:
    metadata:
      labels:
        app: pod-name
    spec:
      containers:
      - name: heywoods-golang
        image: "harboral.heywoods.cn/app/images_name:<BUILD_TAG>"
        command: ["/bin/sh"]
        args: ["-c","./service_name service_state --config config_version.yml"]
        imagePullPolicy: IfNotPresent
        env:
        - name: branch
          value: <BRANCH_NAME>
        - name: JAEGER_AGENT_HOST
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        resources:
          limits:
            cpu: 400m
            memory: 512Mi
          requests:
            cpu: 200m
            memory: 200Mi
        ports:
        - containerPort: PORTnumber
      imagePullSecrets:
        - name: harbor-secret
---
kind: Service
apiVersion: v1
metadata:
  name: pod-name-service
  namespace: heywoods-app
  labels:
    app: pod-name
spec:
  ports:
  - name: http
    protocol: TCP
    port: PORTnumber
    targetPort: PORTnumber
  selector:
    app: pod-name
  # Minikube needs NodePort to work.
  type: ClusterIP
  #type: NodePort
  sessionAffinity: None

template-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pod-name-ingress
  namespace: heywoods-app
spec:
  tls:
    - hosts:
        - ingresshost
      secretName: secret-name
  rules:
    - host: ingresshost
      http:
        paths:
          - path: /
            backend:
              serviceName: pod-name-service
              servicePort: PORTnumber

generateyaml.sh

#!/bin/bash
# 清理环境
find . -type f '!' -name 'Dockerfile_template' '!' -name 'template*' '!' -name 'generateyaml.sh' '!' -name 'Jenkinsfiletemplate'  |xargs rm -rf
# 字符转化
dos2unix shell/template.sh
# 执行yaml文件自动生成脚本
sh -x shell/template.sh

Jenkinsfiletemplate

#!/usr/bin/env groovy
node {
    stage('获取源码-master') {
        echo "1.Prepare Stage"
            checkout([$class: 'GitSCM',
                    branches: [[name: "${params.tag}"]],
                    doGenerateSubmoduleConfigurations: false,
                    extensions: [],
                    gitTool: 'Default',
                    submoduleCfg: [],
                    userRemoteConfigs: [[url: '']]
            ])
            build_tag = "${params.tag}"
    }
    stage('编译') {
                echo "2.Build Stage"
                    sh "chmod u+x ./shell_version/*.sh"
                    sh "./shell_version/buildrsync.sh"
                    sh "./shell_version/build.sh"
        }
    stage('构建镜像') {
                echo "3.Build Docker Image Stage"
                sh "./shell_version/buildocker.sh ${build_tag}"
                sh "sleep 2"
        }
         stage('上传镜像') {
                echo "4.Push Docker Image Stage"
                    withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'harborPassword', usernameVariable: 'harborUser')]) {
                        sh "./shell_version/pushdocker.sh ${harborUser} ${harborPassword} ${build_tag}"
                    }
         }
    stage('清理本地镜像') {
                echo "4.Clean Local Docker Image"
                sh "./shell_version/cleandocker.sh ${build_tag}"
    }
    stage('K8S构建项目') {
                echo "5. Deploy Stage"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 容器技术概念入门篇 从进程说开去 容器本身没有价值,有价值的是“容器编排”。 容器其实是一种沙盒技术。顾名思义,沙...
    白板时钟阅读 2,519评论 0 2
  • 我们学习语言第一个想法就是在环境搭建好了之后写一个Helloworld,我们学习如何在 k8s 上部署应用时,部署...
    集韵增广阅读 1,003评论 0 3
  • 以下所有环境都在vmware 15完成。 ===================centos7基础初始化=====...
    Status_3175阅读 17,531评论 1 1
  • 适用于大部分项目(大同小异) 一、 项目迁移到K8S平台是怎样的流程 要以镜像作为交付对象,不再以jar包、war...
    Linux丶晨星阅读 2,824评论 0 2
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11