fixed:更新
This commit is contained in:
parent
69b97ea4da
commit
54bb8fc9de
|
|
@ -0,0 +1,14 @@
|
||||||
|
## Cesium待实现功能
|
||||||
|
|
||||||
|
### 1.展示型功能
|
||||||
|
|
||||||
|
- [ ] 1. 分层分户单体化功能
|
||||||
|
- [ ] 2. 模型简化(优化加载)
|
||||||
|
- [ ] 3. 地下模式
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 分析型功能
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
## Neo4j的cyhper基本语法
|
||||||
|
|
||||||
|
### 1. 创建节点和关系
|
||||||
|
|
||||||
|
#### 1.1创建节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
|
||||||
|
create (n)
|
||||||
|
create (n),(m)
|
||||||
|
create(n:Movie)
|
||||||
|
create(n:Movie:Person)
|
||||||
|
|
||||||
|
# 创建一个带有标签(Person)和属性(name:'TEST-NAME', age:1)的节点
|
||||||
|
create(n:Person {name:'qiusj',age:18})
|
||||||
|
|
||||||
|
# 返回创建的节点
|
||||||
|
CREATE(n:TEST {name:'TEST-NAME1', age:2}) return n
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 1.2 创建关系
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 创建两个节点之间的关系
|
||||||
|
MATCH (a:TEST),(b:TEST)
|
||||||
|
WHERE a.name = 'TEST-NAME' AND b.name = 'TEST-NAME1'
|
||||||
|
CREATE (a)-[r:RELTYPE] -> (b)
|
||||||
|
RETURN r
|
||||||
|
|
||||||
|
# 创建两个节点之间的关系,并调用两个节点的属性:
|
||||||
|
MATCH (a:TEST),(b:TEST)
|
||||||
|
WHERE a.name = 'TEST-NAME' AND b.name = 'TEST-NAME1'
|
||||||
|
CREATE (a)-[r:RELTYPE { name: a.name + b.name}] -> (b)
|
||||||
|
RETURN r
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 1.3 `merge` 命令
|
||||||
|
|
||||||
|
在Neo4j数据库中,**MERGE**命令是一个非常强大的工具,它结合了**CREATE**和**MATCH**命令的功能。当你需要确保一个特定的节点或关系在图中存在时,MERGE命令就显得尤为重要。如果该节点或关系不存在,MERGE将会创建它;如果已经存在,MERGE则会匹配到这个现有的元素。
|
||||||
|
|
||||||
|
> 如果这个节点已经存在,那么MERGE命令的作用就相当于MATCH命令。判断是否存在的方式是表达式中所有的属性组合匹配的:如 MERGE (p:Person {name: 'Alice'}) RETURN p;只要在已有的Person中name属性没有等于'Alice'的就是不存在,MERGE (p:Person {name: 'Alice,age:18}) 则要求现有的Person中的name和age都不相同才表示不存在
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MERGE (robert:Person { name: 'Robert' })
|
||||||
|
RETURN robert, labels(robert)
|
||||||
|
```
|
||||||
|
|
||||||
|
MERGE还可以用来创建节点之间的关系。如果两个节点之间的关系不存在,MERGE会创建这个关系。例如,以下命令会创建一个名为"Robert"的Person节点和一个名为"hanscal"的Person节点之间的FAMILY关系:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MATCH (n:Person { name: 'Robert' }), (m:Person { name: "hanscal" })
|
||||||
|
MERGE (n)-[r:FAMILY]->(m)
|
||||||
|
RETURN n.name, type(r), m.name
|
||||||
|
```
|
||||||
|
|
||||||
|
**使用ON CREATE和ON MATCH**
|
||||||
|
|
||||||
|
MERGE命令可以与**ON CREATE**和**ON MATCH**子句结合使用,这允许你根据元素是被匹配到还是被创建来执行不同的操作。例如,以下命令在创建新节点时设置一个时间戳属性:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MERGE (c:Person { name: 'Hanscal' })
|
||||||
|
ON CREATE SET c.create = timestamp()
|
||||||
|
RETURN c.name, c.create
|
||||||
|
```
|
||||||
|
|
||||||
|
如果节点"Hanscal"已经存在,则不会设置任何属性。相反,如果使用**ON MATCH**,则只有在匹配到节点时才会设置属性。
|
||||||
|
|
||||||
|
**批量操作**
|
||||||
|
|
||||||
|
MERGE命令也可以用于批量操作,快速创建大量的节点和关系。例如,以下命令会将所有Person节点的出生地属性与City节点连接起来,并创建BORN_IN关系:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MATCH (person:Person)
|
||||||
|
MERGE (city:City { name: person.bornIn })
|
||||||
|
MERGE (person)-[r:BORN_IN]->(city)
|
||||||
|
RETURN person.name, person.bornIn, city
|
||||||
|
```
|
||||||
|
|
||||||
|
总的来说,`MERGE`命令在确保数据一致性和避免重复创建相同的元素时非常有用。
|
||||||
|
|
||||||
|
**约束与 MERGE 命令的关系**
|
||||||
|
|
||||||
|
- **唯一性约束**:确保指定标签的节点在特定属性上具有唯一性,是 Neo4j 保证数据完整性的重要机制
|
||||||
|
- MERGE 命令行为:
|
||||||
|
|
||||||
|
- 若匹配条件的节点 / 关系存在,则返回现有节点 / 关系
|
||||||
|
- 若不存在,则创建新的节点 / 关系
|
||||||
|
- **冲突点**:当 MERGE 的匹配条件触发唯一性约束时,会因重复数据导致操作失败
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 1.4 添加属性
|
||||||
|
|
||||||
|
方案 1:使用 MATCH 而非 MERGE(推荐)
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MATCH (p:Person {name: 'Robert'})
|
||||||
|
SET p.age = 18
|
||||||
|
RETURN p;
|
||||||
|
```
|
||||||
|
|
||||||
|
方案 2:修改 MERGE 语句避免重复创建
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 安全的MERGE写法(先检查节点是否存在)
|
||||||
|
MERGE (p:Person {name: 'Robert'})
|
||||||
|
# 仅当节点不存在时才创建新属性(避免冲突)
|
||||||
|
ON CREATE SET p.create = timestamp()
|
||||||
|
# 无论是否创建都可以设置属性(不会触发约束)
|
||||||
|
SET p.money = 1
|
||||||
|
RETURN p;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 1.5 修改节点的关系类型
|
||||||
|
|
||||||
|
在 Neo4j 中,关系类型(Relationship Type)是不可变的,无法直接修改。若要更改关系类型,需通过以下步骤实现:**创建新关系 → 复制属性 → 删除旧关系**。以下是详细方法:
|
||||||
|
|
||||||
|
**方法一:使用 Cypher 手动转换关系类型**
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 示例:将 KNOWS 关系转换为 FRIEND 关系
|
||||||
|
MATCH (p1:Person)-[r:KNOWS]->(p2:Person)
|
||||||
|
WHERE p1.name = 'Alice' AND p2.name = 'Bob'
|
||||||
|
// 创建新类型的关系
|
||||||
|
CREATE (p1)-[r2:FRIEND]->(p2)
|
||||||
|
// 复制旧关系的所有属性到新关系
|
||||||
|
SET r2 = r
|
||||||
|
// 删除旧关系
|
||||||
|
DELETE r
|
||||||
|
RETURN p1, r2, p2;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 2.查询语法
|
||||||
|
|
||||||
|
> match、optional match、where、start和aggregation聚合
|
||||||
|
|
||||||
|
#### 2.1 match语法
|
||||||
|
|
||||||
|
**简单查询**
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 查询所有节点
|
||||||
|
match (n) return n
|
||||||
|
|
||||||
|
# 查询指定标签的节点
|
||||||
|
match (n:Person) return n
|
||||||
|
|
||||||
|
# 查询指定标签和属性的节点
|
||||||
|
match (n:Person {name:"张三"}) return n
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**关系查询**
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 查询出度1的节点
|
||||||
|
match (n:Person{name:"张三"})-[r]->(m) return m
|
||||||
|
match (n:Person{name:"zhangsan"})-->(m) return m
|
||||||
|
|
||||||
|
# 查询入度1节点:
|
||||||
|
match (n:Person{name:"zhangsan"})<-[r]-(m) return m
|
||||||
|
match (n:Person{name:"zhangsan"})<--(m) return m
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 3.删除节点
|
||||||
|
|
||||||
|
- 删除无关系的孤立节点
|
||||||
|
|
||||||
|
使用`DELETE`语句直接删除节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 删除单个节点(无关系)
|
||||||
|
MATCH (p:Person {name: 'Alice'})
|
||||||
|
DELETE p;
|
||||||
|
|
||||||
|
// 批量删除符合条件的节点
|
||||||
|
MATCH (p:Person)
|
||||||
|
WHERE p.age < 18
|
||||||
|
DELETE p;
|
||||||
|
```
|
||||||
|
|
||||||
|
- 删除带有关联关系的节点
|
||||||
|
|
||||||
|
需先删除关系,再删除节点。可使用`DETACH DELETE`一次性完成:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 方法1:分步删除(手动删除关系)
|
||||||
|
MATCH (p:Person {name: 'Bob'})-[r]->()
|
||||||
|
DELETE r; // 先删除所有外出关系
|
||||||
|
MATCH (p:Person {name: 'Bob'})
|
||||||
|
DELETE p; // 再删除节点
|
||||||
|
|
||||||
|
// 方法2:使用DETACH DELETE(推荐)
|
||||||
|
MATCH (p:Person {name: 'Charlie'})
|
||||||
|
DETACH DELETE p; // 自动删除节点及其所有关系
|
||||||
|
```
|
||||||
|
|
||||||
|
- 基于关系条件删除节点
|
||||||
|
|
||||||
|
删除符合特定关系条件的节点:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 删除所有没有朋友的人(无FOLLOWS关系)
|
||||||
|
MATCH (p:Person)
|
||||||
|
WHERE NOT (p)-[:FOLLOWS]->()
|
||||||
|
DELETE p;
|
||||||
|
|
||||||
|
// 删除被超过100人关注的明星节点
|
||||||
|
MATCH (s:Star)<-[r:FOLLOWS]-()
|
||||||
|
WITH s, count(r) as followers
|
||||||
|
WHERE followers > 100
|
||||||
|
DETACH DELETE s;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- 删除整个标签的所有节点
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 删除所有Person节点及其关系
|
||||||
|
MATCH (p:Person)
|
||||||
|
DETACH DELETE p;
|
||||||
|
|
||||||
|
// 更安全的分批删除方法
|
||||||
|
CALL apoc.periodic.iterate(
|
||||||
|
"MATCH (p:Person) RETURN p",
|
||||||
|
"DETACH DELETE p",
|
||||||
|
{batchSize:1000, parallel:false}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- 删除节点并返回删除数量
|
||||||
|
|
||||||
|
```sql
|
||||||
|
MATCH (p:Person)
|
||||||
|
WHERE p.lastLogin < date("2023-01-01")
|
||||||
|
DETACH DELETE p
|
||||||
|
RETURN count(*) as deletedNodes;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 4. 删除关系
|
||||||
|
|
||||||
|
场景一:删除特定关系
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 方法1:通过匹配节点和关系类型删除
|
||||||
|
MATCH (p1:Person {name: 'Alice'})-[r:FRIEND]->(p2:Person {name: 'Bob'})
|
||||||
|
DELETE r;
|
||||||
|
|
||||||
|
// 方法2:使用更精确的匹配条件(如属性)
|
||||||
|
MATCH (p1:Person)-[r:WORKS_ON {projectId: 'PRJ-123'}]->(p2:Project)
|
||||||
|
DELETE r;
|
||||||
|
```
|
||||||
|
|
||||||
|
场景二:只有查询返回的ID
|
||||||
|
|
||||||
|
```sql
|
||||||
|
// 方法1:使用关系ID直接删除
|
||||||
|
MATCH ()-[r]->()
|
||||||
|
WHERE id(r) = 5678 // 替换为实际关系ID
|
||||||
|
DELETE r; // 仅删除关系,保留节点
|
||||||
|
|
||||||
|
// 方法2:验证关系后删除
|
||||||
|
MATCH ()-[r]->()
|
||||||
|
WHERE id(r) = 5678
|
||||||
|
RETURN r; // 先查询确认关系是否存在
|
||||||
|
|
||||||
|
// 确认无误后执行删除
|
||||||
|
MATCH ()-[r]->()
|
||||||
|
WHERE id(r) = 5678
|
||||||
|
DELETE r;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -42,6 +42,23 @@ docker 命令 --help # 帮助命令
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
较常用的是`docker run [OPTIONS] IMAGE [COMMAND] [ARG...] `命令
|
||||||
|
|
||||||
|
参数说明:
|
||||||
|
|
||||||
|
- **`-d`**: 后台运行容器并返回容器 ID。
|
||||||
|
- **`-it`**: 交互式运行容器,分配一个伪终端。
|
||||||
|
- **`--name`**: 给容器指定一个名称。
|
||||||
|
- **`-p`**: 端口映射,格式为 `host_port:container_port`。
|
||||||
|
- **`-v`**: 挂载卷,格式为 `host_dir:container_dir`。
|
||||||
|
- **`--rm`**: 容器停止后自动删除容器。
|
||||||
|
- **`--env` 或 `-e`**: 设置环境变量。
|
||||||
|
- **`--network`**: 指定容器的网络模式。
|
||||||
|
- **`--restart`**: 容器的重启策略(如 `no`、`on-failure`、`always`、`unless-stopped`)。
|
||||||
|
- **`-u`**: 指定用户。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 查看容器的元数据
|
### 查看容器的元数据
|
||||||
|
|
||||||
> docker inspect 容器ID
|
> docker inspect 容器ID
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ yum install docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
登陆阿里云,找到容器镜像服务,找到镜像加速器。
|
登陆阿里云,找到容器镜像服务,找到镜像加速器。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
配置使用
|
配置使用
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,352 @@
|
||||||
|
## gitlab-ci.yml文件编写
|
||||||
|
|
||||||
|
> 转自:[02: gitlab-ci.yml 文件编写](https://blog.csdn.net/weixin_43730107/article/details/135839032)
|
||||||
|
|
||||||
|
### 1.什么是gitlab-ci.yml文件
|
||||||
|
|
||||||
|
`gitlab-ci.yml` 文件是 GitLab CI/CD 的配置文件,它描述了各项任务如何和何时在版本控制过程中执行。文件中定义了一系列的任务或`jobs`,这些jobs可以被组织到各个阶段,并在触发某些事件时自动运行,如代码提交或代码合并。每次提交或推送都会触发一个新的 CI/CD `pipeline`,`gitlab-ci.yml` 文件便是负责协调和控制这个 `pipeline` 执行过程的大脑。
|
||||||
|
|
||||||
|
### 2.创建第一个 gitlab-ci.yml 文件
|
||||||
|
|
||||||
|
**文件结构示例**
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
build_job:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- echo "This is the build stage"
|
||||||
|
|
||||||
|
test_job:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- echo "This is the test stage"
|
||||||
|
|
||||||
|
deploy_job:
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- echo "This is the deploy stage"
|
||||||
|
```
|
||||||
|
|
||||||
|
`stages` 定义一组阶段,然后在每个工作描述中使用 `stage` 关键字指定其属于哪个阶段。`GitLab CI/CD`将会按照 `stages` 定义的**阶段顺序以及每个阶段内的作业并行度来执行作业**。
|
||||||
|
|
||||||
|
### 3.特殊指令
|
||||||
|
|
||||||
|
#### before_script
|
||||||
|
|
||||||
|
通常`before_script`在`gitlab-ci.yml` 文件的顶层定义,作为全局设置。这样定义的 `before_script` 会在每个作业(job)执行前都会运行。before_script 虽然有全局配置的偏好,但也可以根据需要在单独的作业中定义。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 在这个配置中,全局 before_script 会在 job1 和 job2 两个作业之前都执行一次。
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- echo "This is a global before_script."
|
||||||
|
|
||||||
|
job1:
|
||||||
|
stage: build
|
||||||
|
script: echo "This is job1."
|
||||||
|
|
||||||
|
job2:
|
||||||
|
stage: build
|
||||||
|
script: echo "This is job2."
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
也可以在具体的作业中定义 before_script,这样设置的 before_script 会只影响这个作业。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# job1 的 before_script 被重写为 "echo "This is a job-specific before_script."",并且只在 job1 执行前运行。
|
||||||
|
# 全局的 before_script 不会在 job1 之前执行,但会在 job2 之前执行。
|
||||||
|
# 作业特定的 before_script 会覆盖全局的定义。
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- echo "This is a global before_script."
|
||||||
|
|
||||||
|
job1:
|
||||||
|
stage: build
|
||||||
|
before_script:
|
||||||
|
- echo "This is a job-specific before_script."
|
||||||
|
script: echo "This is job1."
|
||||||
|
|
||||||
|
job2:
|
||||||
|
stage: build
|
||||||
|
script: echo "This is job2."
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### after_script
|
||||||
|
|
||||||
|
after_script:它类似于 before_script,定义在这里的命令会在每个作业(job)的 script 部分执行完毕后运行。这常常用来在作业完成之后清理环境或存储日志等。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### variables
|
||||||
|
|
||||||
|
可以定义一组环境变量,这些变量会在所有作业中可用。例如,你可能需要在多个作业中使用同一个数据库的链接地址。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
variables:
|
||||||
|
DATABASE_URL: "postgres://user:pass@example.com:5432/dbname"
|
||||||
|
job1:
|
||||||
|
stage: build
|
||||||
|
script: echo "The database url is $DATABASE_URL."
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### stages
|
||||||
|
|
||||||
|
定义作业的执行阶段。GitLab CI/CD 会按照 `stages` 的顺序执行作业。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
job1:
|
||||||
|
stage: build
|
||||||
|
script: echo "Build stage"
|
||||||
|
job2:
|
||||||
|
stage: test
|
||||||
|
script: echo "Test stage"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### rules and only/except
|
||||||
|
|
||||||
|
这两个指令都用于定义作业执行的条件。例如,你可以设置一个作业只在特定分支的提交时运行。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
build_job:
|
||||||
|
stage: build
|
||||||
|
script: echo "This is building stage."
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
|
||||||
|
test_job:
|
||||||
|
stage: test
|
||||||
|
script: echo "This is testing stage."
|
||||||
|
except:
|
||||||
|
- master
|
||||||
|
|
||||||
|
deploy_job:
|
||||||
|
stage: deploy
|
||||||
|
script: echo "This is deploying stage."
|
||||||
|
rules:
|
||||||
|
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||||
|
when: always
|
||||||
|
- if: '$CI_COMMIT_BRANCH != "master"'
|
||||||
|
when: never
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
`build_job` 仅在主分支(`master`)上运行。相反,test_job会在所有分支上运行,除非是主分支。deploy_job 也仅在主分支上运行,使用了 `rules` 指令来实现这个条件,这是一个更复杂的条件判断,不同的规则 (if 语句)可以应对更为复杂的情况。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### cache
|
||||||
|
|
||||||
|
允许你定义一个缓存,这个缓存可以在作业之间共享。这常常用于缓存依赖,以加快构建的速度。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- install
|
||||||
|
- build
|
||||||
|
|
||||||
|
variables:
|
||||||
|
BUNDLE_PATH: vendor/bundle
|
||||||
|
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- vendor/bundle
|
||||||
|
|
||||||
|
install:
|
||||||
|
stage: install
|
||||||
|
script:
|
||||||
|
- bundle install --path vendor/bundle
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- bundle exec rake build
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个示例中,我们将 Ruby gems 安装到 vendor/bundle 目录下,然后在 cache 指令中声明这个路径来缓存这些 gems。
|
||||||
|
|
||||||
|
这样做的好处是,当在后续的作业或者后续的 pipeline 运行时,不需要重新下载和安装这些 gems,在此 .gitlab-ci.yml 文件的配置中,如果 cache 设置正确并且有效,然后在 vendor/bundle 路径下的gems没有发生变化(即 Gemfile 和 Gemfile.lock 文件没有发生改变),那么 bundle install --path vendor/bundle 命令就不会再次下载已经缓存的 gems。这是因为 Bundler(Ruby的依赖管理工具)会检查 gems 是否已经存在,如果已经存在并且版本匹配,那么就不会再次下载。
|
||||||
|
|
||||||
|
综上,对于重复的 install 作业,如果 Gemfile 和 Gemfile.lock 中的内容没有发生变化,那么即使在 pipeline 再次运行此作业,也不会再次下载已经缓存的 gems,从而可以加快构建的速度。可以大大减少构建的时间。
|
||||||
|
|
||||||
|
`install` 和 `build` 两个作业分别在 `install` 和 `build` 阶段运行。`install` 阶段会使用 `bundle install` 命令来下载和安装 gems,build 阶段则使用 `bundle exec` 来执行构建命令。
|
||||||
|
通过这个配置,我们就可以在多个作业之间,以及多次 `pipeline` 运行之间共享这些 `gem` 的缓存,以此来加快构建的速度。
|
||||||
|
|
||||||
|
对于重复的 install 作业,在下次pipeline中会再次运行吗?
|
||||||
|
如果 cache 设置正确并且有效,然后在 vendor/bundle 路径下的gems没有发生变化(即 Gemfile 和 Gemfile.lock 文件没有发生改变),那么 bundle install --path vendor/bundle 命令就不会再次下载已经缓存的 gems。这是因为 Bundler(Ruby的依赖管理工具)会检查 gems 是否已经存在,如果已经存在并且版本匹配,那么就不会再次下载。
|
||||||
|
|
||||||
|
综上,对于重复的 install 作业,如果 Gemfile 和 Gemfile.lock 中的内容没有发生变化,那么即使在 pipeline 再次运行此作业,也不会再次下载已经缓存的 gems,从而可以加快构建的速度。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### artifacts
|
||||||
|
|
||||||
|
声明一些构建产物,这些产物将会在 `gitlab-ci.yml` 文件中其他作业或后续阶段的作业中可用,或者可供直接下载查看。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- mkdir build
|
||||||
|
- echo "Build artifacts" > build/artifacts.txt
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- build/
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- cat build/artifacts.txt
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个示例中,我们的 pipeline 分为两个阶段:build 和 test。在 build 阶段运行的 build 作业中,我们创建了一个 build 目录,并在其中生成了一个名为 artifacts.txt 的文件。
|
||||||
|
|
||||||
|
然后,我们使用 `artifacts` 指令声明了 `build/` 路径下的所有文件都是构建产物,GitLab CI/CD 将会在构建完成后收集这些产物。
|
||||||
|
|
||||||
|
在后续的 test 阶段的 test 作业中,我们可以直接访问到这个 artifacts.txt 文件。也就是说,通过 `artifacts` 允许我们在后续阶段的作业中使用到前一阶段的构建产物。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### include
|
||||||
|
|
||||||
|
用于在当前 .gitlab-ci.yml 文件中引入其他的 CI/CD 配置文件,可以实现配置的模块化和共享。被引入的文件可以位于同一项目的其它位置,也可以位于其他项目,甚至可以从远程的 HTTP(S) URL 中引入。引入的文件将像是在主配置文件中一样被解析和执行,这对于大型项目或需要共享 CI/CD 配置的情况很有用。
|
||||||
|
比如说,你有一个库 my-great-library。该库有自己的 .gitlab-ci.yml 文件,如下:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
variables:
|
||||||
|
BUILD_DIR: build
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- mkdir ${BUILD_DIR}
|
||||||
|
- echo "Building the library" > ${BUILD_DIR}/result.txt
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- echo "Testing the library"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
而你在其他许多项目里都依赖这个库,并且需要对这个库进行构建和测试。这时,你可以在其他项目的 CI 标记 include,将这个库的 CI/CD 配置包含进来,例如:
|
||||||
|
项目 project-1 的 .gitlab-ci.yml:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
include:
|
||||||
|
- project: 'yourusername/my-great-library'
|
||||||
|
file: '.gitlab-ci.yml'
|
||||||
|
```
|
||||||
|
|
||||||
|
这样就可以实现在多个项目中共享一个统一的 CI/CD 配置,避免了每个项目都需要重复编写相同的配置,从而大大提高了效率。同时也有利于集中管理和修改这个共享的配置。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### extends
|
||||||
|
|
||||||
|
用于复用已经定义的特定配置。在 GitLab CI/CD 配置中,我们可以定义一些通用的配置作为模板,例如设定重用的 `script` 块或者 `before_script` 块等,然后在需要的地方使用 `extends` 进行引用。不同于 `include` 关键词,`extends `并不会引入新的文件,而是仅仅在当前文件内部进行配置的重用。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 我们首先声明一个 '.base_job',这个定义包含了所有作业共有的部分
|
||||||
|
.base_job:
|
||||||
|
before_script:
|
||||||
|
- echo "Setting up the job environment"
|
||||||
|
after_script:
|
||||||
|
- echo "Cleaning up after job"
|
||||||
|
|
||||||
|
# '.build_template' 扩展了 '.base_job',并添加了构建阶段特有的设定
|
||||||
|
.build_template:
|
||||||
|
extends: .base_job
|
||||||
|
variables:
|
||||||
|
BUILD_DIR: build
|
||||||
|
script:
|
||||||
|
- mkdir ${BUILD_DIR}
|
||||||
|
- echo "Building the project" > ${BUILD_DIR}/output.txt
|
||||||
|
stage: build
|
||||||
|
|
||||||
|
# '.test_template' 也扩展了 '.base_job',然后添加了测试阶段特有的设定
|
||||||
|
.test_template:
|
||||||
|
extends: .base_job
|
||||||
|
script:
|
||||||
|
- echo "Testing the project"
|
||||||
|
stage: test
|
||||||
|
|
||||||
|
# 现在我们定义具体的构建和测试作业,它们分别扩展了 '.build_template' 和 '.test_template'
|
||||||
|
job1:
|
||||||
|
extends: .build_template
|
||||||
|
variables:
|
||||||
|
JOB_NAME: JOB1
|
||||||
|
|
||||||
|
job2:
|
||||||
|
extends: .test_template
|
||||||
|
variables:
|
||||||
|
JOB_NAME: JOB2
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
通过 .base_job,我们为所有作业指定了公共的 before_script 和 after_script。然后,对于构建和测试阶段,我们又分别创建了扩展了 .base_job 的 .build_template 和 .test_template。最后,我们创建了两个具体的作业 job1 和 job2,它们扩展了各自的模板并添加了一些特定的配置。.base_job作为模板,.build_template和.test_template去继承它,如果二者都有相同的key,则使用子类的value覆盖父类,同理job1和job2。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### tags
|
||||||
|
|
||||||
|
`tags`是用来选择执行该 `job` 的特定 `Runner`。
|
||||||
|
|
||||||
|
Runner 是 GitLab 提供的用于执行 CI/CD 任务的服务。每个 Runner 可以配置一组标签(tags),这样在定义 CI/CD 任务时,就可以通过设置相应的 tags 来选择对应的 Runner 来执行任务。
|
||||||
|
|
||||||
|
tags 中的 arm 指的是这个任务build_docker_arm必须由带有 arm 标签的 Runner 执行。这通常表示这个 Runner 是能够构建 ARM 架构 Docker 镜像的环境。如果没有带 arm 标签的 Runner,该任务会排队等待,直到有合适的 Runner 可用。所以这个 tags 配置是用来选择 Runner,而不是在 build 镜像时指定基础镜像。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -231,7 +231,7 @@ Vue3中生命周期API(选项式 VS 组合式)
|
||||||
```html
|
```html
|
||||||
<script setup>
|
<script setup>
|
||||||
// 通过 deineEmits “编译器宏函数” 生成 emit 方法
|
// 通过 deineEmits “编译器宏函数” 生成 emit 方法
|
||||||
const emit = deineEmits(['get-message'])
|
const emit = defineEmits(['get-message'])
|
||||||
const sendMsg = ()=>{
|
const sendMsg = ()=>{
|
||||||
emit('get-message','发送给父组件的数据')
|
emit('get-message','发送给父组件的数据')
|
||||||
}
|
}
|
||||||
|
|
@ -245,6 +245,8 @@ Vue3中生命周期API(选项式 VS 组合式)
|
||||||
|
|
||||||
#### 3.7 模版引用
|
#### 3.7 模版引用
|
||||||
|
|
||||||
|
##### 3.7.1 获取模版实例
|
||||||
|
|
||||||
通过`ref标识`获取真实的dom对象或者**组件实例对象**。
|
通过`ref标识`获取真实的dom对象或者**组件实例对象**。
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
|
|
@ -270,6 +272,40 @@ Vue3中生命周期API(选项式 VS 组合式)
|
||||||
</template>
|
</template>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**for循环**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<div v-for="(item,index) in cacheComponents" :key="item.id" :ref="cacheComDivRef" tabindex="1"></div>
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const cacheComDivRefInstance = ref([]);
|
||||||
|
const cacheComDivRef = (el)=>{
|
||||||
|
if(el){
|
||||||
|
cacheComDivRefInstance.value.push(el)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
当组件在for循环内部时:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<div v-for="(item,index) in cacheComponents" :key="item.id" :ref="cacheComDivRef" tabindex="1">
|
||||||
|
<component :is="item.cptKey" :ref="el=>cacheComRef(el,index)" />
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
let cacheComRefInstance = ref([]);
|
||||||
|
const cacheComRef = (el,index)=>{
|
||||||
|
if(el){
|
||||||
|
cacheComRefInstance.value[index] = el
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 3.7.2 暴露实例的方法
|
||||||
|
|
||||||
`defineExpose()`
|
`defineExpose()`
|
||||||
|
|
||||||
默认情况下在`<script setup>`语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpose编译宏指定哪些属性和方法允许访问。
|
默认情况下在`<script setup>`语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpose编译宏指定哪些属性和方法允许访问。
|
||||||
|
|
@ -361,9 +397,45 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 3.10 nextTick
|
||||||
|
|
||||||
|
在 Vue 3 中 nextTick() 方法的行为和 Vue 2 中基本相似,但它进行了一些优化,以提高性能和稳定性。nextTick() 通过利用微任务(microtask)来确保在 DOM 更新之后执行回调,从而避免在同一事件循环中执行 DOM 操作。简单的理解是,当数据更新了,在dom中渲染后,自动执行函数。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 使用 nextTick() 方法
|
||||||
|
import { ref, nextTick } from 'vue';
|
||||||
|
|
||||||
|
const myValue = ref('initial value');
|
||||||
|
|
||||||
|
// 在 DOM 更新后执行回调
|
||||||
|
nextTick(() => {
|
||||||
|
console.log('DOM 已更新');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
在onMounted中使用
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 示例 2: 在 setup() 中使用 nextTick()
|
||||||
|
import { ref, onMounted, nextTick } from 'vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
const myValue = ref('initial value');
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// 在 DOM 更新后执行回调
|
||||||
|
nextTick(() => {
|
||||||
|
console.log('DOM 已更新');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
myValue,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,18 @@
|
||||||
|
-----BEGIN CERTIFICATE REQUEST-----
|
||||||
|
MIIC+DCCAeACAQAwgYgxCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
|
||||||
|
DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
|
||||||
|
ZDEVMBMGA1UEAxMMcWl1c2hpamllLmNuMRwwGgYDVQQFExM2MzA2Njg4NzYzNzgz
|
||||||
|
MTgwMDg0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/ayERQM5qy1
|
||||||
|
NDrjfg9n2hlAqdb2aUY/FYgwg670iVsjXnDlV0wo1xVkEEwE3nij58PHLTxaSID7
|
||||||
|
+vUbbSAfiVsmw0gLd0waxVqjf64IhYFjpGpL2ohJE7B7ZATySgpN6eTpAGNEbSWu
|
||||||
|
ZjvKIFk3SDf0FsADuSs9+0IZjA6qutqLNl7lR6pTGBt235RwHx3n1gzXMawgIUe+
|
||||||
|
urwajBs7HtUG1ic38ML4EnvuU1DN3PJLZApPRtyfUtx7QPYcpJq6e5ybCzrVAoNg
|
||||||
|
3d2ma2np+qXQTs4K4g9vkBnv9foiEt6CLlnk4gb9FaZZYajFQvr/95mKJraCpcdk
|
||||||
|
8LhjYS1hcwIDAQABoCowKAYJKoZIhvcNAQkOMRswGTAXBgNVHREEEDAOggxxaXVz
|
||||||
|
aGlqaWUuY24wDQYJKoZIhvcNAQELBQADggEBAJbN14nHfPl0auhX9+3+MRveQpSs
|
||||||
|
gJqI+qe62RlOMbVVIRnO+8AbnxtKGefwCOU87d5qGXU4GUpXgkDRgahjh33FrKZF
|
||||||
|
UIb+BTgwrW2iBxmsOz/SUBx0Z/mawfhijV383PJa9Mf8pxClsgACdgnu04fswoRK
|
||||||
|
YVZx8JGFA5YHeMrjaSwb0i+55PLIFf3589bmXpnrBzmGFt2FGmieMsFROC1J0cqi
|
||||||
|
6QNR5VhngW+HklMYR1rW+hGKOmBJL18q7rOtmURee9XaHzqxLZWLG/z8P2Ia78Rj
|
||||||
|
dLgApDCSsQ6eMH/AvWSLa5hvG5O1X8pRN6afcFFHH0kwLBAHubCn4BTz++s=
|
||||||
|
-----END CERTIFICATE REQUEST-----
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEAv/ayERQM5qy1NDrjfg9n2hlAqdb2aUY/FYgwg670iVsjXnDl
|
||||||
|
V0wo1xVkEEwE3nij58PHLTxaSID7+vUbbSAfiVsmw0gLd0waxVqjf64IhYFjpGpL
|
||||||
|
2ohJE7B7ZATySgpN6eTpAGNEbSWuZjvKIFk3SDf0FsADuSs9+0IZjA6qutqLNl7l
|
||||||
|
R6pTGBt235RwHx3n1gzXMawgIUe+urwajBs7HtUG1ic38ML4EnvuU1DN3PJLZApP
|
||||||
|
RtyfUtx7QPYcpJq6e5ybCzrVAoNg3d2ma2np+qXQTs4K4g9vkBnv9foiEt6CLlnk
|
||||||
|
4gb9FaZZYajFQvr/95mKJraCpcdk8LhjYS1hcwIDAQABAoIBAHCqGVhsrCW2t6Mv
|
||||||
|
7NTPteQLbihAQd8Hm37Hr7GZvWvgUaHcIL5btJyHsXLfKvxnUct03DFweoyTJ1Dj
|
||||||
|
CnXBpMC4/sceQZyCzjOGPu9w9Q9mIVUeDeb0le84ZTMOtCVAZvofn6Daog5tTy4x
|
||||||
|
aTATLJ72OAwiJg1Hk9kjslrBQPLozQQUmSXQwfSG3XCYRafb+jZAaUEjG5wlYPwH
|
||||||
|
R9ZQZHiEPbd5Y5MqkTlt3krgixW/+rqUCJOS7QJGi4lo2dJi019/gbcbVpnz/Doe
|
||||||
|
HSnvgwkySPp5UkR22kM8wwkAwRsERD2V8TMkFqAZ9DLasHRfMAhp9GuZ9UqvYS+l
|
||||||
|
oYTvoAECgYEA4qsOjPyg9+F99Sa/gYF0NVDB3LXMNRldtQjZ22CEDRE6IgzF0Gv+
|
||||||
|
FNzKMw5RxMdew29DWJ+nYQ+r+RR5MQ9//NLf1q3PpOsLtrvHtcB6tS0Bn53Cf+hg
|
||||||
|
HOpmZ3+QH/wfA5b8i+3310w85OXF4ySahebL63oJfccBIHPb93//BbMCgYEA2M33
|
||||||
|
IBqf4VrDTBu44kMi3kXccircUbEDMDwNPh8TmA6cqZtvtPWNsmk9tqHc0BIYUeVY
|
||||||
|
MZj35szbOaeqsGf5sN1uK4JImBiswvUvV7IXX3KOxXqB38Fl2pEaJZorU0MDA3o5
|
||||||
|
roKc7RtMWtdeLPyfRq/wJLUZa0gq7WLVEN4V1UECgYEAg3O+eYcc9wSfnqe9Eib4
|
||||||
|
NN9DvnL0Has7S/z5Ex+zFTzzYMHVipzGemTdIqTgSOVykJabEO9uC30iN85mxkv9
|
||||||
|
5qqIw6CDNlpVrcDS/hXFVALo2R+Np84kx0As6ULyW4pEljle9uun+wUsn3adv6//
|
||||||
|
qT4C7uoUTQw3HBH09GEXjb8CgYAVuXXE4sYYh8bADpsVGRMaYLe5PPA8w1cFc08E
|
||||||
|
ZYrKFtS97hRgdqaPNRp4/Xkp5FZJhoiy15gnqWliOpnQ+Wo8vcN3WqO5kedl1bm7
|
||||||
|
uN28s7b4tNDkwfVZ1GZhVDR5MGLR62JySSY+YBjjlWcbbOjs5V5T302/wUiD5v5g
|
||||||
|
pVBcwQKBgFmo5pq0oyUNaN8ffzOFA187qBmgc/VGFPvILJAMoeEt1UvzbM2aNrnN
|
||||||
|
gmyuo5bOnrOGgURYt+8AenHmWP0i2xlvvakjeMolI0V/VMswNGi+ukG4+GkzUAAK
|
||||||
|
71svqaGAY3et34TZobQk2oIKGmOKhCdttjqLm+ctqjd6KznAdm8G
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh
|
||||||
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
|
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
||||||
|
MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO
|
||||||
|
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD
|
||||||
|
ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF
|
||||||
|
AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R
|
||||||
|
/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq
|
||||||
|
/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW
|
||||||
|
ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs
|
||||||
|
ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7
|
||||||
|
+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto
|
||||||
|
Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX
|
||||||
|
FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2
|
||||||
|
20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN
|
||||||
|
D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn
|
||||||
|
2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC
|
||||||
|
AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0
|
||||||
|
wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485
|
||||||
|
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
|
||||||
|
dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
|
||||||
|
dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
|
||||||
|
aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
|
||||||
|
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV
|
||||||
|
HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx
|
||||||
|
mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ
|
||||||
|
I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR
|
||||||
|
r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/
|
||||||
|
71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C
|
||||||
|
ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC
|
||||||
|
gJE=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh
|
||||||
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
|
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
|
||||||
|
MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO
|
||||||
|
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD
|
||||||
|
ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF
|
||||||
|
AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R
|
||||||
|
/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq
|
||||||
|
/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW
|
||||||
|
ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs
|
||||||
|
ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7
|
||||||
|
+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto
|
||||||
|
Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX
|
||||||
|
FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2
|
||||||
|
20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN
|
||||||
|
D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn
|
||||||
|
2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC
|
||||||
|
AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0
|
||||||
|
wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485
|
||||||
|
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
|
||||||
|
dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
|
||||||
|
dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
|
||||||
|
aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
|
||||||
|
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV
|
||||||
|
HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx
|
||||||
|
mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ
|
||||||
|
I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR
|
||||||
|
r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/
|
||||||
|
71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C
|
||||||
|
ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC
|
||||||
|
gJE=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
Loading…
Reference in New Issue