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

2024广东省职业技能大赛云计算——构建CICD 部署2048小游戏

构建CI/CD

前言

题目如下:

构建CI/CD
编写流水线脚本.gitlab-ci.yml触发自动构建,具体要求如下:
(1)基于镜像maven:3.6-jdk-8构建项目的drone分支;
(2)构建镜像的名称:demo:latest;
(3)将镜像推送到Harbor仓库demo项目中;
(4)将demo-2048应用自动发布到Kubernetes集群gitlab-ci命名空间下。

.gitlab-ci.yml 是 GitLab 中用来定义 CI/CD 流水线的配置文件,可以自动化执行定义的任务,并且在不同的环境中运行。通过.gitlab-ci.yml ,我们可以将项目的 CI/CD 流程集成到GitLab中,并利用其自动化功能来提高开发效率、减少部署错误。

使用的环境是之前搭建的容器云平台:2024广东省职业技能大赛云计算赛项实战——容器云平台搭建-CSDN博客,只有master节点,使用的IP是192.168.200.15/24
并且根据之前文章的操作部署了GitLab、GitLab Runner,和将K8S连接到GitLab中:2024广东省职业技能大赛云计算赛项实战——集群部署GitLab-CSDN博客、2024广东省职业技能大赛云计算赛项实战——集群部署GitLab Runner-CSDN博客、2024广东省职业技能大赛云计算赛项实战——集群部署GitLab Agent-CSDN博客

操作过程

我们先在浏览器输入宿主机IP访问Harbor,使用用户名/密码:admin/Harbor12345进行登录

在这里插入图片描述

在项目主页点击"新建项目",根据题目要求设置项目名为demo。将项目设为公开,然后确定,创建项目

在这里插入图片描述

提供的项目包里其实是有一个.gitlab-ci.yml文件的,但是并不完全,需要我们修改一下

我们来到GitLab的Web界面,点击demo-2048项目左侧导航栏的"Code"→"Repository",切换到drone分支,可以在上方看到一个.gitlab-ci.yml文件,我们点击名称进去查看

在这里插入图片描述

将其内容复制

在这里插入图片描述

点击左侧导航栏的“Build”→“Pipeline editor”,切换到drone分支,点击"Configure pipeline"配置CI/CD管道

在这里插入图片描述

将我们复制的内容粘贴进去并修改

#修改前:
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: overlay2DOCKER_HOST: tcp://localhost:2375#启用调试模式,在执行作业时会输出额外的调试信息,包括所有执行的命令、环境变量设置和脚本的输出等等。#对于排查CI/CD作业中的问题非常有用,这个文件的编写者没有把它删掉,而是注释了#是不是在侧面告诉了我们,这个文件并不完全呢~#CI_DEBUG_TRACE: "true"services:- name: docker:18.09.7-dindentrypoint: ["dockerd-entrypoint.sh"]command: ["--insecure-registry", "10.24.2.14"]script:- docker login -u "${REGISTRY_USER}" -p "${REGISTRY_PASSWORD}" "${REGISTRY}"- 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 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/

可以看到文件里多处使用了变量

在这里插入图片描述

我们需要设置这些变量的值。根据操作的内容不难判断出:
由于进行了docker login命令登录Harbor注册表,所以:
REGISTRY_USER 是我们Harbor的用户名
REGISTRY_PASSWORD 是我们Harbor的密码
REGISTRY 是我们Harbor的地址
题目要求我们将构建的镜像命名为demo:latest,所以docker build操作里面的
REGISTRY_IMAGE 的值要设置为demo
题目还要求我们将镜像推送到Harbor仓库demo项目中,所以docker push操作里面的
REGISTRY_PROJECT 的值也是demo

#修改后:
stages:- build- release- reviewvariables:MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"REGISTRY_USER: "admin"REGISTRY_PASSWORD: "Harbor12345"REGISTRY: "192.168.200.15"REGISTRY_IMAGE: "demo"REGISTRY_PROJECT: "demo"maven_build:##image: maven:3.6-jdk-8stage: buildonly:- drone##满足题目要求1,基于镜像maven构建项目的drone分支script:- cp -r /opt/repository /opt/cache/.m2/- mvn clean install -DskipTests=true- cd target && jar -xf 2048.war#这个目录需要我们自行创建- mkdir -p /home/gitlab-runner/ci-build-cache- cp -rfv 2048 /home/gitlab-runner/ci-build-cacheimage_build:image: docker:18.09.7stage: release#这里让我很疑惑,因为正常而言,在进行docker login操作时,默认是使用更安全的https进行连接,访问的是443端口,而我们的Harbor是启用的http,使用80端口。#如果不做任何准备直接连接的话肯定是无法连接上的,所以文件的编写者才写了下面一大段,在command: ["--insecure-registry", "${REGISTRY}"]的这个地方,#配置了docker的守护程序,让其允许连接到指定的不安全注册表地址,但是我当时在做这道题的时候却发现,无论我怎么改,docker login还是强制使用https,访问443端口,导致无法连接上。#我当时猜想,也许是语法错误的原因没有生效,于是用了各种设置方式,此路不通,然后我猜想,会不会是使用镜像的问题,毕竟它提供的docker镜像里还有20.10.12版本以及其dind版本的,挨个尝试还是不行。#我也尝试过在entrypoint:里使用"--tls=false",让Docker守护进程在启动时不使用TLS,不使用加密通信,结果还是以失败告终。然而,当我把这一段都删掉时,他居然莫名其妙的成功了,这让我百思不得其解...#variables:#  DOCKER_DRIVER: overlay2#  DOCKER_HOST: tcp://localhost:2375#CI_DEBUG_TRACE: "true"#services:#  - name: docker:18.09.7-dind#    entrypoint: ["dockerd-entrypoint.sh"]#    command: ["--insecure-registry", "${REGISTRY}"]script:- docker login -u "${REGISTRY_USER}" -p "${REGISTRY_PASSWORD}" "${REGISTRY}"- cp -rfv /home/gitlab-runner/ci-build-cache/2048 .- sed -i "s/10.24.2.3/$REGISTRY/g" ./Dockerfiles/Dockerfile#满足要求2,构建镜像名称为demo:latest- docker build -t "${REGISTRY_IMAGE}:latest" -f ./Dockerfiles/Dockerfile .- docker tag "${REGISTRY_IMAGE}:latest" "${REGISTRY}/${REGISTRY_PROJECT}/${REGISTRY_IMAGE}:latest"#满足要求3,将镜像推送到Harbor的demo项目中- 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/

至于要求4,将应用自动发布到集群的gitlab-ci命名空间下这个要求,它在构建2048的yaml文件中已经完成了

[root@k8s-master-node1 gitlab-ci]# cat demo-2048/template/demo-2048.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: demo-2048namespace: gitlab-ci		#可以看到已经帮我们指定命名空间了
...  

在执行脚本之前,我们还需要做一个操作,再次之前,我们先看一下构建2048的Dockerfile文件

[root@k8s-master-node1 gitlab-ci]# cat demo-2048/Dockerfiles/Dockerfile   
FROM 10.24.2.3/library/tomcat:8.5.64-jdk8
RUN rm -rf /usr/local/tomcat/webapps/ROOT/
ADD 2048 /usr/local/tomcat/webapps/ROOT/

重点关注第一行,这里的ip地址在.gitlab.yml文件里我们已经通过sed命令改成Harbor仓库的地址了。可以看见,它基于的镜像是Harbor仓库的library项目里面的tomcat:8.5.64-jdk8这个镜像。但是我们的Harbor仓库还是空的呀,所以我们需要将这个镜像上传过去。

我们来到Harbor仓库,点击library项目进来,点击推送命令就可以查看上传镜像的命令示例

在这里插入图片描述

我们根据示例修改一下就行了

#首先先登录到Harbor注册表
[root@k8s-master-node1 gitlab-ci]# docker login -u admin -p Harbor12345 192.168.200.15
...
Login Succeeded
#给镜像打个标签
[root@k8s-master-node1 gitlab-ci]# docker tag tomcat:8.5.64-jdk8 192.168.200.15/library/tomcat:8.5.64-jdk8
#推送镜像
[root@k8s-master-node1 gitlab-ci]# docker push 192.168.200.15/library/tomcat:8.5.64-jdk8

成功后我们在Harbor仓库的library里能看见多了镜像

在这里插入图片描述

OK,现在我们可以执行流水线脚本了,直接点击下面的"Commit changes"

在这里插入图片描述

点击左侧导航栏的"Build"→"Pipelines"等待执行结果就行

在这里插入图片描述

居然报错了?!
在这里插入图片描述

原来是我的服务账号gitlab-ci:default没有足够的权限来获取和操作deployments和services资源啊
小问题,咱是在搞CI/CD,容错率大得很

#在gitlab-ci创建一个role,设置其对deployments和services的权限
[root@k8s-master-node1 gitlab-ci]# kubectl create role gitlab-role \
--verb=get,watch,list,create,update,patch,delete --resource=deployments.apps \
--verb=get,watch,list,create,update,patch,delete --resource=services -n gitlab-ci
#进行角色绑定,绑定角色为上面创建的role,绑定的服务账户为gitlab-ci:default
[root@k8s-master-node1 gitlab-ci]# kubectl create rolebinding gitlab-binding --role=gitlab-role --serviceaccount=gitlab-ci:default -n gitlab-ci

重新运行,解决
在这里插入图片描述

来到Harbor,可以看到demo项目下面多了个镜像
在这里插入图片描述

#来到宿主机,查看一下pod状态
[root@k8s-master-node1 gitlab-ci]# kubectl get pod -n gitlab-ci -owide
NAME                                             READY   STATUS    RESTARTS       AGE     IP            NODE               NOMINATED NODE   READINESS GATES
demo-2048-56f5dddb69-sbgpg                       1/1     Running   1 (73m ago)    4h57m   10.244.0.51   k8s-master-node1   <none>           <none>
...
#查看一下服务状态
[root@k8s-master-node1 gitlab-ci]# kubectl get svc -n gitlab-ci   
NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
demo-2048   NodePort   10.96.106.201   <none>        8080:8889/TCP   4m59s
gitlab      NodePort   10.96.55.63     <none>        80:30880/TCP    104m
#可以看到外部暴露的端口是8889

后语

至此,这道题的要求都满足了,此题完成。同时整个项目也完成了
我们可以直接在浏览器输入ip:8889访问2048的游戏界面进行游戏,点击"New Game"按钮,通过键盘方向键操作进行游玩~

在这里插入图片描述
在这里插入图片描述

相关文章:

2024广东省职业技能大赛云计算——构建CICD 部署2048小游戏

构建CI/CD 前言 题目如下&#xff1a; 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建&#xff0c;具体要求如下&#xff1a; &#xff08;1&#xff09;基于镜像maven:3.6-jdk-8构建项目的drone分支&#xff1b; &#xff08;2&#xff09;构建镜像的名称&#xff1a…...

React 条件渲染

React 条件渲染 React 条件渲染是一种在 React 应用程序中根据不同的条件显示不同组件或内容的技巧。它是 React 响应用户输入、状态变化或数据变化的核心机制之一。本文将深入探讨 React 条件渲染的概念、用法和最佳实践。 目录 条件渲染的基本概念使用 JavaScript 运算符进…...

Hadoop生态圈框架部署(九)- Hive部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…...

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…...

Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源 源起 Java语言最初是由Sun Microsystems公司&#xff08;该公司于2009年被Oracle公司收购&#xff09;开发的一种编程语言。其创造者是詹姆斯高斯林&#xff08;James Gosling&#xff09;&#xff0c;他是一位加拿大计算机科学家。其前身名为Oak&#xff08;橡…...

03_变量

变量 var num 10; 变量的重新赋值 var num10; num 20; 变量提升 JavaScript 引擎的工作方式是&#xff0c;先解析代码&#xff0c;获取所有被声明的变量&#xff0c;然后再一行一行地运行。这造成的结果&#xff0c;就是所有的变量的声明语句&#xff0c;都会被提升到代码的…...

[论文阅读-综述]Supervised Speech Separation Based on Deep Learning: An Overview

基于深度学习的监督语音分离&#xff1a;综述 出版&#xff1a;IEEE 核心&#xff1a;使用语音分离将目标语音信号与噪声混合分离的计算 本文用于对该文章的学习&#xff0c;主要是对内容的理解翻译与笔记 1. 语音分离介绍 语音分离的目标&#xff1a;将目标语音与背景干扰分…...

群控系统服务端开发模式-应用开发-邮箱配置功能开发

邮箱配置主要是将管理员数据做归属。具体见下图&#xff1a; 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_mail (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,title varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT…...

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

android studio引用so库

在工程中编译好的so库文件将在原始编译工程对应目录下&#xff1a;build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示&#xff0c;包含生成的四个版本&#xff0c;每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...

2024年信号处理与神经网络应用(SPNNA 2024)

会议官网&#xff1a;www.spnna.org 会议时间&#xff1a;2024年12月13-15日 会议地点&#xff1a;中国武汉...

wxWidgets-ImageView

wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...

第1章-JVM和Java体系架构

虚拟机 虚拟机概念 所谓虚拟机&#xff08;Virtual Machine&#xff09;&#xff0c;就是一台虚拟的计算机。它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。大体上&#xff0c;虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box&#xff0c;VMware就属…...

windows 服务器角色

windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息&#xff0c;防止未授权使用。AD RMS 将建立用户标识&#xff0c;并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 编译硬件需求&#xff1a;做多系统测试&#xff0c;磁盘500GB起步(固态)&#xff08;机械会卡死&#xff09;&#xff0c;内存3…...

C#中判断两个 List<T> 的内容是否相等

ET实现游戏中邮件系统逻辑思路&#xff08;服务端&#xff09;_游戏邮件系统设计-CSDN博客 场景&#xff1a;今天遇到一个BUG&#xff0c;在服务器重启的时候&#xff08;体验服&#xff09;&#xff0c;玩家之前接收的邮件又重新接收了一次&#xff0c;但是两封邮件的ID是不同…...

Linux环境下配置neo4j图数据库

1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装&#xff08;jdk1.8不够用&#xff09; 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…...

Windows 11 搭建 Docker 桌面版详细教程

在当今的软件开发与部署领域&#xff0c;Docker 已成为一项极为重要的容器化技术。它能够让开发者轻松地打包应用及其依赖项&#xff0c;实现跨环境的一致性运行&#xff0c;大大提高了开发效率与部署的便捷性。本教程将详细介绍在 Windows 11 操作系统上搭建 Docker 桌面版的具…...

Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)

Pytest-Bdd-Playwright 系列教程&#xff08;13&#xff09;&#xff1a;钩子&#xff08;hooks&#xff09; 前言一、什么是钩子&#xff1f;二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…...

dns 服务器简单介绍

dns 服务器分类&#xff1a; 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯&#xff1a;DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里&#xf…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...