创建GitLab源码项目并上传示例代码

1. 创建GitLab源码项目

  本示例中创建的GitLab源码项目地址为:https://gitee.com/SunHarvey/helloworld_java.git 

2. 执行以下命令获取示例代码并上传至GitLab

git clone https://gitee.com/SunHarvey/helloworld_java.git
git remote add helloworld https://gitee.com/SunHarvey/helloworld_java.git
git push helloworld master

在Kubernetes集群中安装GitLab Runner

1. 获取GitLab Runner的注册信息

  • 登录你的GitLab
  • 在顶部导航栏中,选择ProjectsYour projects。
  • Your projects页签下,选择相应的Project。
  • 在左侧导航栏中,选择SettingsCI / CD。
  • 单击Runners右侧的Expand。

GitLab集成kubernetes实现自动发布-LMLPHP

 获取URL和registration token, 这个url 和token下边要用到

GitLab集成kubernetes实现自动发布-LMLPHP

 2. 获取并修改GitLab Runner的Helm Chart

获取gitlab-runner

git clone https://github.com/haoshuwei/gitlab-runner.git

替换values.yaml文件中 gitlabUrl和runnerRegistrationToken字段, 就是上边看到的那个两个字段,

也可以配置全局的runner, 这个就不用每个项目都加了,具体方法请看文章末尾附录

gitlabUrl: http://xx.xx.xx.xx/
runnerRegistrationToken: "xxxxxx"

3 安装GitLab Runner

打包应用

helm package .

Successfully packaged chart and saved it to: /root/gitlab/gitlab-runner/gitlab-runner-0.1.37.tgz

安装应用

helm install --namespace gitlab --name  gitlab-runner *.tgz

查看相关的deployment/pod是否成功启动。若成功启动,则可在GitLab上看到注册成功的GitLab Runner

GitLab集成kubernetes实现自动发布-LMLPHP

 也可在kubernetes上查看

GitLab集成kubernetes实现自动发布-LMLPHP

设置全局变量

在GitLab的顶部导航栏中,选择Projects > Your projects。
在Your projects页签下,选择相应的Project。
在左侧导航栏中,选择Settings > CI / CD。
单击Variables右侧的Expand。添加GitLab Runner可用的环境变量。本示例中,添加以下三个变量。

GitLab集成kubernetes实现自动发布-LMLPHP

执行以下命令生成KubeConfig的编码字符串:

echo $(cat ~/.kube/config | base64) | tr -d " "

编写.gitlab-ci.yml

编写.gitlab-ci.yml文件,完成 helloworld 源码项目的编译构建、镜像推送和应用部署(可参考hellowrld源码项目中的.gitlab-ci.yml)

image: docker:stable
stages:
  - package
  - docker_build
  - deploy_k8s
variables:
  KUBECONFIG: /etc/deploy/config
  MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"
mvn_build_job:
  image: maven:3.6.2-jdk-14
  stage: package
  tags:
    - k8s-runner
  script:
    - mvn clean install
    - cp target/helloworld-1.0.jar /opt/cache/
docker_build_job:
  image: docker:latest
  stage: docker_build
  tags:
    - k8s-runner
  script:
    - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry-vpc.cn-hongkong.aliyuncs.com
    - cp /opt/cache/helloworld-1.0.jar target/helloworld-1.0.jar
    - docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID .
    - docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID

deploy_k8s_job:
  image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6
  stage: deploy_k8s
  tags:
    - k8s-runner
  script:
    - mkdir -p /etc/deploy
    - echo $kube_config |base64 -d > $KUBECONFIG
    - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml
    - cat deployment.yaml
    - kubectl apply -f deployment.yaml

.gitlab-ci.yml定义了一个Pipeline, 分三个阶段步骤执行

image: docker:stable     # Pipeline中各个步骤阶段的构建镜像没有指定时, 默认使用docker:stable镜像
stages:
  - package              # 源码打包阶段
  - docker_build         # 镜像构建和打包推送阶段
  - deploy_k8s           # 应用部署阶段
variables:
  KUBECONFIG: /etc/deploy/config   # 定义全局变量KUBECONFIG

maven源码打包阶段。

mvn_build_job:               # job名称
  image: maven:3.6.2-jdk-14  # 本阶段构建使用的构建镜像
  stage: package             # 关联的阶段名称
  tags:                      # GitLab Runner的tag
    - k8s-runner             # 指定runner-tag
  script:
    - mvn clean install      # 执行构建脚本
    - cp target/helloworld-1.0.jar /opt/cache/   # 构建物保存至缓存区

镜像构建和打包推送阶段

docker_build_job:
  image: docker:latest
  stage: docker_build
  tags:
    - k8s-runner
  script:
    - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry-vpc.cn-hongkong.aliyuncs.com     # 登录镜像仓库
    - cp /opt/cache/helloworld-1.0.jar target/helloworld-1.0.jar
    - docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID .   # 打包Docker镜像,使用的tag为本次Pipeline的ID
    - docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID         # 推送Docker镜像

应用部署阶段

deploy_k8s_job:      # job名称
  image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6  # 本阶段构建使用的构建镜像
  stage: deploy_k8s  # 关联的阶段名称
  tags:
    - k8s-runner     # GitLab Runner的tag
  script:
    - mkdir -p /etc/deploy
    - echo $kube_config |base64 -d > $KUBECONFIG                # 配置连接Kubernetes集群的config文件
    - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml    # 动态替换部署文件中的镜像tag
    - cat deployment.yaml
    - kubectl apply -f deployment.yaml

执行Pipeline

提交.gitlab-ci.yml文件后,Project gitlab-java-demo会自动检测到这个文件并执行Pipeline, 如下图所示

GitLab集成kubernetes实现自动发布-LMLPHP

GitLab集成kubernetes实现自动发布-LMLPHP

访问服务

如果部署文件中没有指定Namespace,则默认会部署到GitLab命名空间下
kubectl -n gitlab get svc
GitLab集成kubernetes实现自动发布-LMLPHP

注意事项

1. 取消Auto DevOps

GitLab集成kubernetes实现自动发布-LMLPHP

 附录:

 全局runner 添加

以管理员省份登录gitlab ,进入adminArea --> Overview --> Runners, 就可以看到 url 和token 了。

GitLab集成kubernetes实现自动发布-LMLPHP

 文本参考:https://help.aliyun.com/document_detail/106968.html

09-23 20:50