架构图

1.开发人员将代码提交到制定的分支(test/pre/prod)
2.由代码当中所包含的.gitlab-ci.yml所决定整个流程
3.例如提交到test分支以后,runner就会使用kubectl命令创建一个构建Image的Job到k8s集群中
4. 集群中的job根据runner传递过来的yml创建完以后,将编译好的image push到镜像仓库中,由k8s集群使用

安装GitLab

1. 下载 gitlab 清华大学源( 清华大学开源软件镜像站 | Tsinghua Open Source Mirror)
wget  https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.11.5-ce.0.el7.x86_64.rpm
2. rpm -ivh gitlab-ce-16.11.5-ce.0.el7.x86_64.rpm (注意这个时候可能提示缺少依赖,直接yum -y install即可)
3. 修改配置vim /etc/gitlab/gitlab.rb (修改url为自己的主机ip即可例如: http://192.168.2.100)
4. gitlab-ctl reconfigure 看到安装成功以后就可以按照提示找root的密码
5. 登录gitlab将自己电脑的公钥复制到偏好设置里的ssh密钥中去
6. 尝试在gitlab中创建项目,看是否能在本地成功pull,成功则进下一步,失败返回找原因
安装教程链接:  CentOS7安装Gitlab服务_centos7 安装gitlab-CSDN博客

安装配置Gitlab-runner

1. 本次gitlab-runner 不参与任何构建的动作,只是将buildimage的工作提交给kaniko
2. 在gitlab的项目中找到设置下的CI/CD下的runner,新建项目runner,找好配置即可

docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

先执行下面的操作,根据集群版本选择kubectl的版本

配置kubectl,因为是runner执行.gitlab-ci.yml里的内容到kaniko中去
curl -LO "https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/kubectl
kubectl version --client

如果有条件可以直接在这一步封装成一个image,然后把.kube/config一并注入到这个image当中
这个只需要在gitlab-runner 这个用户下就可以了



只看4.3-4.5即可,docker运行runner的命令用我上面提供的,gitlab-ci.yml用文档当中的就可以,如果执行没问题则进下一步有问题处理问题
安装gitlab-runner教程: centoso7下,使用docker安装gitlab、gitlab-runner实现CI/CD,以及nexus私有仓库,并实现springboot项目发布 - 想去放牛 - 博客园

准备kaniko相关secret

1. 阿里云镜像仓库的secret,因为build完以后要上传到仓库,这个可以是私有仓库也可以是阿里云
kubectl create secret generic kaniko-secret --from-file=./config.json
2. 这个config.json 其实就是docker login以后在/root/.docker/config.json就是一个加密了的登录仓库的信息,大概就是下面的这个样子

{
	"auths": {
	  "registry.cn-hangzhou.aliyuncs.com": {
		"auth": "dGI1NjkwODU5MDpxxxxxxxxxxxxxx"
	  }
	}
}

准备测试代码以及ci配置文件
 

java源代码在文章最上方免费下载即可也可以去github上下载https://github.com/wuchenyanghaoshuai/java-demo/tree/release/v0.0.2
注意需要修改的位置有
1. 源代码中有使用到数据库,初始化db的sql也已经在github中的db模块,修改一下链接地址以及用户名密码即可
2. dockerfile需要修改,你可以用我下面提供的
3. .gitlab-ci.yml需要修改

Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/wuchenyang/maven:3.8.6-openjdk-8 AS build

# 设置工作目录
WORKDIR /app

# 拉取代码(Kaniko 通过 --context 传入代码)
COPY . .

# 执行 Maven 构建
RUN mvn clean package -DskipTests -X

# 获取打包后的 JAR 并重命名
RUN mv target/*.jar app.jar



FROM registry.cn-hangzhou.aliyuncs.com/wuchenyang/jre-sky-agent:v1

COPY --from=build /app/app.jar /app.jar

# 复制并修改权限
COPY run.sh /run.sh

RUN chmod +x /run.sh \
    && sed -i 's/dl-cdn\.alpinelinux\.org/mirrors\.aliyun\.com/g' /etc/apk/repositories

CMD ["/run.sh"]

.gitlab-ci.yml

default:
  tags:
    - kubernetes # 使用 k8s 的 runner

stages:
  - build
  - deploy
build:
  stage: build
  script:
    - echo "我是 builddddddd"
    - echo "${CI_JOB_TOKEN}"
    - echo "我是 builddddddd"
    - sleep 10
  rules:
    - if: '$CI_COMMIT_BRANCH == "test" || $CI_COMMIT_BRANCH == "prod"'

deploy:
  stage: deploy
  script:
    - echo "当前用户:$(whoami)  HOME目录:$HOME"
    - echo "重新给gitlab-runner用户设置k8s权限"
    - echo "🚀 在 Kubernetes 上触发 Kaniko 构建镜像 🚀"
    - ls -l $HOME/.kube/config
    - export KUBECONFIG=$HOME/.kube/config
    - kubectl config view
    - kubectl get node
    - echo "CI_COMMIT_SHA:$CI_COMMIT_SHA"  # 调试,查看完整 SHA
    - COMMIT_SHORT=$(echo $CI_COMMIT_SHA | cut -c1-6)  # 截取前 6 位
    - echo "Short commit ID:$COMMIT_SHORT"
    - |
      kubectl apply -f - <<EOF
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: kaniko-build-${CI_COMMIT_REF_NAME}-${COMMIT_SHORT}
        namespace: default
      spec:
        backoffLimit: 1
        ttlSecondsAfterFinished: 300
        template:
          spec:
            containers:
            - name: kaniko
              image: gcr.io/kaniko-project/executor:latest
              imagePullPolicy: IfNotPresent
              args:
                - "--dockerfile=Dockerfile"
                - "--context=git://gitee.com/chenyang_wu/java-demo.git#refs/heads/${CI_COMMIT_REF_NAME}"
                - "--destination=registry.cn-hangzhou.aliyuncs.com/wuchenyang/java-demo:${CI_COMMIT_REF_NAME}-${COMMIT_SHORT}"
                - "--insecure"
                - "--verbosity=debug"
              volumeMounts:
              - name: kaniko-secret
                mountPath: /kaniko/.docker
            restartPolicy: Never
            volumes:
            - name: kaniko-secret
              secret:
                secretName: kaniko-secret
      EOF
  rules:
    - if: '$CI_COMMIT_BRANCH == "test" || $CI_COMMIT_BRANCH == "prod"'

backoffLimit 的意思是如果这个job启动失败了,最多在允许启动几个,默认好像是5还是6
ttlSecondAfterFinished 的意思是job 成功以后多少秒以后把job删除

--dockerfile=Dockerfile 为什么这么写? 因为kaniko默认会把代码拉到/kaniko/buildcontext/的位置,由于咱们的dockerfile在项目的根目录,所以不用做任何修改
--context 这块为什么用gitee的而不是gitlab的? 因为我的私有gitlab没有https,kaniko 有git 根https 还有s3 等到,就是没有http,走git其实也是https,无奈只能使用gitee来做,我这个仓库是公开的,直接用就行,专门为了测试
-- destination 就是上传到阿里云镜像仓库的哪个namespace下以及tag号为多少,这个根据自己的来修改
secret 这块就是刚刚创建的登录阿里云cr仓库的 
下面给大家截图一下具体目录结构

推送代码到gitlab的test分支

查看gitlab的runner有没有执行任务

查看k8s有没有生成job

查看阿里云cr有没有刚刚push上去的image

imageTag 就是 gitlab的commitId取的前六位

总结

使用gitlab-ci + kaniko 构建image 省去了在jenkins上手动点击构建的麻烦,开发者只需要将需要buildimage的代码 merge到指定的分支即可
如果大家有在做实验的时候有问题欢迎与我交流,留下您的QQ或者微信都可以
欢迎大家与我讨论,如果内容有问题与我联系修改

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐