「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
1. gitlab配置
这里主要是在gitlab上新建一个Project,作为自己的代码仓库。
把自己需要部署的项目推上去即可。
这里大家可以看到 .idea 文件夹下的文件报红,通常情况下我们不想让它被git记录,我们可以向下面那样新建一个 .gitignore 文件中 配置一下即可。
接下来我们在这里写自己的项目代码即可。这套自动化部署流程主要地方还是在 jenkins+k8s+docker。
2. jenkins 配置
1. 创建jenkins流水线项目
这个的前提是你已经安装过 jenkins,首先新建一个jenkins 任务
这里我选择的是多分支流水线,你们可以根据自己实际情况来选择
在这个地方主要配置一下自己的git 账号信息
这部分也是根据自己需要选的
-
-
-
这里已经配置完成,我们电击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://镜像地址/
# EXPOSE 指定与外界交互的端口
EXPOSE 3000/tcp
# 只允许由一个 ENTRYPOINT 指令,配置容器使其 可执行化
# 在 /usr/share/nginx/html 执行 docsify serve 命令
ENTRYPOINT docsify serve /usr/share/nginx/html
# 维护者的信息
MAINTAINER bdc@gree.com.cn
把项目推上去,完成