当前位置: 首页 > news >正文

使用GitLab CI构建持续集成案例

1. 部署GitLab

(1)基础准备

解压软件包并导入镜像:

[root@master ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz
[root@master ~]# tar -zxvf Gitlab-CI.tar.gz
[root@master ~]# ctr -n k8s.io image import gitlab-ci/images/images.tar
[root@master ~]# docker load < gitlab-ci/images/images.tar
(2)部署GitLab服务

新建命名空间gitlab-ci:

[root@master ~]# kubectl create ns gitlab-ci
namespace/gitlab-ci created

在gitlab-ci命名空间下部署GitLab,将80端口以NodePort方式对外暴露为30880,YAML资源文件如下:

[root@master ~]# cd gitlab-ci
[root@master gitlab-ci]# vi gitlab-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: gitlabnamespace: gitlab-cilabels:name: gitlab
spec:selector:matchLabels:name: gitlabtemplate:metadata:name: gitlablabels:name: gitlabspec:containers:- name: gitlabimage: gitlab/gitlab-ce:latestimagePullPolicy: IfNotPresentenv:- name: GITLAB_ROOT_PASSWORDvalue: Abc@1234- name: GITLAB_ROOT_EMAILvalue: 123456@qq.comports:- name: httpcontainerPort: 80volumeMounts:- name: gitlab-configmountPath: /etc/gitlab- name: gitlab-logsmountPath: /var/log/gitlab- name: gitlab-datamountPath: /var/opt/gitlabvolumes:- name: gitlab-confighostPath:path: /home/gitlab/conf- name: gitlab-logshostPath:path: /home/gitlab/logs- name: gitlab-datahostPath:path: /home/gitlab/data

创建service服务释放端口

[root@master gitlab-ci]# vi gitlab-svc.yaml
apiVersion: v1
kind: Service
metadata:name: gitlabnamespace: gitlab-cilabels:name: gitlab
spec:type: NodePortports:- name: httpport: 80targetPort: httpnodePort: 30880selector:name: gitlab

创建资源:

[root@master gitlab-ci]# kubectl apply -f gitlab-deploy.yaml
deployment.apps/gitlab created
[root@master gitlab-ci]# kubectl apply -f gitlab-svc.yaml
service/gitlab created

查看Pod:

[root@master gitlab-ci]# kubectl -n gitlab-ci get pods
NAME                      READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp    1/1     Running   0          45s
(3)自定义hosts

查看GitLab Pod的IP地址:

[root@master gitlab-ci]# kubectl -n gitlab-ci get pods -owide
NAME                      READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
gitlab-7b54df755-6ljtp    1/1     Running   0          50s   10.244.1.43   k8s-worker-node1   <none>           <none>

在集群中自定义hosts添加gitlab Pod的解析:

[root@master gitlab-ci]# kubectl edit configmap coredns -n kube-system
........
apiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpattl 30}
## 添加以下字段hosts {10.244.1.43 gitlab-7b54df755-6ljtpfallthrough}prometheus :9153
##删除以下三行字段forward . /etc/resolv.conf {max_concurrent 1000}cache 30loopreloadloadbalance}
........
[root@master gitlab-ci]# kubectl -n kube-system rollout restart deploy coredns
deployment.apps/coredns restarted

进入gitlab pod中

[root@master gitlab-ci]# kubectl exec -ti -n gitlab-ci gitlab-7b54df755-6ljtp bash
root@gitlab-7b54df755-6ljtp:/# vi /etc/gitlab/gitlab.rb 

在首行添加(ip为pod IP地址)

external_url 'http://10.244.1.43:80'
root@gitlab-7b54df755-6ljtp:/# reboot
root@gitlab-7b54df755-6ljtp:/# exit
(4)访问GitLab

查看Service:

[root@master gitlab-ci]# kubectl -n gitlab-ci get svc
NAME     TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
gitlab   NodePort   10.96.108.3   <none>        80:30880/TCP   3m33s

通过http://10.24.2.14:30880访问GitLab,用户名123456@qq.com,密码Abc@1234,如图1所示:

1 devops

图1

(5)上传项目包

点击“Create a project”按钮,如图2所示:

2 devops

图2

点击“Create blank project”创建项目demo-2048,可见等级选择“Public”,如图3所示:

3 devops

图3

点击“Create project”,进入项目,如图4所示:

4 devops

图4

将源代码推送到项目中:

[root@master gitlab-ci]# cd /root/gitlab-ci/demo-2048
[root@master demo-2048]# git config --global user.name "administrator"
[root@master demo-2048]# git config --global user.email "admin@example.com"
[root@master demo-2048]# git remote remove origin
[root@master demo-2048]# git remote add origin http://10.24.2.14:30880/root/demo-2048.git
[root@master demo-2048]# git add .
[root@master demo-2048]# git commit -m "initial commit"
[master (root-commit) 105c032] initial commit
[root@master demo-2048]# git push -u origin drone
Username for 'http://10.24.2.14:30880': root
Password for 'http://root@10.24.2.14:30880':              #输入密码Abc@1234
Counting objects: 189, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (137/137), done.
Writing objects: 100% (189/189), 43.35 KiB | 0 bytes/s, done.
Total 189 (delta 40), reused 0 (delta 0)
remote: Resolving deltas: 100% (40/40), done.
To http://10.24.2.14:30880/root/cloud-manager.git* [new branch]      master -> master
Branch master set up to track remote branch master from origin.

刷新页面如图5、图6所示:

5 devops

图5

6 devops

图6

2. 部署GitLab CI Runner
(1)获取 GitLab CI Register Token

登录GitLab管理界面(http://10.24.2.14:30880/admin),然后点击左侧菜单栏中的CI/CD下的Runners,如图7所示:

7 devops

图7

点击右侧按钮,如图8所示:

8 devops

图8

记录下参数Registration token的值,后续注册Runners时会用到该参数。

(2)修改GitLab Runner配置清单

首先创建一个名为gitlab-ci的serviceAccount:

[root@master ~]# cd /root/gitlab-ci/
[root@master gitlab-ci]# cat runner-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: gitlab-cinamespace: gitlab-ci
[root@master gitlab-ci]# cat runner-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: gitlab-cinamespace: gitlab-ci
rules:- apiGroups: [""]resources: ["*"]verbs: ["*"]
[root@master gitlab-ci]# cat runner-rb.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: gitlab-cinamespace: gitlab-ci
subjects:
- kind: ServiceAccountname: gitlab-cinamespace: gitlab-ci
roleRef:kind: Rolename: gitlab-ciapiGroup: rbac.authorization.k8s.io
[root@master gitlab-ci]# kubectl apply -f runner-sa.yaml 
serviceaccount/gitlab-ci created
[root@master gitlab-ci]# kubectl apply -f runner-role.yaml 
role.rbac.authorization.k8s.io/gitlab-ci created
[root@master gitlab-ci]# kubectl apply -f runner-rb.yaml 
rolebinding.rbac.authorization.k8s.io/gitlab-ci created
[root@master gitlab-ci]# kubectl -n gitlab-ci get sa
NAME        SECRETS   AGE
default     1         10m
gitlab-ci   1         21s

给default用户赋权:

[root@master gitlab-ci]# vi default.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: defaultlabels:k8s-app: gitlab-default
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: defaultnamespace: gitlab-ci
[root@master gitlab-ci]# kubectl apply -f default.yaml 
clusterrolebinding.rbac.authorization.k8s.io/default created

修改values.yaml文件

[root@master gitlab-ci]# tar -zxvf gitlab-runner-0.43.0.tgz
[root@master gitlab-ci]# vi gitlab-runner/values.yaml
...## Use the following Kubernetes Service Account name if RBAC is disabled in this Helm chart (see rbac.create)### serviceAccountName: defaultserviceAccountName: gitlab-ci   #添加,注意缩进格式
... 
## The GitLab Server URL (with protocol) that want to register the runner against
## ref: https://docs.gitlab.com/runner/commands/index.html#gitlab-runner-register
##
# gitlabUrl: http://gitlab.your-domain.com/
gitlabUrl: http://10.24.2.14:30880/      #添加,缩进顶格
...
## The Registration Token for adding new Runners to the GitLab Server. This must
## be retrieved from your GitLab Instance.
## ref: https://docs.gitlab.com/ce/ci/runners/index.html
##
# runnerRegistrationToken: ""
runnerRegistrationToken: "riU8c4D2SNkKAv8GS9q_"    #添加,缩进顶格
...config: |[[runners]][runners.kubernetes]namespace = "{{.Release.Namespace}}"image = "ubuntu:16.04"privileged = true     #添加,注意缩进格式
...
## For RBAC support:
rbac:create: true		#修改为true

在进行maven/npm等构建工具打包时所依赖的包默认会从私服获取,为了加快构建速度可以在本地缓存一份,在此,需要创建PVC来持久化构建缓存,加速构建速度。为了节省存储空间决定不在每个项目中存储构建缓存,而是配置全局缓存。

创建一个PVC用于挂载到Pod中使用:

[root@master gitlab-ci]# cat gitlab-runner/templates/pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:name: ci-build-cache-pvnamespace: gitlab-cilabels:type: local
spec:storageClassName: manualcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/opt/ci-build-cache"
[root@master gitlab-ci]# cat gitlab-runner/templates/pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ci-build-cache-pvcnamespace: gitlab-ci
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi

编辑values.yaml文件,添加构建缓存信息配置:

[root@master gitlab-ci]# vi gitlab-runner/values.yaml
## configure build cache
cibuild:cache:pvcName: ci-build-cache-pvcmountPath: /home/gitlab-runner/ci-build-cache

使用官方提供的runner镜像注册runner,默认的runner配置文件在/home/gitlab-runner/.gitlab-runner/config.toml。编辑templates/configmap.yml文件,entrypoint部分添加runner配置。在start之前添加,这样runner在创建构建Pod的时候会根据配置挂载PVC:

[root@master gitlab-ci]# vi gitlab-runner/templates/configmap.yaml
cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
[[runners.kubernetes.volumes.pvc]]
name = "{{.Values.cibuild.cache.pvcName}}"
mount_path = "{{.Values.cibuild.cache.mountPath}}"
EOF# Start the runner
exec /entrypoint run --user=gitlab-runner \--working-directory=/home/gitlab-runner
### 注意缩进cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF[[runners.kubernetes.volumes.pvc]]name = "{{.Values.cibuild.cache.pvcName}}"mount_path = "{{.Values.cibuild.cache.mountPath}}"EOF# Start the runnerexec /entrypoint run --user=gitlab-runner \--working-directory=/home/gitlab-runner
(3)部署GitLab Runner

部署GitLab Runner:

[root@master gitlab-ci]# helm -n gitlab-ci install gitlab-runner gitlab-runner
NAME: gitlab-runner
LAST DEPLOYED: Wed Jul 27 11:17:11 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Your GitLab Runner should now be registered against the GitLab instance reachable at: "http://10.24.2.14:30880/"Runner namespace "gitlab-ci" was found in runners.config template.

查看Realse和Pod:

[root@master gitlab-ci]# helm -n gitlab-ci list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
gitlab-runner   gitlab-ci       1               2022-07-27 11:17:11.456495093 +0800 CST deployed        gitlab-runner-0.43.0    15.2.0     
[root@master gitlab-ci]# kubectl -n gitlab-ci get pods
NAME                             READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp           1/1     Running   0          30m
gitlab-runner-5bc5578655-2ct85   1/1     Running   0          58s

返回Runners页面并刷新,如图9所示:

9 devops

图9

可以看到Runner状态为online,表明已经注册成功。

3. 配置GitLab
(1)添加Kubernetes集群

在GitLab Admin界面下,依次点击“Settings”→“Network”,展开“Outbound requests”,勾选“Allow requests to the local network from webhooks and integrations”,并保存。如图10所示:

10 devops

图10

进入demo-2048项目,新建配置文件(.gitlab/agents//config.yaml),此处为.gitlab/agents/kubernetes-agent/config.yaml,如图11所示:

11 devops

图11

config.yaml文件格式如下:

gitops:manifest_projects:- id: gitlab-org/cluster-integration/gitlab-agentdefault_namespace: my-nspaths:# Read all YAML files from this directory.- glob: '/team1/app1/*.yaml'# Read all .yaml files from team2/apps and all subdirectories.- glob: '/team2/apps/**/*.yaml'# If 'paths' is not specified or is an empty list, the configuration below is used.- glob: '/**/*.{yaml,yml,json}'reconcile_timeout: 3600sdry_run_strategy: noneprune: trueprune_timeout: 3600sprune_propagation_policy: foregroundinventory_policy: must_match

依次点击左侧菜单栏“Operate”→“Kubernetes clusters”,如图12所示:

12 devops

图12

点击“Connect a cluster”,并选择配置文件kubernetes-agent,如图13所示:

13 devops

图13

点击“Register”,如图14所示:

14 devops

图14

通过如下命令安装agent,将config.token和config.kasAddress的值修改为上一步页面显示的值:

[root@master gitlab-ci]# helm upgrade --install kubernetes-agent  gitlab-agent-1.1.0.tgz     --namespace gitlab-ci     --create-namespace     --set image.tag=v16.2.0     --set config.token=vTPAASMpwTW-tEQ3NHYc3y5YKCHCFep466q52dgaRCstXyXDzg     --set config.kasAddress=ws://10.244.0.23/-/kubernetes-agent/
NAME: kubernetes-agent
LAST DEPLOYED: Wed Jul 13 17:27:21 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master gitlab-ci]# helm upgrade --install kubernetes-agent gitlab-agent-1.1.0.tgz--namespace gitlab-ci--create-namespace--set image.tag=v16.2.0--set config.token=vTPAASMpwTW-tEQ3NHYc3y5YKCHCFep466q52dgaRCstXyXDzg--set config.kasAddress=ws://10.244.0.23/-/kubernetes-agent/
NAME: kubernetes-agent
LAST DEPLOYED: Wed Jul 13 17:27:21 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: Nonehelm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install kubernetes-agent gitlab-agent-1.1.0.tgz \--namespace gitlab-ci \--create-namespace \--set image.tag=v16.2.0 \--set config.token=NgYd7JkZN4T1dcWpx9PCsTC3FgVx3MQAycyXQArAGukxn_ymwA \--set config.kasAddress=ws://192.168.100.3:30880/-/kubernetes-agent/helm install kubernetes-agent gitlab-agent-1.1.0.tgz \--namespace gitlab-ci \--create-namespace \--set image.tag=v16.2.0 \--set config.token=NgYd7JkZN4T1dcWpx9PCsTC3FgVx3MQAycyXQArAGukxn_ymwA \--set config.kasAddress=ws://192.168.100.3:30880/-/kubernetes-agent/

查看Release和Pod:

[root@ k8s-master-node1 gitlab-ci]# helm -n gitlab-ci list
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
gitlab-runner           gitlab-ci       1               2022-07-27 11:17:11.456495093 +0800 CST deployed        gitlab-runner-0.43.0    15.2.0     
kubernetes-agent        gitlab-ci       1               2022-07-27 11:22:27.285028745 +0800 CST deployed        gitlab-agent-1.1.0      v15.0.0
[root@master gitlab-ci]# kubectl get pod -n gitlab-ci 
NAME                                             READY   STATUS    RESTARTS      AGE
gitlab-7665cf47c5-8ghbw                          1/1     Running   1 (89m ago)   96m
gitlab-runner-665f4647b9-zhrlh                   1/1     Running   0             18m
kubernetes-agent-gitlab-agent-6df7787756-b4rzx   1/1     Running   0             14s

点击“Close”并刷新界面,如图15所示:

15 devops

图15

可以看到,Kubernetes集群已连接成功。

(2)开启Container Registry

在GitLab中开启Container Registry,进入demo-2048项目,依次点击“Settings”→“CI/CD”,如图16所示:

16 devops

图16

展开“Variables”,配置镜像仓库相关的参数。

添加REGISTRY变量,其值为Harbor仓库地址,如图17所示:

17 devops

17图

添加完成后如图18所示:

18 devops

图18

然后继续添加变量REGISTRY_IMAGE(demo)、REGISTRY_USER(admin)、REGISTRY_PASSWORD(Harbor12345)、REGISTRY_PROJECT(demo)和HOST(10.24.2.14),添加完成后保存变量,如图19所示:

19 devops

图19

4. Harbor仓库配置
(1)更新Harbor仓库

修改harbor仓库的helm配置:

[root@master ~]# vi /opt/harbor/values.yaml#将127.0.0.1改为master节点实际IP地址
externalURL: http://10.26.7.197:80
…

修改完成后,更新harbor仓库:

[root@master ~]# helm -n harbor upgrade harbor /opt/harbor
(2)添加demo仓库

登录Harbor仓库新建一个公开项目demo,如图20所示:

20 devops

图20

将镜像tomcat:8.5.64-jdk8推送到该项目中:

[root@master gitlab-ci]# ctr -n k8s.io images tag docker.io/library/tomcat:8.5.64-jdk8 10.24.2.14/library/tomcat:8.5.64-jdk8
[root@master gitlab-ci]# ctr -n k8s.io images push  10.24.2.14/library/tomcat:8.5.64-jdk8   --plain-http=true  --user admin:Harbor12345 

修改containerd配置文件

[root@master ~]# vi /etc/containerd/config.toml 
•••[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.com"]endpoint = ["http://harbor.com"][plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.24.2.14"]endpoint = ["http://10.24.2.14"]
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart containerd
5. .gitlab-ci.yaml文件
(1).gitlab-ci.yaml文件简介

GitLab CI通过YAML文件管理配置job,定义了job应该如何工作。该文件存放于仓库的根目录,默认名为.gitlab-ci.yaml。

  • gitlab-ci.yml文件中指定了CI的触发条件、工作内容、工作流程,编写和理解此文件是CI实战中最重要的一步,该文件指定的任务内容总体构成了1个pipeline、1个pipeline包含不同的stage执行阶段、每个stage包含不同的具体job脚本任务。

当有新内容push到仓库,或者有代码合并后,GitLab会查找是否有.gitlab-ci.yml文件,如果文件存在,Runners将会根据该文件的内容开始build本次commit。

(2)Pipeline

一个.gitlab-ci.yml文件触发后会形成一个pipeline任务流,由gitlab-runner来运行处理。一次Pipeline其实相当于一次构建任务,里面可以包含很多个阶段(Stages),如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。任何提交或者Merge Request的合并都可以触发Pipeline构建。

(3)Stages

Stages表示一个构建阶段,也就是上面提到的一个流程。我们可以在一次Pipeline中定义多个Stages,这些Stages会有以下特点:

  • 所有Stages会按照顺序运行,即当一个Stage完成后,下一个Stage才会开始
  • 只有当所有Stages完成后,该构建任务(Pipeline)才会成功
  • 如果任何一个Stage失败,那么后面的Stages不会执行,该构建任务(Pipeline)失败
(4)Jobs

Jobs表示构建工作,表示某个Stage里面执行的工作。我们可以在Stages里面定义多个Jobs,这些Jobs会有以下特点:

  • 相同Stage中的Jobs会并行执行
  • 相同Stage中的Jobs都执行成功时,该Stage才会成功
  • 如果任何一个Job失败,那么该Stage失败,即该构建任务(Pipeline)失败

一个Job被定义为一列参数,这些参数指定了Job的行为。下表列出了主要的Job参数,见表2:

表2

参数是否必须描述
script由Runner执行的shell脚本或命令
image用于docker镜像
services用于docker服务
stages定义构建阶段
typesstages 的别名(已废除)
before_script定义在每个job之前运行的命令
after_script定义在每个job之后运行的命令
variable定义构建变量
cache定义一组文件列表,可在后续运行中使用
(5)编写流水线脚本

编写.gitlab-ci.yml:

stages:- build- release- reviewvariables:MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"maven_build:image: maven:3.6-jdk-8stage: buildonly:- dronescript:- cp -r /opt/repository /opt/cache/.m2/- mvn clean install -DskipTests=true- cd target && jar -xf 2048.war- cp -rfv 2048 /home/gitlab-runner/ci-build-cacheimage_build:image: docker:18.09.7stage: releasevariables:DOCKER_DRIVER: overlayDOCKER_HOST: tcp://localhost:2375#CI_DEBUG_TRACE: "true"services:- name: docker:18.09.7-dindcommand: ["--insecure-registry=0.0.0.0/0"]script:- cp -rfv /home/gitlab-runner/ci-build-cache/2048 .- sed -i "s/10.24.2.3/$REGISTRY/g" ./Dockerfiles/Dockerfile- docker build -t "${REGISTRY_IMAGE}:latest" -f ./Dockerfiles/Dockerfile .- docker tag "${REGISTRY_IMAGE}:latest" "${REGISTRY}/${REGISTRY_PROJECT}/${REGISTRY_IMAGE}:latest"- docker login -u "${REGISTRY_USER}" -p "${REGISTRY_PASSWORD}" "${REGISTRY}"- docker push "${REGISTRY}/${REGISTRY_PROJECT}/${REGISTRY_IMAGE}:latest"deploy_review:image: kubectl:1.22stage: reviewonly:- dronescript:- sed -i "s/REGISTRY/$REGISTRY/g" template/demo-2048.yaml- kubectl apply -f template/
6. 构建CICD
(1)触发构建

流水线脚本编写完成后会自动触发构建,进入demo-2048项目,依次点击“build”→“Pipelines”,可以看到GitLab CI开始执行构建任务了,如图21所示:

21 devops

图21

点击“running”可查看构建详情,如图22所示:

22 devops

图22

点击流水线的任一阶段可查看构建详情,如图23所示:

23 devops

图23

此时Runner Pod所在的namespace下面也会出现1个新的Pod:

[root@master gpmall]# kubectl -n gitlab-ci get pods
NAME                                             READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp                           1/1     Running   0          3h6m
gitlab-runner-5dc59b5b77-x2vw8                   1/1     Running   0          129m
kubernetes-agent-gitlab-agent-64bf6d87f4-vgxbx   1/1     Running   0          151m
runner-x16szo9v-project-2-concurrent-0jzq5h      2/2     Running   0          8s

这个新Pod就是用来执行具体的Job任务的。

构建完成后如图24所示:

24 devops

图24

查看新发布的Pod:

[root@master manifests]# kubectl -n gitlab-ci get pods
NAME                                             READY   STATUS    RESTARTS   AGE
demo-2048-6bf767d4d4-kks65                       1/1     Running   0          2m22s
gitlab-7b54df755-6ljtp                           1/1     Running   0          3h8m
gitlab-runner-5dc59b5b77-x2vw8                   1/1     Running   0          132m
kubernetes-agent-gitlab-agent-64bf6d87f4-vgxbx   1/1     Running   0          153m
(2)查看Harbor

登录Harbor仓库,进入demo项目,如图25所示:

25 devops

图25

可以看到镜像已构建并上传成功。

(3)验证服务

查看Service:

[root@master gitlab-ci]# kubectl -n gitlab-ci get svc
NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
demo-2048   NodePort   10.96.222.104   <none>        8080:8889/TCP   3m14s

访问Service,如图26所示:

26 devops

图26

相关文章:

使用GitLab CI构建持续集成案例

1. 部署GitLab &#xff08;1&#xff09;基础准备 解压软件包并导入镜像&#xff1a; [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…...

WSL2环境下Ubuntu的Docker安装与配置

检查是否存在安装残留&#xff0c;移除可能会造成冲突的组件。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done从apt Docker仓库中安装官方GPG key&#xff1a; sudo apt-get update …...

使用vscode调试wails项目(golang桌面GUI)

文章目录 安装 Golang 环境安装 NPM安装 VSCode安装 Go 插件安装 Go 插件依赖工具安装 Wails系统检查 准备项目Visual Studio Code 配置安装和构建步骤参考资料 安装 Golang 环境 访问 golang 官网下载环境安装包&#xff1a;https://go.dev/dl/ 安装 NPM 从 Node 下载页面 …...

Java中注解与反射的详细介绍

注解和反射 一、注解 什么是注解&#xff1f;Annotation Override &#xff1a;表示一个方法声明打算重写超类的另一个方法声明Deprecated&#xff1a;表示不鼓励程序员使用这样的元素&#xff0c;&#xff08;此注释可以用于修饰方法&#xff0c;属性&#xff0c;类&#xf…...

Redis 过期时间删除策略详解

在使用 Redis 时&#xff0c;设置键的过期时间是一项非常有用的功能。它可以帮助我们自动清理不再需要的数据&#xff0c;节省内存空间。那么&#xff0c;Redis 是如何处理这些带有过期时间的键呢&#xff1f;这就涉及到 Redis 的过期时间删除策略。 一、Redis 过期键的判定 R…...

C语言_内存函数

内存函数是 C 标准库中的一组函数&#xff0c;用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下&#xff1a; void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项&#xff1a; memcp…...

基于s32ds平台指定变量储存位置

开启一段ram空间 打开ld文件 配置一段ram空间 开辟一个段 .shareable_data1 : {. ALIGN(4);KEEP(*(.mcal_shared_data1)) . ALIGN(4);} > int_sram_shareable1定义一个变量并将变量指定在段中 volatile uint32 u32SbcmGenState __attribute__((section (".mcal_s…...

什么是快充协议、支持多协议的USB Type-C受电端取电芯片

随着快充技术的不断发展&#xff0c;传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间&#xff0c;给我们的生活带来了很多便利。 什么是快充协议 快充协议是快充技术的核心&#xff0c;现如今市面上已经有很多种快充协议…...

在Vue CLI项目中使用ECharts:详细指南

在Vue CLI项目中使用ECharts&#xff1a;详细指南 ECharts 是一款由百度开源的数据可视化图表库&#xff0c;它提供了丰富的图表类型和高度的可定制性。在Vue CLI项目中集成ECharts&#xff0c;可以帮助我们快速地将数据以图形的方式展示给用户。以下是在Vue CLI项目中使用ECh…...

第二阶段:mysql(学完就隐藏版)

第一章&#xff1a;部署数据库系统&#xff08;注意关闭防火墙&#xff0c;selinux安装&#xff09; 安装mysql配置的相关文件&#xff1a;yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm&#xff08;centos9&#xff1a;yum install http…...

Spring Cloud微服务

引言 在过去的几十年中&#xff0c;软件架构的发展经历了从单体应用到微服务的演变。微服务架构是一种将应用程序分解为小的、独立的服务的方法&#xff0c;每个服务可以独立地部署和扩展。Spring Cloud为开发和部署基于Spring的微服务提供了一系列的工具和框架&#xff0c;使…...

后端复习资料

后端面试资料 语雀-图灵面试题 语雀-javaGuide 小林coding&#xff1a;https://www.xiaolincoding.com/ 面试鸭&#xff1a; https://www.mianshiya.com/ codehot香菜哥&#xff1a;https://codehot.cn/markdown/welfare 面试题&#xff1a; vizard自行整理 牛客Golang社招面…...

C++和OpenGL实现3D游戏编程【连载14】——VBO、VAO和EBO应用

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在&#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成&#xff0c;在此基础之上&#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式&a…...

AI + 智能互助平台(一点杂想)

随着人工智能的火爆&#xff0c;各种AI产品的兴起&#xff0c;我发现在解决人们日常需求的AI工具还是比较少的&#xff0c;还是比较依赖上一代的搜索功能。 是不是可以有这样的一款产品&#xff0c;需求方在平台上发布需求&#xff0c;提供方在平台上发布能力&#xff0c;AI自动…...

其他浏览器可以联网,但edge不能联网

问题描述&#xff1a; 今早edge无法上网&#xff0c;检测网络连接正常&#xff0c;而且其他chrome&#xff0c;Firefox和360浏览器都可以上网。 解决方案&#xff1a; 注意&#xff1a;为防止是代理问题&#xff0c;可以在扩展中禁用后再试试 如果没有代理或者禁用代理也不…...

Redis 缓存淘汰策略:LRU 和 LFU 的缺点及解决方案详解

引言 Redis 是一款高性能的内存数据库&#xff0c;它的缓存淘汰机制是保障内存使用效率和应用性能的关键。为了在内存有限的情况下保证缓存数据的有效性&#xff0c;Redis 提供了多种缓存淘汰策略&#xff0c;其中 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用…...

软件工程pipeline梳理

文章目录 软件工程pipeline梳理为什么需要梳理软件工程的pipeline软件工程pipeline的概念与注意点软件工程pipeline中的最大挑战rethink相关资料 软件工程pipeline梳理 为什么需要梳理软件工程的pipeline 反思自己日常工作中的认知和行为。以算法/软件工程师为代表的技术工种往…...

npm运行时出现npm ERR! builtins is not a function报错!

项目场景&#xff1a; 项目运行时什么都没动都没改突然运行不起来了&#xff0c;报错 TypeError: builtins is not a function 代码什么都没动&#xff0c;不是代码问题&#xff0c;排查后只有可能是node和npm的问题&#xff0c;所以卸载掉node重装重启 解决方案&#xff1a; …...

2024年软件设计师中级(软考中级)详细笔记【5】软件工程基础知识上(分值10+)

第5章软件工程 目录 前言第5章 软件工程基础知识&#xff08;上&#xff09;&#xff08;分值10&#xff09;5.1 软件工程概述5.1.4 软件过程 5.2 软件过程模型5.2.1 瀑布模型 (Waterfall Model)5.2.2 增量模型5.2.3 演化模型5.2.4 喷泉模型&#xff08;Water Fountain Model&a…...

C++:vector(题目篇)

文章目录 前言一、只出现一次的数字二、只出现一次的数字 II三、只出现一次的数字 III四、杨辉三角五、删除有序数组中的重复项六、数组中出现次数超过一半的数字七、电话号码的字母组合总结 前言 今天我们一起来看vector相关的题目~ 一、只出现一次的数字 只出现一次的数字…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...