自建gitlab服务器,证书过期问题

在仓库的处理方式

# 禁用 SSL 验证(不推荐长期使用)
git config http.sslVerify false
# 或者只对特定仓库禁用
cd /path/to/your/repo
git config http.sslVerify false

# 执行完操作后,重新启用
git config http.sslVerify true

在gitlab-runner的处理方式

[[runners]]
  name = "your-runner"
  url = "https://gitlib.dayuzhongxue.com"
  token = "your-token"
  tls-skip-verify = true  # 添加这行

gitlab服务器的处理

nginx不做强制跳转80至443

python函数的入参顺序

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数默认参数可变参数命名关键字参数关键字参数

python的字典

认识字典:

字典是一系列键—值对

要思考什么样的数据集合,适合使用字典来存储。

可将任何Python对象用作字典中的值,包括但不限于数值,字符串,列表,字典。

在Python中,字典用放在花括号{}中的一系列键—值对表示。

my_dict = {key1:value1, key2:value2, ...}

要获取与键相关联的值,可依次指定字典名和放在方括号内的键

print(my_dict[key1])

添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值。

my_dict[key3] = value3

修改字典中的值,可依次指定字典名、用方括号括起的键以及与该键相关联的新值:

my_dict[key1] = new_value1

对于字典中不再需要的信息,可使用del语句将相应的键—值对彻底删除:

del my_dict[key1]

遍历所有的键—值对:

for key, value in my_dict.items:
    print(key,value)

默认遍历键,所以:

for key in my_dict: 等效于 for key in my_dict.keys():

要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函
数sorted()来获得按特定顺序排列的键列表的副本:

for key in sorted(my_dict.keys()):

如果只希望获取字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。

for value in my_dict.values():

为剔除重复项,可使用集合(set)集合类似于列表,但每个元素都必须是独一无二的:

for value in set(my_dict.values()):

将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。

一般来说,相同组织结构的字典集合,作为列表元素存储在一个列表中较为常见。

item_1 = {key1:value1_1, key2=value2_1, key3=value3_1}
item_2 = {key1:value1_2, key2=value2_2, key3=value3_2}
item_3 = {key1:value1_3, key2=value2_3, key3=value3_3}
my_list = [item1, item2, item3]

每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。

也可以把字典存储到字典中。

嵌套应控制层级,构造代码时,应该把当前操作的作用域搞清楚。

python if判断

这是最简单的if判断语句:

if conditional_test:
    do something

在第1行中,可包含任何条件测试,而在紧跟在测试后面的缩进代码块中,可执行任何操作。
如果条件测试的结果为True,Python就会执行紧跟在if语句后面的代码;否则Python将忽略这些
代码。

在if语句中,缩进的作用与for循环中相同。如果测试通过了,将执行if语句后面所有缩进
的代码行,否则将忽略它们。

经常需要在条件测试通过了时执行一个操作,并在没有通过时执行另一个操作;在这种情况
下,可使用Python提供的if-else语句。

if-else语句块类似于简单的if语句,但其中的else语句
让你能够指定条件测试未通过时要执行的操作。

经常需要检查超过两个的情形,为此可使用Python提供的if-elif-else结构。Python只执行
if-elif-else结构中的一个代码块
,它依次检查每个条件测试,直到遇到通过了的条件测试。
试通过后,Python将执行紧跟在它后面的代码,并跳过余下的测试。

else是一条包罗万象的语句,只要不满足任何if或elif中的条件测试,其中的代码就会执行,
这可能会引入无效甚至恶意的数据。如果知道最终要测试的条件,应考虑使用一个elif代码块来
代替else代码块。

如果你只想执行一个代码块,就使用if-elif-else结构;如果要运行多个代码块,就
使用一系列独立的if语句。

python切片

切片是Python中一种用于操作序列类型(如列表、字符串和元组)的方法。它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列。

切片的基本语法:sequence[start:end:step]

start不指定,默认为0,end不指定,默认为至结束字符,step不指定,默认为1

sequence[::-1],反转列表

for x in sequence:
    print(x)

for表示循环列表,这句的意思是依次将列表的元素赋值给x

python中的数值计算

以整数型为例

a = 4
b = 2
“+”代表两个整数相加
c = a + b
print(c)
6

“a-b”表示a减去b

“a*b”表示a乘以b

“a//b”表示a除以b的整数商

“a%b”表示a除以b的余数

“a**b”表示a的b次幂

其中“**”可以用来开方运算,方法是把b设置成要开的次幂,例如a=8,b=1/3,那么a**b表示把a开三次方

jetbrain破解服务器

访问如下网站

https://search.censys.io/

搜索如下内容

搜索框输入:services.http.response.headers.location: account.jetbrains.com/fls-auth

点击搜索,在返回的结果随便找一个点进去,查找到 HTTP/302

复制网址到 Jetbrains,选择许可证服务器/License server,粘贴刚刚复制的网址,激活

jenkins换源

步骤一:配置文件修改

 

cd /var/lib/jenkins/updates

执行如下替换命令:

sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
步骤二:重启jenkins后,进入插件管理--高级--最下面的url地址填写为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

东八区时区解决的补充(抄来的)

文章目录
一、场景描述
二、问题分析
三、解决方案
一、场景描述
  在采用容器化部署应用程序的过程中,发现写日志的时间是正确的东八区时间,但是容器内部采用 date 获取的时间比实际东八区的时间慢了八个小时(这里一直比较纠结这个八小时用什么动词来修饰,网上很多人用 晚 、 早,但是站在东八区来理解这两个动词,似乎都有点奇怪。纠结很久,还是以东八区的时间为参照物,来定义默认时间比东八区时间慢了八个小时吧)。

宿主机的时间

[root@~ /]# date
2020年 12月 22日 星期二 18:39:24 CST
1
2
写入日志的时间

2020-12-22 18:40:23.233  INFO [,c19fc6564922e71f,54009447514b80af,true] 1 --- [http-nio-9013-exec-10] c.m.report.common.aspect.LogAspect       :

容器中的时间

[root@~ /]# docker exec -it app /bin/bash
bash-4.4# date
Tue Dec 22 10:39:54 UTC 2020

此容器的Dockerfile定义

# From 基础镜像
FROM openjdk:8-jre-alpine3.9

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]


CST     China Standard Time
UTC     Coordinated Universal Time

/etc/localtime  对应 date 指令本地时间
/etc/timezone   对应 java 所获取的时区

二、问题分析
通过以上 Dockerfile 可以了解到,本次实验采用的是 openjdk:8-jre-alpine3.9 最精简的版本,镜像大小 84.9M

Dockerfile 中设置本地时间和时区并写入到时间配置文件中

问题分析和研究结论:

由于 openjdk 采用的 Linux 环境的镜像是 alpine 的,其镜像特别小,集成 openjdk 也能很好的控制在 100M 左右,因此应用非常广泛,在 Docker Hub 中有大量基于 Linux alpine 版本的 JRE 镜像

# 如何验证容器采用的 Linux 内核
# 进入容器内部
docker exec -it 容器ID sh

# 查看 Linux 内核
cat /etc/issue

alpine 的镜像使用的是默认时区,并且也不存在 /usr/share/zoneinfo 路径和相关文件

为什么 Docker 容器中的日志时间却是对的呢?原因是由于以下命令将 Asia/Shanghai 配置指向了容器中的 /etc/timezone 时间,而日志输出和 JAVA 程序获取时间都是通过 /etc/timezone 这个时间配置获取的

ENV TZ=Asia/Shanghai
# 如果是基于 Alpine 的 Linux 镜像, && 前面的部分是不起作用的(因为 Alpine Linux 中都没有这个路径),所以进入容器后采用 date 查看时区还是 UTC 的时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

通过以上的操作,只是将程序读取的时间设置成了东八区的时间,但是容器中的时区还是 UTC时区,如果涉及到别的程序,比如写 MySQL 的时候,就有可能存在时间不对的问题

所以,建议在构建镜像时设置了时间配置文件的同时,也需要将 Linux 时区也设置为东八区

三、解决方案
欢迎使用此镜像

FROM ramboyang/openjdk-alpine:jre-8u212-timezone-ttf
1
解决方案一

编写基于 openjdk:8-jre-alpine3.9 镜像制作包含时间组件镜像的 Dockerfile

# 基础镜像
FROM openjdk:8-jre-alpine3.9

# 设置东八区时间
ENV TZ=Asia/Shanghai

# 安装时间组件 + 安装 ttf-dejavu 解决生成验证码空指针异常问题
# 1.1 版本
# RUN apk update && apk upgrade && apk add ca-certificates && update-ca-certificates && apk add --update tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apk add --update curl bash ttf-dejavu && rm -rf /var/cache/apk/*

# 1.2 版本
# RUN apk update && apk upgrade && apk add --update tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apk add --update curl bash ttf-dejavu && rm -rf /var/cache/apk/*

# 1.3 版本
RUN apk add --update tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apk add --update ttf-dejavu && rm -rf /var/cache/apk/* 

# 1.4 版本
# RUN apk add --update tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && rm -rf /var/cache/apk/*

基于以上定制的 Dockerfile 构建基础镜像

# 1.1 版本
docker build -t ramboyang/openjdk-alpine:jre-8u212-cert-timezone-ttf .

# 1.2 版本
docker build -t ramboyang/openjdk-alpine:jre-8u212-timezone-ttf-bash .

# 1.3 版本
docker build -t ramboyang/openjdk-alpine:jre-8u212-timezone-ttf .

# 1.4 版本
docker build -t ramboyang/openjdk-alpine:jre-8u212-timezone .

将本地镜像推送至 Docker Hub 个人公有仓库

docker login

# 1.1 版本
docker push ramboyang/openjdk-alpine:jre-8u212-cert-timezone-ttf

# 1.2 版本
docker push ramboyang/openjdk-alpine:jre-8u212-timezone-ttf-bash

# 1.3 版本
docker push ramboyang/openjdk-alpine:jre-8u212-timezone-ttf

# 1.4 版本
docker push ramboyang/openjdk-alpine:jre-8u212-timezone

采用此镜像为基础镜像构建 JAVA 应用

# From 基础镜像(包含了东八区的设置、ttf-dejavu绘制验证码组件)
FROM ramboyang/openjdk-alpine:jre-8u212-timezone-ttf

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]

解决方案二

点击此处获取所需的非 alpine 内核的 openjdk

非 alpine 内核的 openjdk 一般都存在本地时间文件夹和时区文件,采用以下 Dockerfile 即可完成容器内本地时间和时区的设置

# From 基础镜像
FROM openjdk:8u275-jre-slim

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]

解决方案三

Dockerfile 文件中设置 JAVA 应用读取的时间配置文件

# From 基础镜像
FROM openjdk:8-jre-alpine3.9

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

# 设置本地系统时间和时区
RUN Asia/Shanghai > /etc/timezone

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]

将镜像启动设置容器共享宿主机的时区

docker run --name spring-boot-sample -v /etc/localtime:/etc/localtime:ro -p 8888:8888 镜像ID
1
解决方案四

从一台有时间文件夹的 Linux 服务器复制出 zoneinfo 文件夹到 Dockerfile 所在构建文件夹

cp -r /usr/share/zoneinfo Dockerfile所在构建文件夹目录
1
Dockerfile 构建镜像时将本地 zoneinfo 文件夹复制到 Alpine Linux 系统中的固定目录

# From 基础镜像
FROM openjdk:8-jre-alpine3.9

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

# 复制时间文件夹到指定 Alpine 目录
COPY zoneinfo /usr/share/zoneinfo/

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]

解决方案五(不推荐)

在构建镜像过程中安装时区组件(受网络的影响,会导致构建镜像变慢或者失败)

# From 基础镜像
FROM openjdk:8-jre-alpine3.9

# 定义镜像创建者
LABEL maintainer=Rambo@xx.com

#安装时区组件
RUN apk add -U tzdata

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 前端界面路径
# RUN mkdir -p /opt/java/front/sample-web

# 后端程序路径
WORKDIR /opt/java/spring-boot-sample

COPY ./*.jar ./spring-boot-sample.jar

EXPOSE 8888

ENTRYPOINT ["java", "-jar", "./spring-boot-sample.jar"]