【Devops运维】Docker搭建jenkins自动化编译hadoop/spark/flink/hive/kyuubi/trino大数据组件

news2024/11/25 2:39:05

Docker搭建jenkins

  • DevOps概念
  • Docker部署Jenkins
    • 制作Jenkins镜像
      • Dockerfile及所依赖的脚本
      • build镜像
    • 利用docker-compose部署jenkins
  • 配置Jenkins
    • 管理员密码
    • 插件安装
    • 系统配置
    • 全局工具配置
      • MAVEN 配置
      • JDK 配置
      • GIT 配置
      • MAVEN 配置
  • Jenkins + Maven + Git 自动化编译
    • 找到token生成界面
    • 生成git的token
    • 进行jenkins配置
  • 配置 spark 编译任务
    • 新建任务
    • 配置任务
      • 源码管理
      • 构建

DevOps概念

在这里插入图片描述
DevOps 一词的来自于 Development 和 Operations 的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。DevOps 其实包含了三个部分:开发、测试和运维。换句话 DevOps 希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。

DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件

如果从字面上来理解,DevOps 只是Dev(开发人员)+Ops(运维人员),实际上,它是一组过程、方法与系统的统称,其概念从2009 年首次提出发展到现在,内容非常丰富,有理论也有实践,包括组织文化、自动化、精益、反馈和分享等不同方面。

Docker部署Jenkins

Jenkins 项目产生两个发行线, 长期支持版本 (LTS) 和每周更新版本

两个版本都以 .war 文件, 原生包, 安装程序, 和 Docker 容器的形式分发

最新下载地址:https://jenkins.io/zh/download/

制作Jenkins镜像

Dockerfile及所依赖的脚本

Dockerfile

FROM centos:centos7.9.2009

MAINTAINER 笑起来真好看

ARG TARGETARCH

RUN yum update -y && yum install wget vim fontconfig fontconfig-devel fontconfig.i686 git gcc gcc-c++ \
    autoconf automake libtool curl lzo-devel zlib-devel openssl openssl-devel ncurses-devel python3 python3-pip rpm-build \
    snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop libXtst zlib zlib-devel lz4 lz4-devel yasm help2man epel-release -y && \
    mkdir -p /opt/software && mkdir -p /opt/compile && \
    wget -O /opt/software/cmake.tar.gz https://cmake.org/files/v3.15/cmake-3.15.0.tar.gz --no-check-certificate && \
    wget -O /opt/software/protobuf.tar.gz https://hub.nuaa.cf/protocolbuffers/protobuf/archive/refs/tags/v3.7.1.tar.gz --no-check-certificate && \
    wget -O /opt/software/snappy.tar.gz https://hub.nuaa.cf/google/snappy/archive/refs/tags/1.1.3.tar.gz --no-check-certificate && \
    wget -O /opt/software/zstd.tar.gz https://codeload.github.com/facebook/zstd/tar.gz/refs/tags/v1.4.10 --no-check-certificate && \
    wget -O /opt/software/nasm.tar.gz https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz --no-check-certificate && \
    wget -O /opt/software/isa-l.tar.gz https://codeload.github.com/intel/isa-l/tar.gz/refs/tags/v2.30.0 --no-check-certificate && \
    wget -O jenkins.war https://get.jenkins.io/war-stable/2.346.1/jenkins.war --no-check-certificate && \
    wget -O /opt/software/scala.tgz https://downloads.lightbend.com/scala/2.12.17/scala-2.12.17.tgz && \
    mkdir -p /usr/share/jenkins/ && mv jenkins.war /usr/share/jenkins/ && \
    yum clean all && rm -rf /var/cache/yum/*

# 双架构的 jdk 版本
ADD jdk-8u371-linux-${TARGETARCH}.tar.gz /opt/software/
ADD nodejs.tar.gz /opt/software/
ADD https://github.com/krallin/tini/releases/download/v0.19.0/tini-${TARGETARCH} /usr/bin/tini

COPY install_soft.sh /opt/software/
COPY check_soft.sh /opt/software/
COPY build_hadoop.sh /opt/compile/
COPY jenkins.sh /usr/local/bin/
COPY jenkins-support /usr/local/bin/

RUN /bin/bash -c /opt/software/install_soft.sh && yum clean all && rm -rf /var/cache/yum/* && chmod +x /usr/bin/tini && mkdir -p /usr/share/jenkins/ref

ENV LANG=C.UTF-8
ENV JENKINS_HOME=/var/jenkins_home
ENV JENKINS_SLAVE_AGENT_PORT=50000
ENV REF=/usr/share/jenkins/ref
ENV JENKINS_VERSION=2.405
ENV JENKINS_UC=https://updates.jenkins.io
ENV JENKINS_UC_EXPERIMENTAL=https://updates.jenkins.io/experimental
ENV JENKINS_INCREMENTALS_REPO_MIRROR=https://repo.jenkins-ci.org/incrementals
ENV COPY_REFERENCE_FILE_LOG=/var/jenkins_home/copy_reference_file.log
ENV NODE_HOME=/opt/software/nodejs
ENV JAVA_HOME=/opt/software/jdk1.8.0_371
ENV SCALA_HOME=/opt/software/scala
ENV MAVEN_HOME=/opt/software/maven
ENV PATH=$PATH:$MAVEN_HOME/bin:$JAVA_HOME/bin:$NODE_HOME/bin:$SCALA_HOME/bin

Entrypoint ["/usr/bin/tini", "--", "/usr/local/bin/jenkins.sh"]

其中 install_soft.sh 是自动化安装hadoop编译所需要的依赖软件包.需要可以私信我

jenkins.sh 是镜像启动的入口脚本

#! /bin/bash -e

: "${JENKINS_WAR:="/usr/share/jenkins/jenkins.war"}"
: "${JENKINS_HOME:="/var/jenkins_home"}"
: "${COPY_REFERENCE_FILE_LOG:="${JENKINS_HOME}/copy_reference_file.log"}"
: "${REF:="/usr/share/jenkins/ref"}"
touch "${COPY_REFERENCE_FILE_LOG}" || { echo "Can not write to ${COPY_REFERENCE_FILE_LOG}. Wrong volume permissions?"; exit 1; }
echo "--- Copying files at $(date)" >> "$COPY_REFERENCE_FILE_LOG"
find "${REF}" \( -type f -o -type l \) -exec bash -c '. /usr/local/bin/jenkins-support; for arg; do copy_reference_file "$arg"; done' _ {} +

# if `docker run` first argument start with `--` the user is passing jenkins launcher arguments
if [[ $# -lt 1 ]] || [[ "$1" == "--"* ]]; then

  # shellcheck disable=SC2001
  effective_java_opts=$(sed -e 's/^ $//' <<<"$JAVA_OPTS $JENKINS_JAVA_OPTS")

  # read JAVA_OPTS and JENKINS_OPTS into arrays to avoid need for eval (and associated vulnerabilities)
  java_opts_array=()
  while IFS= read -r -d '' item; do
    java_opts_array+=( "$item" )
  done < <([[ $effective_java_opts ]] && xargs printf '%s\0' <<<"$effective_java_opts")

  readonly agent_port_property='jenkins.model.Jenkins.slaveAgentPort'
  if [ -n "${JENKINS_SLAVE_AGENT_PORT:-}" ] && [[ "${effective_java_opts:-}" != *"${agent_port_property}"* ]]; then
    java_opts_array+=( "-D${agent_port_property}=${JENKINS_SLAVE_AGENT_PORT}" )
  fi

  readonly lifecycle_property='hudson.lifecycle'
  if [[ "${JAVA_OPTS:-}" != *"${lifecycle_property}"* ]]; then
    java_opts_array+=( "-D${lifecycle_property}=hudson.lifecycle.ExitLifecycle" )
  fi

  if [[ "$DEBUG" ]] ; then
    java_opts_array+=( \
      '-Xdebug' \
      '-Xrunjdwp:server=y,transport=dt_socket,address=*:5005,suspend=y' \
    )
  fi

  jenkins_opts_array=( )
  while IFS= read -r -d '' item; do
    jenkins_opts_array+=( "$item" )
  done < <([[ $JENKINS_OPTS ]] && xargs printf '%s\0' <<<"$JENKINS_OPTS")

  exec java -Duser.home="$JENKINS_HOME" "${java_opts_array[@]}" -jar "${JENKINS_WAR}" "${jenkins_opts_array[@]}" "$@"
fi

# As argument is not jenkins, assume user wants to run a different process, for example a `bash` shell to explore this image
exec "$@"

jenkins-support 内容如下:

#!/bin/bash -eu

: "${REF:="/usr/share/jenkins/ref"}"

# compare if version1 < version2
versionLT() {
    local v1; v1=$(echo "$1" | cut -d '-' -f 1 )
    local q1; q1=$(echo "$1" | cut -s -d '-' -f 2- )
    local v2; v2=$(echo "$2" | cut -d '-' -f 1 )
    local q2; q2=$(echo "$2" | cut -s -d '-' -f 2- )
    if [ "$v1" = "$v2" ]; then
        if [ "$q1" = "$q2" ]; then
            return 1
        else
            if [ -z "$q1" ]; then
                return 1
            else
                if [ -z "$q2" ]; then
                    return 0
                else
                    [  "$q1" = "$(echo -e "$q1\n$q2" | sort -V | head -n1)" ]
                fi
            fi
        fi
    else
        [  "$v1" = "$(echo -e "$v1\n$v2" | sort -V | head -n1)" ]
    fi
}

# returns a plugin version from a plugin archive
get_plugin_version() {
    local archive; archive=$1
    local version; version=$(unzip -p "$archive" META-INF/MANIFEST.MF | grep "^Plugin-Version: " | sed -e 's#^Plugin-Version: ##')
    version=${version%%[[:space:]]}
    echo "$version"
}

# Copy files from /usr/share/jenkins/ref into $JENKINS_HOME
# So the initial JENKINS-HOME is set with expected content.
# Don't override, as this is just a reference setup, and use from UI
# can then change this, upgrade plugins, etc.
copy_reference_file() {
    f="${1%/}"
    b="${f%.override}"
    rel="${b#"$REF/"}"
    version_marker="${rel}.version_from_image"
    dir=$(dirname "${rel}")
    local action;
    local reason;
    local container_version;
    local image_version;
    local marker_version;
    local log; log=false
    if [[ ${rel} == plugins/*.jpi ]]; then
        container_version=$(get_plugin_version "$JENKINS_HOME/${rel}")
        image_version=$(get_plugin_version "${f}")
        if [[ -e $JENKINS_HOME/${version_marker} ]]; then
            marker_version=$(cat "$JENKINS_HOME/${version_marker}")
            if versionLT "$marker_version" "$container_version"; then
                if ( versionLT "$container_version" "$image_version" && [[ -n $PLUGINS_FORCE_UPGRADE ]]); then
                    action="UPGRADED"
                    reason="Manually upgraded version ($container_version) is older than image version $image_version"
                    log=true
                else
                    action="SKIPPED"
                    reason="Installed version ($container_version) has been manually upgraded from initial version ($marker_version)"
                    log=true
                fi
            else
                if [[ "$image_version" == "$container_version" ]]; then
                    action="SKIPPED"
                    reason="Version from image is the same as the installed version $image_version"
                else
                    if versionLT "$image_version" "$container_version"; then
                        action="SKIPPED"
                        log=true
                        reason="Image version ($image_version) is older than installed version ($container_version)"
                    else
                        action="UPGRADED"
                        log=true
                        reason="Image version ($image_version) is newer than installed version ($container_version)"
                    fi
                fi
            fi
        else
            if [[ -n "$TRY_UPGRADE_IF_NO_MARKER" ]]; then
                if [[ "$image_version" == "$container_version" ]]; then
                    action="SKIPPED"
                    reason="Version from image is the same as the installed version $image_version (no marker found)"
                    # Add marker for next time
                    echo "$image_version" > "$JENKINS_HOME/${version_marker}"
                else
                    if versionLT "$image_version" "$container_version"; then
                        action="SKIPPED"
                        log=true
                        reason="Image version ($image_version) is older than installed version ($container_version) (no marker found)"
                    else
                        action="UPGRADED"
                        log=true
                        reason="Image version ($image_version) is newer than installed version ($container_version) (no marker found)"
                    fi
                fi
            fi
        fi
        if [[ ! -e $JENKINS_HOME/${rel} || "$action" == "UPGRADED" || $f = *.override ]]; then
            action=${action:-"INSTALLED"}
            log=true
            mkdir -p "$JENKINS_HOME/${dir}"
            cp -pr "${f}" "$JENKINS_HOME/${rel}";
            # pin plugins on initial copy
            touch "$JENKINS_HOME/${rel}.pinned"
            echo "$image_version" > "$JENKINS_HOME/${version_marker}"
            reason=${reason:-$image_version}
        else
            action=${action:-"SKIPPED"}
        fi
    else
        if [[ ! -e $JENKINS_HOME/${rel} || $f = *.override ]]
        then
            action="INSTALLED"
            log=true
            mkdir -p "$JENKINS_HOME/${dir}"
            cp -pr "$(realpath "${f}")" "$JENKINS_HOME/${rel}";
        else
            action="SKIPPED"
        fi
    fi
    if [[ -n "$VERBOSE" || "$log" == "true" ]]; then
        if [ -z "$reason" ]; then
            echo "$action $rel" >> "$COPY_REFERENCE_FILE_LOG"
        else
            echo "$action $rel : $reason" >> "$COPY_REFERENCE_FILE_LOG"
        fi
    fi
}

# Retries a command a configurable number of times with backoff.
#
# The retry count is given by ATTEMPTS (default 60), the initial backoff
# timeout is given by TIMEOUT in seconds (default 1.)
#
function retry_command() {
  local max_attempts=${ATTEMPTS-3}
  local timeout=${TIMEOUT-1}
  local success_timeout=${SUCCESS_TIMEOUT-1}
  local max_success_attempt=${SUCCESS_ATTEMPTS-1}
  local attempt=0
  local success_attempt=0
  local exitCode=0

  while (( attempt < max_attempts ))
  do
    set +e
    "$@"
    exitCode=$?
    set -e

    if [[ $exitCode == 0 ]]
    then
      success_attempt=$(( success_attempt + 1 ))
      if (( success_attempt >= max_success_attempt))
      then
        break
      else
        sleep "$success_timeout"
        continue
      fi
    fi

    echo "$(date -u '+%T') Failure ($exitCode) Retrying in $timeout seconds..." 1>&2
    sleep "$timeout"
    success_attempt=0
    attempt=$(( attempt + 1 ))
    timeout=$(( timeout ))
  done

  if [[ $exitCode != 0 ]]
  then
    echo "$(date -u '+%T') Failed in the last attempt ($*)" 1>&2
  fi

  return $exitCode
}

build镜像

docker build --platform=linux/arm64 -t centos-jenkins:v1 --no-cache .

利用docker-compose部署jenkins

version: '3'
services:
  jenkins:
    image: centos-jenkins:v1
    container_name: jenkins
    ports:
      - "8080:8080"
      - "50000:50000"
    networks:
      - back
    volumes:
      - ./jenkins:/var/jenkins_home
      - ./maven:/opt/software/maven
    privileged: true
    environment:
      - TZ="Asia/Shanghai"
    restart: always

networks:
  back:
    driver: bridge

使用 docker-compose up -d 就可以启动了

启动成功后 就可以 本地 访问 jenkins访问地址

在这里插入图片描述

配置Jenkins

管理员密码

在这里插入图片描述
输入我们在控制台中看到的密钥,如果找不到可以到/root/.jenkins/secrets/initialAdminPassword中查看密钥

插件安装

网络好的情况下,直接选择安装推荐的插件。
在这里插入图片描述
必要的插件:

  • 汉化插件 Chinese
  • Git
  • Maven Integration

安装完 插件后,重启jenkins

系统配置

在这里插入图片描述

全局工具配置

MAVEN 配置

配置 自定义的 settings 文件
在这里插入图片描述

JDK 配置

设置自定义的 JAVA_HOME 目录
在这里插入图片描述

GIT 配置

设置 git 执行文件路径
在这里插入图片描述

MAVEN 配置

设置 全局 maven 的home路径
在这里插入图片描述

Jenkins + Maven + Git 自动化编译

在2021年8月13日git移除了通过用户名和密码在外部访问源码仓库的方式。

问题描述如下:

Caused by: hudson.plugins.git.GitException: Command “/usr/bin/git fetch --tags --progress https://github.com/xxxxx/hadoop.git +refs/heads/:refs/remotes/origin/” returned status code 128:

目前想要在 jenkins 中拉取 github 中的源代码,需要在 github 网页中生成 TOKEN 信息

找到token生成界面

  1. 点击个人头像,点击 Settings 设置界面
  2. 侧边栏 点击 Developer settings 进入到开发者设置界面
  3. 进入到 Personal access tokens (classic) 界面
  4. 根据配置项 产生 新 的 token
    在这里插入图片描述

生成git的token

根据提示,填写 token 的名称,过期时间和作用域,具体根据个人实际需求进行选择

token 仅显示一次,一定要记录下来

在这里插入图片描述

进行jenkins配置

创建 Username with Password 的类型的凭证

  1. 填写 用户名
  2. 填写 token 信息
    在这里插入图片描述

配置 spark 编译任务

新建任务

选择 自由风格的 软件项目

在这里插入图片描述

配置任务

源码管理

在这里插入图片描述

构建

在这里插入图片描述
其中构建脚本如下:

#!/bin/sh 
export BUILD_ID=dontKillMe 
source ~/.bash_profile sh
${WORKSPACE}/dev/make-distribution.sh --pip --tgz -Phive -Phive-2.3 -Phive-thriftserver -Pscala-2.12 -Phadoop-3.2 -Pmesos -Pyarn -Pkubernetes 

希望对正在查看文章的您有所帮助,记得关注、评论、收藏,谢谢您

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT:使用OpenAI创建自己的AI网站,使用 flask web框架快速搭建网站主体

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。 使用 flask web框架快速搭建网站主体 之前…

C++:布隆过滤器和哈希切分

目录 一. 什么是布隆过滤器 二. 布隆过滤器的实现 2.1 数据插入函数set 2.2 判断数据是否存在函数test 2.3 布隆过滤器数据的删除 三. 哈希切分 一. 什么是布隆过滤器 在我之前的博客C&#xff1a;使用位图处理海量数据_【Shine】光芒的博客-CSDN博客中&#xff0c;介绍了…

【LinuxShell】linux防火墙之firewalld防火墙

文章目录 前言一、firewalld概述1. 概念2. firewalld和iptables的关系 二、firewalld网络区域1. firewalld区域的概念2. firewalld预定义区域3. firewalld数据包的处理3.1 firewalld数据处理流程3.2 firewalld检查数据包的源地址的规则3.3 总结 三、firewalld防火墙的配置方法1…

“GPT+医疗健康”:给予医疗领域新机遇

现如今&#xff0c;GPT十分火热。随着人们对健康医疗的关注越来越热切&#xff0c;GPT已逐渐成为健康医疗领域的重要角色之一。GPT可以用于许多医疗语境中&#xff0c;如医学咨询、病症诊断、健康建议、在线问诊、患者教育、健康数据跟踪等。 GPT是一种基于深度学习的自然语言处…

结构体-C语言

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【Python办公自动化】python实现将图片插入到word中指定位置并将word转换为图片

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

垃圾站养殖场除臭杀菌解决方案

养殖场和垃圾站都会产生大量的有机废气和垃圾&#xff0c;这些废气和垃圾会产生难闻的臭味&#xff0c;影响周围环境和居民健康。这些地方又是病菌和细菌的滋生地&#xff0c;这些细菌和病菌会对人类和动物的健康造成威胁。除臭杀菌系统可以杀灭这些细菌和病菌&#xff0c;也可…

换个思维方式,你离网工天花板会更近一点

大家好&#xff0c;我是许公子。 收到老杨的邀请&#xff0c;我正式加入网络工程师俱乐部了&#xff0c;未来会给你分享更多网工硬核内容。 和老杨聊天的过程中&#xff0c;我想起了在刚入社会一两年&#xff0c;我去参加了一个高中同学聚餐。 里面有自主创业的&#xff0c;…

软件测试被00后整顿职场了?

00后带来的压力 公司一位工作3年的老油条工资还没有刚来的00后高&#xff0c;她心中不平&#xff0c;对这件事情有不小的怨气&#xff0c;她觉得自己来公司三年了&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天勤勤恳恳&#xff0c;要加班的时候也愿意加班&#xff0…

Python竖版大屏 | 用pyecharts开发可视化的奇妙探索

你好&#xff01;我是马哥python说&#xff0c;一枚10年程序猿&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;正在试错用pyecharts开发可视化大屏的非常规排版。 以下&#xff0c;我用8种ThemeType展示的同一个可视化数据大屏。 1、SHINE主题 2、LIGHT主题 3、MACARO…

手撕代码——任意奇数分频

手撕代码——任意奇数分频 一、奇数分频器原理与设计 在上文《手撕代码——任意偶数分频》中&#xff0c;我们编写任意偶数分频的Verilog代码&#xff0c;对时钟进行偶数分频&#xff0c;只需要用到时钟的上升沿或者下降沿即可&#xff0c;而要进行N倍奇数分频&#xff0c;需要…

修改Allure报告窗口标题,Overview的标题文案,环境配置,左上角LOGO

前言 如下图所示&#xff1a; 一、修改Allure报告窗口标题 Allure-html测试报告的窗口标题保存在&#xff1a;allure-html目录下的index.html文件 写个 set_windows_title 方法&#xff0c;并在 run.py 的执行文件去调用即可修改&#xff08; 在html报告生成后&#xff09…

研报精选230522

目录 【行业230522东亚前海证券】新能源行业深度报告&#xff1a;政策东风与海外需求共振&#xff0c;充电桩迎新一轮增长周期 【行业230522西南证券】人工智能专题研究&#xff1a;AIGC投资框架 【行业230522国信证券】传媒互联网行业周报&#xff1a;OpenAI推出移动版及网页端…

文献笔记——A brief introduction to distributed systems(分布式系统)

本文主要讨论了分布式系统。作者提供了关于分布式系统的概述&#xff0c;是一份很好的新手教程。 Fig.1 大纲 在论文的第一部分&#xff0c;作者简要回顾了计算机的演变&#xff0c;指出了分布式系统的两个技术基础&#xff1a;性能强大的微处理器的发展和高速计算机网络的发明…

OpenCV:CMake 产生 VS2019 项目和解决方案

CMake 是一个跨平台的自动化编译程序&#xff0c;它用于管理代码的构建过程。使用 CMake 可以简化跨平台项目的构建和移植&#xff0c;提供简单而强大的语法来描述构建过程&#xff0c;并生成多种不同的构建系统&#xff0c;如 GNU Make、Ninja 和 Visual Studio。因为 CMake 具…

8年测试总结,性能测试问题大全,这些问题你应该认清的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 响应时间VS吞吐量…

18-02 数据库设计核心要点

概念结构设计 通过对用户需求进行综合、归纳和抽象&#xff0c;形成独立于具体数据库管理系统的概念模型把需求分析阶段得到的应用需求&#xff0c;抽象成概念模型连接现实世界和信息世界的桥梁好的概念结构设计 能真实、充分的反映现实世界要易于理解要易于修改 基本概念 …

kubeadm部署k8s 1.26.0版本高可用集群

1.前言 本次搭建使用centos7.9系统&#xff0c;并且使用haproxykeepalived作为高可用架构软件&#xff0c;haproxy实现k8s集群管理节点apiserver服务的负载均衡以实现集群的高可用功能&#xff0c;keepalived保障了hapxoy的高可用&#xff0c;容器引擎使用docker&#xff0c;需…

迁移iceberg:一.查看所需要的资源。

一&#xff1a;内存&#xff0c;CPU&#xff0c;核数&#xff0c;线程&#xff0c;硬盘。 1. cpu&#xff0c;核素&#xff0c;线程。 cpu cpu就相当于人类的大脑&#xff0c;是处理数据的地方。 cpu由以下三个组成。 控制器。由控制单元、指令译码器、指令寄存器组成。运算…

戴尔 dell Inspiron3670电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板B360 处理器i5-9400已驱动 内存8GB已驱动 硬盘KBG40ZNS256G NVMe KIOXIA 256GB ST1000DM010 1TB已驱动 显卡UHD630(1.05GHZ)已驱动 声卡Realte…