pipeline {
agent {
node {
label 'nodejs'
}
}
parameters {
string(name:'APP_NAME', defaultValue: 'datashow-web', description:'服务名称') //需要修改,如oauth2-server
string(name:'APP_PORT', defaultValue: '80', description:'服务端口号') //需要修改,服务端口号
string(name:'HEALTH_PATH', defaultValue: '/', description:'健康检查接口') //需要修改,健康检查接口
string(name:'INITIALDELAYSECONDS',defaultValue: '3',description:'服务正常启动时间') //需要修改,服务正常启动时间
choice(name:'NAMESPACE', choices: ['sjj-test'], description:'项目空间名') //需要修改, 项目空间名
choice(name:'BUILD_TYPE', choices: ['sso','datashow'],description:'打包命令')
}
environment {
// 默认配置,无需修改
DOCKER_CREDENTIAL_ID = 'harbor-id'
GITLAB_CREDENTIAL_ID = 'gitlab-id'
SONAR_CREDENTIAL_ID = 'sonar-token'
KUBECONFIG_PROD_CREDENTIAL_ID = "kubeconfig-prod"
HARBOR_REGISTRY = '192.168.0.30:30002'
}
stages {
stage ('拉取代码') {
steps {
checkout(scm)
}
}
stage ('初始化环境变量') {
steps {
script {
env.IMAGE_URL = "$HARBOR_REGISTRY/$NAMESPACE/$APP_NAME:$BRANCH_NAME-$BUILD_NUMBER"
println(params)
}
container ('nodejs') {
sh 'printenv'
}
}
}
stage ('前端构建') {
steps {
container ('nodejs') {
sh '''
source /etc/profile
rm -rf node_modules dist
nvm install 14.20.0
nvm use 14.20.0
npm install --registry=http://192.168.0.66:4873
sso_admin="sso"
if [ $BUILD_TYPE != $sso_admin ] ; then
npm run build
else
npm run build:sso
fi
'''
}
}
}
stage ('构建镜像 & 推送镜像') {
steps {
container ('nodejs') {
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker build -t $IMAGE_URL -f Dockerfile .'
sh 'docker push $IMAGE_URL'
}
}
}
}
stage('开发环境部署') {
when{
anyOf { branch 'dev' }
}
steps {
container ('nodejs') {
sh 'envsubst < deploy/deployment.yaml | kubectl apply -f -'
}
}
}
stage('测试环境部署') {
when{
anyOf { branch 'test' }
}
steps {
container ('nodejs') {
sh 'envsubst < deploy/deployment.yaml | kubectl apply -f -'
}
}
}
stage('生产环境部署') {
when{
allOf { branch 'release' }
}
steps {
// input(id: 'deploy-to-production', message: 'deploy to production?', submitter: 'fusonghua')
container("nodejs") {
withCredentials([
kubeconfigFile(
credentialsId: env.KUBECONFIG_PROD_CREDENTIAL_ID,
variable: 'KUBECONFIG')
]) {
sh 'cat $KUBECONFIG && envsubst < deploy/deployment.yaml | kubectl apply -f -'
}
}
}
}
}
}
BUILD_TYPE 需要在parameters里面配置
Dockerfile文件配置
FROM nginx:1.20.0-alpine
COPY dist /usr/share/nginx/html/datashow-web
EXPOSE 80
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: $APP_NAME
namespace: $NAMESPACE
labels:
app: $APP_NAME
namespace: $NAMESPACE
branch: $BRANCH_NAME
group: $NAMESPACE-$BRANCH_NAME
annotations:
kubesphere.io/description: 大屏系统-前端
spec:
replicas: 1
selector:
matchLabels:
app: $APP_NAME
template:
metadata:
labels:
app: $APP_NAME
namespace: $NAMESPACE
branch: $BRANCH_NAME
group: $NAMESPACE-$BRANCH_NAME
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
containers:
- name: $APP_NAME
image: $IMAGE_URL
imagePullPolicy: IfNotPresent
ports:
- name: tcp-$APP_PORT
containerPort: $APP_PORT
protocol: TCP
resources:
requests:
memory: 5Mi
cpu: 5m
limits:
memory: 512Mi
cpu: 1000m
livenessProbe:
httpGet:
path: $HEALTH_PATH
port: $APP_PORT
scheme: HTTP
initialDelaySeconds: $INITIALDELAYSECONDS # 容器启动后第一次执行探测是需要等待多少秒
periodSeconds: 15 # 执行探测的频率
timeoutSeconds: 2 # 探测超时时间
readinessProbe:
httpGet:
path: $HEALTH_PATH
port: $APP_PORT
scheme: HTTP
initialDelaySeconds: $INITIALDELAYSECONDS
periodSeconds: 15
timeoutSeconds: 2
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
tolerations:
- key: group
operator: Equal
value: $NAMESPACE-$BRANCH_NAME
imagePullSecrets:
- name: harbor
---
kind: Service
apiVersion: v1
metadata:
name: $APP_NAME
namespace: $NAMESPACE
labels:
app: $APP_NAME
namespace: $NAMESPACE
branch: $BRANCH_NAME
group: $NAMESPACE-$BRANCH_NAME
annotations:
kubesphere.io/description: 大屏系统-前端
spec:
ports:
- name: tcp-$APP_PORT
protocol: TCP
port: $APP_PORT
targetPort: $APP_PORT
selector:
app: $APP_NAME
type: ClusterIP
k8s部署前台项目记录一下,仅供参考