当前位置: 首页 > 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相关的题目~ 一、只出现一次的数字 只出现一次的数字…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...