GitlabCI+Kaniko让你摆脱jenkins
使用GitlabCI+kaniko摆脱dockr in docker 的困境
架构图

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或者微信都可以
欢迎大家与我讨论,如果内容有问题与我联系修改
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐




所有评论(0)