nodejs前端项目
pipeline配置(根据k8s的yaml进行配置)
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
node ('jnlp-slave') {
stage('git-npm') {
sh '''
mkdir -p /root/.ssh
cp -r /kubectl/.ssh/id_rsa /root/.ssh/
chmod 0600 /root/.ssh/id_rsa
echo "StrictHostKeyChecking no">>/etc/ssh/ssh_config
echo "UserKnownHostsFile /dev/null" >>/etc/ssh/ssh_config
git clone -b $branch $gitURL
cd $PROJECT_NAME
npm install
npm run build
'''
}
stage('docker_build') {
withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
}
sh '''
cd $PROJECT_NAME
tar zcvf dist.tar.gz dist
cd kubernetes
mv ../dist.tar.gz ./
TAG=$(date +%y%m%d%H%M)
docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG -f Dockerfile .
docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
echo "y"| docker system prune -a
echo "推送镜像到金山云仓库成功"
echo "开始development"
if [ $ENV = gaea ];then
cp -r /kubectl/gaea/.kube /root/
echo "is gaea"
elif [ $ENV = prod ];then
cp -r /kubectl/prod/.kube /root/
echo "is prod"
else
cp -r /kubectl/pre/.kube /root/
echo "is pre"
fi
cp /kubectl/kubectl /usr/local/bin/
mkdir -p yaml
cp -r /kubectl/pre/nodejs/projec.yaml ./yaml/
cp -rf /kubectl/pre/service/service.yaml ./yaml/
sed -i "s#IMG_NAME:IMG_TAG#${DOCKER_IMG}/${PROJECT_NAME}:$TAG#g" yaml/*
sed -i "s#project_name#${PROJECT_NAME_PRE}#g" yaml/*
sed -i "s#_port_#${PORT}#g" yaml/*
number=$(kubectl get pods -n default | awk '{print $1}' | grep ${PROJECT_NAME_PRE}|wc -l)
if [ $number != 0 ];then kubectl delete -f ./yaml && kubectl create -f ./yaml ;else kubectl create -f ./yaml ;fi
sleep 10s
kubectl get all -n default | grep ${PROJECT_NAME_PRE}
'''
}
}
}
- yaml模板
---
apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
labels:
ksyun-app: "project_name"
name: "project_name"
namespace: "default"
spec:
minReadySeconds: 38
progressDeadlineSeconds: 2147483647
replicas: 2
revisionHistoryLimit: 2147483647
selector:
matchLabels:
ksyun-app: "project_name"
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: "RollingUpdate"
template:
metadata:
labels:
ksyun-app: "project_name"
spec:
containers:
- image: "IMG_NAME:IMG_TAG"
imagePullPolicy: "Always"
securityContext:
runAsUser: 0 #设置以ROOT用户运行容器
privileged: true
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 35
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: _port_
timeoutSeconds: 20
name: "project_name"
readinessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: _port_
timeoutSeconds: 20
name: "project_name"
resources:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "1"
memory: "2Gi"
terminationMessagePath: "/dev/termination-log"
terminationMessagePolicy: "File"
dnsPolicy: "ClusterFirst"
imagePullSecrets:
- name: "ksyunregistrykey"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
---
apiVersion: "v1"
kind: "Service"
metadata:
annotations:
# 配置绑定SLB
service.beta.kubernetes.io/ksc-loadbalancer-id: "57b2321e-3adf-420f-842c-353939a691d3"
name: "project_name"
namespace: "default"
spec:
externalTrafficPolicy: "Cluster"
ports:
- port: _port_
protocol: "TCP"
targetPort: _port_
selector:
ksyun-app: "project_name"
sessionAffinity: "None"
type: "LoadBalancer"
status:
loadBalancer:
ingress:
# SLB的IP地址
- ip: "172.31.252.11"
pipeline (利用kubectl set 命令直接修改镜像版本)
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
node ('jnlp-slave') {
stage('git-npm') {
sh '''
mkdir -p /root/.ssh
cp -r /kubectl/.ssh/id_rsa /root/.ssh/
chmod 0600 /root/.ssh/id_rsa
echo "StrictHostKeyChecking no">>/etc/ssh/ssh_config
echo "UserKnownHostsFile /dev/null" >>/etc/ssh/ssh_config
git clone -b $branch $gitURL
cd $PROJECT_NAME
npm install
npm run build
'''
}
stage('docker_build') {
withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
}
sh '''
cd $PROJECT_NAME
tar zcvf dist.tar.gz dist
cd kubernetes
mv ../dist.tar.gz ./
TAG=$(date +%y%m%d%H%M)
docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG -f Dockerfile .
docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
echo "y"| docker system prune -a
echo "推送镜像到金山云仓库成功"
echo "开始development"
if [ $ENV = gaea ];then
cp -r /kubectl/gaea/.kube /root/
echo "is gaea"
elif [ $ENV = prod ];then
cp -r /kubectl/prod/.kube /root/
echo "is prod"
else
cp -r /kubectl/pre/.kube /root/
echo "is pre"
fi
cp /kubectl/kubectl /usr/local/bin/
kubectl set image deployment/${PROJECT_NAME_PRE} -n default ${PROJECT_NAME_PRE}=${DOCKER_IMG}/${PROJECT_NAME}:$TAG
sleep 10s
kubectl get all -n default | grep ${PROJECT_NAME_PRE}
'''
}
}
}
Java 后端
pipeline(根据k8s的yaml进行配置)
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
node ('jnlp-slave') {
stage('git-maven') {
sh '''
export MAVEN_HOME=/maven
export PATH=$MAVEN_HOME/bin:$PATH
'''
checkout([$class: 'GitSCM', branches: [[name: '*/$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'e0574254-769a-46c7-a7d3-10dcb90c8d2b', url: 'http://newgit.op.ksyun.com/reorg-aihouse/aiot-uaa-resources.git']]])
sh '''
/maven/bin/mvn clean install -Dmaven.test.skip=true
ls *
'''
}
stage('docker_build') {
withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
}
sh '''
PROJECT_NAME="aiot-uaa-resources"
PORT="8802"
DOCKER_IMG="hub.kce.ksyun.com/aihouse"
cd kubernetes
mv ../aiot-uaa-resources-api/target/aiot-uaa-resources-api-0.0.1-SNAPSHOT.jar ./
TAG=$(date +%y%m%d%H%M)
docker build -t ${PROJECT_NAME}:$TAG .
docker tag ${PROJECT_NAME}:$TAG $DOCKER_IMG/${PROJECT_NAME}:$TAG
docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
echo "y"| docker system prune -a
echo "推送镜像到金山云仓库成功"
echo "开始development"
if [ $ENV = gaea ];then
cp -r /kubectl/gaea/.kube /root/
echo "is gaea"
elif [ $ENV = prod ];then
cp -r /kubectl/prod/.kube /root/
echo "is prod"
else
cp -r /kubectl/pre/.kube /root/
echo "is pre"
fi
cp /kubectl/kubectl /usr/local/bin/
cp -r /kubectl/yaml ./
sed -i "s#IMG_NAME:IMG_TAG#${DOCKER_IMG}/${PROJECT_NAME}:$TAG#g" yaml/*
sed -i "s#project_name#${PROJECT_NAME}#g" yaml/*
sed -i "s#_port_#${PORT}#g" yaml/*
sed -i "s#ENV#$ENV#g" yaml/*
number=$(kubectl get pods -n default | awk '{print $1}' | grep ${PROJECT_NAME}|wc -l)
if [ $number != 0 ];then kubectl delete -f ./yaml && kubectl create -f ./yaml ;else kubectl create -f ./yaml ;fi
sleep 60s
kubectl get all -n default | grep ${PROJECT_NAME}
'''
}
}
}
yaml配置模板
---
apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
labels:
ksyun-app: "project_name"
name: "project_name"
namespace: "default"
spec:
minReadySeconds: 38
progressDeadlineSeconds: 2147483647
replicas: 2
revisionHistoryLimit: 2147483647
selector:
matchLabels:
ksyun-app: "project_name"
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: "RollingUpdate"
template:
metadata:
labels:
ksyun-app: "project_name"
spec:
containers:
- args:
- "start.sh"
command:
- "sh"
env:
- name: "profiles"
value: "ENV"
image: "IMG_NAME:IMG_TAG"
imagePullPolicy: "Always"
securityContext:
runAsUser: 0 #设置以ROOT用户运行容器
privileged: true
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 35
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: _port_
timeoutSeconds: 20
name: "project_name"
readinessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 20
successThreshold: 1
tcpSocket:
port: _port_
timeoutSeconds: 20
name: "project_name"
resources:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "1"
memory: "2Gi"
terminationMessagePath: "/dev/termination-log"
terminationMessagePolicy: "File"
dnsPolicy: "ClusterFirst"
imagePullSecrets:
- name: "ksyunregistrykey"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
---
apiVersion: "v1"
kind: "Service"
metadata:
name: "project_name"
namespace: "default"
spec:
ports:
- port: _port_
protocol: "TCP"
targetPort: _port_
selector:
ksyun-app: "project_name"
sessionAffinity: "None"
type: "ClusterIP"
status:
loadBalancer: {}
pipeline(根据k8s的kubectl进行配置)
podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
node ('jnlp-slave') {
stage('git-maven') {
sh '''
export MAVEN_HOME=/maven
export PATH=$MAVEN_HOME/bin:$PATH
'''
sh '''
mkdir -p /root/.ssh
cp -r /kubectl/.ssh/id_rsa /root/.ssh/
chmod 0600 /root/.ssh/id_rsa
git clone -b $branch $gitURL
cd $PROJECT_NAME
/maven/bin/mvn clean install -Dmaven.test.skip=true
ls *
'''
}
stage('docker_build') {
withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
}
sh '''
cd $PROJECT_NAME
cd kubernetes
mv ../target/aiot-gateway-0.0.1-SNAPSHOT.jar ./
TAG=$(date +%y%m%d%H%M)
docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG .
docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
echo "y"| docker system prune -a
echo "推送镜像到金山云仓库成功"
echo "开始development"
if [ $ENV = gaea ];then
cp -r /kubectl/gaea/.kube /root/
echo "is gaea"
elif [ $ENV = prod ];then
cp -r /kubectl/prod/.kube /root/
echo "is prod"
else
cp -r /kubectl/pre/.kube /root/
echo "is pre"
fi
cp /kubectl/kubectl /usr/local/bin/
kubectl set image deployment/${PROJECT_NAME_PRE} -n default ${PROJECT_NAME_PRE}=${DOCKER_IMG}/${PROJECT_NAME}:$TAG
sleep 30s
kubectl get all -n default | grep ${PROJECT_NAME}
'''
}
}
}