CI/CD流程


一 资源申请

可参考如下格式:

Dear all:
	测试部**项目资源申请,信息如下:
	1.中文名:研发应用一部开发资源, 英文名:feitian
	2.项目最低资源需求:cpu:5、memory:5g
	3.GitLab Group 地址 http://git.xxx.com/feitian   token: xxx
	4.需要在开发环境创建数据库,命名为:feitia

如zg11项目的资源申请

 

然后反馈的东西有:

  1. rancher 账号信息,里面分配了相应命名空间的权限,看项目部署用到的 k8s 集群信息;
  2. harbor 账号信息,看该项目推送的镜像和公共镜像;
  3. nacos 账号信息,管理配置中心、服务注册发现;
  4. mysql 账号信息等项目需要的其他需登录认证的服务的账号信息;
  5. 已注册的 runner,在Group Settings -> CI/CD -> Runners -> Available group Runners 能看到已添加的 runner。

此处用到的账号信息有:

harbor:

rancher:

nacos:

二 配置

1. 在 nacos 添加配置信息

到 nacos 管理页面为该项目依次添加【命名空间】、【配置文件】

注意:这里的配置是测试环境配置,像各种中间件的信息请用测试环境的。其余部分参考开发环境的nacos配置

新建命名空间:

这儿命名空间id命名成和命名空间一样,不建议自动生成,因为在bootstrap中配的连接nacos的配置中的namespace是命名空间id而不是名称,所以把命名空间id指定成项目名在配置中可读性更强

找到刚添加的命名空间,添加配置文件:

添加配置文件信息,这儿需要添加 common.yml 和此服务对应的 demo-service.yml。注意这儿的文件名称与nacos中的prefix+file-extension,需要对应起来。

common.yml:里面一般是服务的公共配置,里面可以放 Redis 配置,日志配置文件路径等:

2.修改配置Dockerfile(docker)

编写 Dockerfile ,为本服务构建镜像。直接从开发的dev分支合并过来就有,里面有涉及到部分 项目配置、启动参数,这些参数请咨询具体项目运维/开发人员协助

测试人员基本会修改到的地方就是下面文件的指定镜像要暴露的端口+通过jar包启动两步,正常情况下是不需要修改的

# 指定来自公司私服的基础镜像
FROM registry.prod.xxxx.com/common/openjdk:8u252

# 设定时区
ENV TZ=Asia/Shanghai

# 设定工作目录
WORKDIR /app
# 将主机的文件复制到镜像
COPY facade/impl/target/$PACKAGE_NAME ./
# 解压文件
RUN tar -xf $PACKAGE_NAME --strip 1
# 创建config目录,后期可挂载配置文件用
RUN mkdir -p config

# 指定镜像要暴露的端口
EXPOSE 8080

# 通过jar包启动
CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "$JAR_PACKAGE_NAME"]

3.deployment.yml(k8s)

编写 k8s 部署配置文件,这里也是直接从开发的dev分支合并过来就有,我们基本不会做修改

apiVersion: v1
kind: Service
metadata:
    name: $APP_NAME
spec:
    ports:
  - name: http
    port: 8080
  selector:
    app: $APP_NAME
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $APP_NAME
spec:
  replicas: 1 # 运行容器的副本数,修改这里可以快速修改分布式节点数量
  selector:
    matchLabels:
      app: $APP_NAME
  template:  # 镜像模板的配置
    metadata:
      labels:
        app: $APP_NAME
    spec:
      imagePullSecrets: # 私有仓库配置了密钥
      - name: bbd-docker-registry
      containers: # docker容器的配置
      - name: $APP_NAME
        image: $IMAGE_NAME:$CI_COMMIT_SHORT_SHA # pull镜像的地址 ip:port/dir/images:tag
        resources: # 资源限制
          requests:
            memory: 200Mi
            cpu: 0.1
          limits:
            memory: 2Gi
            cpu: 1
        ports:  # 容器对外开放端口
        - name: http
          containerPort: 8080


4 .gitlab-ci.yml(gitlab)

集成环节,包括了 maven 打包,构建 docker 镜像,部署到 k8s 环境三个部分。这里需要测试人员编写该部分,编写语法参考dev阶段的:

# 测试分支部署到测试环境
kubernetes-deploy-testing:
  extends: .kubernetes-deploy
  only:
    refs:
   - test
     script:
  - kubectl apply -f deployment.yml -n $K8S_NAMESPACE --kubeconfig=$HOME/.kube/testing-config.yml

完整的yaml:

# 定义阶段
stages:
- build
- package
- deploy

# 定义变量,【不同项目这儿配置不同】
variables:
  APP_NAME: "demo-service"
  PACKAGE_NAME: "demo-service-1.0-SNAPSHOT.tar.gz"
  JAR_PACKAGE_NAME: "demo-service-1.0-SNAPSHOT.jar"
  IMAGE_NAME: "registry.prod.bbdops.com/feitian/demo-service"
  K8S_NAMESPACE: "feitian"

# 构建应用包
maven-build:
  stage: build
  tags:
  - feitian # 【不同项目这儿配置不同】注意 tags 需要与 gitlab runner 中的对应,否则找不到对应runner会一直处于pending状态
  variables:
    MAVEN_OPTS: "-Dmaven.test.skip=true"
    # -s,--settings 可指定setting.xml文件;-B,--batch-mode 非交互(批处理)模式下运行(需要输入时用默认值,不会停下等用户输入)
    MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  script:
  - mvn $MAVEN_CLI_OPTS package
  # 按 Tag 或分支重命名应用包
  - mv facade/impl/target/$PACKAGE_NAME facade/impl/target/$APP_NAME-$CI_COMMIT_REF_NAME.tar.gz
  artifacts:
    paths:
    - facade/impl/target/*.tar.gz

# 构建镜像
docker-build:
  stage: package
  tags:
  - feitian # 【不同项目这儿配置不同】
  variables:
  script:
  # 替换 Dockerfile 文件里的各变量为当前值
  - sed -i 's/$PACKAGE_NAME/'"$APP_NAME-$CI_COMMIT_REF_NAME.tar.gz"'/g' Dockerfile
  - sed -i 's/$JAR_PACKAGE_NAME/'"$JAR_PACKAGE_NAME"'/g' Dockerfile
  - docker build -t $IMAGE_NAME:$CI_COMMIT_REF_NAME -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA -t $IMAGE_NAME:latest .
  - docker push $IMAGE_NAME:$CI_COMMIT_REF_NAME
  - docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
  - docker push $IMAGE_NAME:latest

# 各环境公共的部署配置
.kubernetes-deploy:
  stage: deploy
  tags:
  - feitian # 【不同项目这儿配置不同】
  before_script:
  # 替换 Deployment 文件里的各变量为当前值
  - sed -i 's/$APP_NAME/'"$APP_NAME"'/g' deployment.yml
  # 避免使用 IMAGE_NAME 里的 / 来作为分隔符,否则需要转义
  - sed -i 's|$IMAGE_NAME|'"$IMAGE_NAME"'|g' deployment.yml
  - sed -i 's/$CI_COMMIT_SHORT_SHA/'"$CI_COMMIT_SHORT_SHA"'/g' deployment.yml

# 开发分支部署到开发环境
kubernetes-deploy-development:
  extends: .kubernetes-deploy
  only:
    refs:
    - dev
  script:
  - kubectl apply -f deployment.yml -n $K8S_NAMESPACE --kubeconfig=$HOME/.kube/development-config.yml

# 测试分支部署到测试环境
kubernetes-deploy-testing:
  extends: .kubernetes-deploy
  only:
    refs:
    - test
  script:
  - kubectl apply -f deployment.yml -n $K8S_NAMESPACE --kubeconfig=$HOME/.kube/testing-config.yml

# 主分支部署到生产环境,需手动执行
kubernetes-deploy-production:
  extends: .kubernetes-deploy
  only:
    refs:
    - master
  when: manual
  script:
  - kubectl apply -f deployment.yml -n $K8S_NAMESPACE --kubeconfig=$HOME/.kube/production-config.yml

5.域名配置

在rancher-负载均衡中找到前端项目,进入配置域名:

三 查看部署情况

在 rancher上可以看到部署成功/失败的服务:

部署失败的,进入对应服务查看日志,定位失败原因,若是环境问题,请找运维协助,部署问题,分析各类配置文件是否正确