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 前言 题目如下: 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建,具体要求如下: (1)基于镜像maven:3.6-jdk-8构建项目的drone分支; (2)构建镜像的名称:…...
React 条件渲染
React 条件渲染 React 条件渲染是一种在 React 应用程序中根据不同的条件显示不同组件或内容的技巧。它是 React 响应用户输入、状态变化或数据变化的核心机制之一。本文将深入探讨 React 条件渲染的概念、用法和最佳实践。 目录 条件渲染的基本概念使用 JavaScript 运算符进…...
Hadoop生态圈框架部署(九)- Hive部署
文章目录 前言一、Hive部署(手动部署)下载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函数理解与使用
介绍:qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活,可以对任意类型的元素进行排序,只要提供了比较函数即可。 qsort 函数原型及参数解释: void qsort ( void* base, //指向要排序的数组的首元素…...
Java 语言的起源发展与基本概念(JDK,JRE,JVM)
Java语言的起源 源起 Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡…...
03_变量
变量 var num 10; 变量的重新赋值 var num10; num 20; 变量提升 JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的…...
[论文阅读-综述]Supervised Speech Separation Based on Deep Learning: An Overview
基于深度学习的监督语音分离:综述 出版:IEEE 核心:使用语音分离将目标语音信号与噪声混合分离的计算 本文用于对该文章的学习,主要是对内容的理解翻译与笔记 1. 语音分离介绍 语音分离的目标:将目标语音与背景干扰分…...
群控系统服务端开发模式-应用开发-邮箱配置功能开发
邮箱配置主要是将管理员数据做归属。具体见下图: 一、创建表 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…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
android studio引用so库
在工程中编译好的so库文件将在原始编译工程对应目录下:build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示,包含生成的四个版本,每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...
2024年信号处理与神经网络应用(SPNNA 2024)
会议官网:www.spnna.org 会议时间:2024年12月13-15日 会议地点:中国武汉...
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体系架构
虚拟机 虚拟机概念 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box,VMware就属…...
windows 服务器角色
windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息,防止未授权使用。AD RMS 将建立用户标识,并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
C#中判断两个 List<T> 的内容是否相等
ET实现游戏中邮件系统逻辑思路(服务端)_游戏邮件系统设计-CSDN博客 场景:今天遇到一个BUG,在服务器重启的时候(体验服),玩家之前接收的邮件又重新接收了一次,但是两封邮件的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的安装(jdk1.8不够用) 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…...
Windows 11 搭建 Docker 桌面版详细教程
在当今的软件开发与部署领域,Docker 已成为一项极为重要的容器化技术。它能够让开发者轻松地打包应用及其依赖项,实现跨环境的一致性运行,大大提高了开发效率与部署的便捷性。本教程将详细介绍在 Windows 11 操作系统上搭建 Docker 桌面版的具…...
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)
Pytest-Bdd-Playwright 系列教程(13):钩子(hooks) 前言一、什么是钩子?二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…...
dns 服务器简单介绍
dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里…...
Neo4j图形数据库-Cypher中常用指令
一、创建与修改 1.1 create 创建图数据库中的节点、关系等元素: CREATE (:Person {name: "Alice", age: 30}) CREATE (p1:Person {name: "Bob"})-[r:KNOWS]->(p2:Person {name: "Charlie"})批量创建元素 CREATE (n1:Node),(n2…...
linux安全管理-防火墙配置
1. 开启系统防火墙 1、检查内容 检查操作系统是否开启防火墙; 2、配置要求 操作系统开启防火墙; 3、配置方法 systemctl status firewalld ##查看系统防火墙运行状态 systemctl start firewalld ##启动防火墙 systemctl restart firewalld ##重启防火墙…...
什么是BIOS
BIOS(Basic Input/Output System,基本输入输出系统)是计算机启动过程中的一个关键组件,主要负责硬件的初始化和系统的引导。以下是关于 BIOS 的一些详细信息: 1. 基本功能 硬件初始化:当计算机启动时&…...
c++视频图像处理
打开视频或摄像头 打开指定视频 /*VideoCapture(const String &filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference:读取数据时设置的属性*/ VideoCapture video; //定义一个空的视频对象 video.open("H:/BaiduNetdiskDownlo…...
音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域
注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 当TS Header中的adaptation_field_control属性的值为10或11 时,TS Header包含adaptation field(适配域): 根据《T-RE…...
基于stm32单片机的教室节能系统设计
功能描述 0. STM32F103C8T6单片机为控制核心 1. OLED液晶显示当前年 月 日 时 分 秒 星期 2. 按键可以设置定时时间 3. 按键可以设置用电开关的开启和关闭时间,实现设备的节能 4. 通过红外遥控可以打开关闭空调设备(通过继电器开关闭合模拟&#x…...
mini主机通过内网穿透做成服务器
文章目录 简介1.ubuntu 的ssh server 安装2.ubuntu 的docker 安装3.ubuntu的curl的安装4.ubuntu的frp客户端安装5.ubuntu的docker compose安装6.声明 简介 主要目的 本地设备做成服务器,实现ssh远程登录以及内网穿透设备总成本1千多元(其实部分设备可以…...
智能桥梁安全运行监测系统守护桥梁安全卫士
一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…...
Selenium和Pyppeteer有什么区别?
Selenium和Pyppeteer都是自动化测试工具,它们可以模拟用户在浏览器中的操作,但它们之间存在一些关键的区别: Selenium 跨浏览器支持:Selenium支持多种浏览器,包括Chrome、Firefox、Internet Explorer等,而…...
82从零开始学Java之异常处理机制简介
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 大家可以想一个问题,有没有谁能够做到开发项目时一个错误都不发生?如果谁能够做到这一点,那他可能真的是“天才”!但实际上,任何人都不可能在项目开发…...
广东官方移动网站建设哪家好/营销的主要目的有哪些
JetBrain官网——传送门 plugin 下载 在gitee下载 plugin 使用 打开软件(打开一个项目) 将Plugin(压缩包) 直接拖进去 End...
搭建外文网站/html+css网页制作成品
最近在逛论坛发现很多小伙伴分享的接口测试框架中都增加了日志模块,想想也对毕竟log是最基本的东西,用于存储每条case的request和response。其中logging模块是用的最多的,老实说这个模块对我来说刚开始还是挺难用的,看的很多遍也算…...
成都哪里有做网站的/bt搜索引擎下载
基于多尺度窗口的DEM局部填洼方法徐静波1,许捍卫1,于艳超2【摘要】为了去除DEM中的伪洼地,使水系提取结果更加精确,在M&V算法的基础上提出了一种改进的填洼方法。用局部处理的思想将填洼步骤简化,减小对DEM的计算范…...
网站建设属于淘宝哪种类目/电子商务
项目里需要用到扫描二维码,自己实现,不会。 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库。如果二维码比较清晰,用这种效果也不错调用微信扫一扫功能,这种效果很好。但是调试接口…...
自己做网站上市/百度云网站入口
一、hashcode是什么? 1、hash和hash表是什么? 想要知道这个hashcode,首先得知道hash,通过百度百科看一下: hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个…...
wordpress如何安装专题/长沙网站推广排名优化
深入了解分布式分布式事务分布式事务概念分布式事务产生的原因事务的ACID特性分布式理论CAP理论BASE理论分布式事务的应用场景常见的分布式事务解决方案两阶段提交TCC编程模式TCC开源框架-tcc-transactionTCC使用关键技术分析分布式项目使用tcc-transaction框架发布服务调用服务…...