gitlab-ci部署实现持续集成(centos7)
一、gitlab安装
1. 环境准备
// selinux和 firewall 关闭
$ setenforce 0
$ sed -i "/^SELINUX/s/enforcing/disabled/" /etc/selinux/config
$ systemctl stop firewalld
$ systemctl disable firewalld
2. 离线安装
$ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.10.0-ce.0.el7.x86_64.rpm/download.rpm //有的时候会下载报错,建议使用浏览器下载完成后,再拷贝
$ EXTERNAL_URL="http://xxxxxxx" yum -y install gitlab-ce-12.10.0-ce.0.el7.x86_64.rpm
二、Runner安装
1、centos安装runner:
1)下载:https://gitlab-runner-downloads.s3.amazonaws.com/latest/index.html
2)不作为安装:yum -y install gitlab-runner_amd64.rpm
3)作为服务安装:gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
4)启动服务:gitlab-runner start
2、docker安装runner:
1)安装docker:
$ curl -L --output /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum -y install docker-ce
$ mkdir /etc/docker
$ tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://g9ppwtqr.mirror.aliyuncs.com"] } EOF
$ systemctl start docker && systemctl enable docker
2)启动docker:
$ docker run -d --name gitlab-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /data/etc/gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:latest
$ docker logs gitlab-runner # 读取docker日志
三、Runner注册
1、注册一个全局 Runner
//使用主机方式注册(也可以使用docker注册,详情见下)
$ 注册:gitlab-runner register
Runtime platform arch=amd64 os=linux pid=23268 revision=c553af1a version=12.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://xxxx # 写入gitlab的地址
Please enter the gitlab-ci token for this runner:
zsy4iJK4-hPh8KctpVkM # 写入全局的token
Please enter the gitlab-ci description for this runner:
[c720133.xiodi.cn]: # 写入概runner的描述
Please enter the gitlab-ci tags for this runner (comma separated):
host20133,host-shell # 写入使用标签
Registering runner... succeeded runner=zsy4iJK4
Please enter the executor: virtualbox, docker+machine, docker-ssh, docker, parallels, shell, ssh, docker-ssh+machine, kubernetes, custom:
shell # 写入使用执行器
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
2、注册一个组 Runner
//使用 docker 方式注册(也可以使用主机注册,详情见上)
$ 启动docker:docker run -d --name gitlab-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /data/etc/gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:latest
$ 注册:gitlab-runner register
Runtime platform arch=amd64 os=linux pid=32 revision=c553af1a version=12.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://xxxx # 写入gitlab的地址
Please enter the gitlab-ci token for this runner:
Zz6yDBiRYLzdEBaHZL # 写入全局的token
Please enter the gitlab-ci description for this runner:
[dfa0f083e588]: host20133-docker-gitlab-runner # 写入概runner的描述
Please enter the gitlab-ci tags for this runner (comma separated):
group-host20133-docker,docker # 写入使用标签
Registering runner... succeeded runner=Zz6yDBiR
Please enter the executor: shell, ssh, virtualbox, docker-ssh+machine, docker+machine, kubernetes, custom, docker, docker-ssh, parallels:
docker # 写入使用执行器
Please enter the default Docker image (e.g. ruby:2.6):
harbor.xiodi.cn/tools/alpine:3.11 #写入默认镜像
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
3、注册一个项目 Runner
//(可使用 docker 方式注册,也可以使用主机注册,详情见上)
$ 启动docker:docker run -d --name gitlab-runner2 --restart always -v /data/etc/gitlab-runner2:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
$ 注册:gitlab-runner register
三、Runner常用命令
1、查看可使用命令:gitlab-runner --help
2、查看子命令使用:gitlab-runner <command> --help
3、注册:gitlab-runner register
4、列出配置文件中的所有runner:gitlab-runner list
5、验证是否被 GitLab 使用:gitlab-runner verify
6、注销特定的 Runner:gitlab-runner unregister
7、服务安装:gitlab-runner install
8、服务卸载:gitlab-runner uninstall
9、服务启动-:gitlab-runner start
10、服务停止:gitlab-runner stop
11、服务重启:gitlab-runner restart
12、服务状态:gitlab-runner status
13、从GitLab下载工件档案:gitlab-runner artifacts-downloader
14、将工件档案上传到GitLab:gitlab-runner artifacts-uploader
15、创建缓存存档,将其存储在本地或将其上传到外部服务器:gitlab-runner cache-archiver
16、从本地或外部存储的文件还原缓存档案:gitlab-runner cache-extractor
四、Runner配置详解
1、使用主机安装查看runner配置
$ cat /etc/gitlab-runner/config.toml
[session_server](区段是一个系统 Runner 级别的配置,因此它应该在根级别指定,而不是在每个执行器上,也就是说,它应该在[[runners]]区段之外。会话服务器允许用户与运行程序负责的作业进行交互。交互式web终端就是一个很好的例子。)
| listen_address | 用于会话服务器的内部URL。 |
| advertise_address | Runner 将公开给GitLab用于访问会话服务器的URL。返回listen_address(如果没有定义)。 |
| session_timeout | 作业完成后会话保持活动的时间(这会阻止作业完成),默认为1800(30分钟)。 |
[runners]
| url | GitLab URL |
| token | Runner的通信令牌(请勿与注册令牌混淆) |
| tls-ca-file | 使用HTTPS时用于验证对等方的证书的文件 |
| tls-cert-file | 使用HTTPS时要与对等方进行身份验证的证书的文件 |
| tls-key-file | 使用HTTPS时要与对等方进行身份验证的私钥的文件 |
| limit | 限制此令牌可以同时处理多少个作业。0(默认)表示不限制 |
| executor | 构建项目要使用的执行器 |
| shell | 默认情况下,在本地运行build |
| bash | 生成Bash (Bourne-shell)脚本。在Bash上下文中执行的所有命令(所有Unix系统的缺省值) |
| sh | 生成Sh (Bourne-shell)脚本。在Sh上下文中执行的所有命令(所有Unix系统的bash后备命令) |
| cmd | 生成Windows批处理脚本。所有命令都在批处理上下文中执行(默认为Windows) |
| powershell | 生成Windows PowerShell脚本。所有命令都在PowerShell上下文中执行 |
| docker | 使用Docker容器运行构建。这需要`[runners.docker]`的存在。和`docker引擎`安装在一个系统上,运行程序将在该系统上运行作业。 |
| docker-windows | 使用Windows Docker容器运行构建。这需要`[runners.docker]`和`docker引擎`安装在Windows系统上。 |
| docker-ssh | 使用Docker容器运行构建,但是使用SSH连接到它——这需要`[runners.docker]` , `[runners.ssh]`和`Docker引擎`。注意:这将在`本地机器上运行docker容器`,它只是改变了命令在该容器内的运行方式。如果希望在外部机器上运行docker命令,那么应该更改 `runners.docker` 中的 `host` 参数。 |
| ssh | 使用SSH远程运行构建—这需要有`[runner.ssh]` |
| parallels | 使用Parallels VM运行构建,但是使用SSH连接到它——这需要[runners.parallels] and [runners.ssh] |
| virtualbox | 使用VirtualBox VM运行构建,但是使用SSH连接到它——这需要[runners.virtualbox] and [runners.ssh] |
| docker+machine | 像docker,但使用自动缩放的docker machines -这需要存在[runners.docker] and [runners.machine] |
| docker-ssh+machine | 与docker-ssh类似,但是使用自动伸缩的Docker机器——这需要[runners.docker] and [runners.machine] |
| kubernetes | 使用Kubernetes pod运行构建——这需要有`[runner.Kubernetes]`的存在。 |
| builds_dir | 目录的绝对路径,构建将存储在选定执行程序(本地、Docker、SSH)的上下文中。 |
| cache_dir | 目录的绝对路径,其中构建缓存将存储在选定的执行程序(本地、Docker、SSH)的上下文中。如果使用docker executor,则需要在其卷参数中包含此目录。 |
| environment | 追加或覆盖环境变量 |
| request_concurrency | 限制GitLab对新作业的并发请求数量(默认1) |
| output_limit | 设置最大构建日志大小(以kb为单位),默认设置为4096 (4MB) |
| pre_clone_script | 在克隆Git存储库之前要在Runner上执行的命令。例如,这可以首先用于调整Git客户机配置。要插入多个命令,请使用(三引号)多行字符串或“\n”字符。 |
| pre_build_script | 在克隆Git存储库之后,但在执行构建之前,要在Runner上执行的命令。要插入多个命令,请使用(三引号)多行字符串或“\n”字符。 |
| post_build_script | 要在Runner上执行的命令在执行构建之后,但在执行after_script之前执行。要插入多个命令,请使用(三引号)多行字符串或“\n”字符。 |
| clone_url | 覆盖GitLab实例的URL。如果Runner无法在URL GitLab上连接到GitLab,则使用GitLab。 |
| debug_trace_disabled | 禁用CI_DEBUG_TRACE特性。当设置为true时,即使用户将CI_DEBUG_TRACE设置为true,调试日志(跟踪)也将保持禁用状态。 |
| referees | 额外的工作(job)监视工作者(workers),将他们的结果作为工作工件传递给GitLab |
2、使用docker安装查看runner配置
$ cat /data/etc/gitlab-runner/config.toml (具体路径依docker run而定)
[runners.docker]
| host | 指定自定义Docker端点,默认使用`DOCKER_HOST`环境或 unix:///var/run/docker.sock |
| hostname | 为Docker容器指定自定义主机名 |
| runtime | 为Docker容器指定一个运行时 |
| tls_cert_path | 设置时将使用ca.pem、cert.pem和key。从该文件夹中的pem建立到Docker的安全TLS连接(在boot2docker中非常有用) |
| tls_verify | 启用或禁用连接到Docker守护进程的TLS验证。默认情况下禁用。 |
| image | 使用此映像运行构建 |
| memory | 包含内存限制的字符串值 |
| memory_swap | 包含总内存限制的字符串值 |
| memory_reservation | 包含内存软限制的字符串值 |
| oom_kill_disable | 如果发生内存不足(OOM)错误,不要杀死容器中的进程 |
| oom_score_adjust | OOM分数调整,正意味着杀得早 |
| cpuset_cpus | 包含要使用的cgroups cpusetcpu的字符串值 |
| cpu_shares | 用于设置相对CPU使用量的CPU共享数量,默认为1024 |
| cpus | cpu数量的字符串值(在docker 1.13或更高版本中可用) |
| dns | 容器要使用的DNS服务器的列表 |
| dns_search | DNS搜索域的列表 |
| privileged | 使容器以特权模式运行(不安全) |
| disable_entrypoint_overwrite | 禁用映像 entrypoint 覆盖 |
| userns_mode | 当启用usernamespace重新映射选项时,为容器设置usernamespace模式。(可在docker1.10或更高版本中获得) |
| cap_add | 向容器添加额外的Linux功能 |
| cap_drop | 从容器中删除额外的Linux功能 |
| security_opt | 设置安全选项(-security-opt in docker run),获取':'分隔键/值的列表 |
| devices | 与容器共享其他主机设备 |
| cache_dir | 指定Docker缓存应该存储在哪里(可以是绝对的,也可以是相对于当前工作目录的)。有关更多信息,请参见disable_cache。 |
| disable_cache | Docker执行器有两层缓存:全局缓存(与任何其他执行器一样)和基于Docker卷的本地缓存。此配置标志仅作用于禁止使用自动创建(未映射到主机目录)缓存卷的本地缓存卷。换句话说,它只阻止创建保存构建的临时文件的容器,如果运行器配置为分布式缓存模式,它不会禁用缓存。 |
| network_mode | 将容器添加到自定义网络 |
| wait_for_services_timeout | 指定等待docker服务的时间,设置为0禁用,默认为30 |
| volumes | 指定应该挂载的其他卷(与Docker的-v标志相同的语法) |
| extra_hosts | 指定应该在容器环境中定义的主机 |
| shm_size | 为映像指定共享内存大小(以字节为单位) |
| volumes_from | 以`<container name>[:<ro|rw>]`的形式指定要从另一个容器继承的卷的列表。访问级别默认为读写,但可以手动设置为ro(只读)或rw(读写)。 |
| volume_driver | 指定容器使用的卷驱动程序 |
| links | 指定应该与构建容器链接的容器 |
| allowed_images | 指定可以在.gitlab-ci.yml中指定的图像的通配符列表。如果不提供所有映像,则允许(相当于`["*/*:*"]`) |
| allowed_services | 指定可以在.gitlab-ci.yml中指定的通配符服务列表。如果不提供所有映像,则允许(相当于`["*/*:*"]`) |
| pull_policy | 指定映像拉取策略:`never`,`if-not-present`或 `always`(默认);请参阅pull策略文档 |
| sysctls | 指定sysctl选项 |
| helper_image | (高级)覆盖用于克隆repos和上传工件的默认 `helper 映像` |
示例:
[runners.docker]
host = ""
hostname = ""
tls_cert_path = "/Users/ayufan/.boot2docker/certs"
image = "ruby:2.6"
memory = "128m"
memory_swap = "256m"
memory_reservation = "64m"
oom_kill_disable = false
cpuset_cpus = "0,1"
cpus = "2"
dns = ["8.8.8.8"]
dns_search = [""]
privileged = false
userns_mode = "host"
cap_add = ["NET_ADMIN"]
cap_drop = ["DAC_OVERRIDE"]
devices = ["/dev/net/tun"]
disable_cache = false
wait_for_services_timeout = 30
cache_dir = ""
volumes = ["/data", "/home/project/cache"]
extra_hosts = ["other-host:127.0.0.1"]
shm_size = 300000
volumes_from = ["storage_container:ro"]
links = ["mysql_container:mysql"]
allowed_images = ["ruby:*", "python:*", "php:*"]
allowed_services = ["postgres:9", "redis:*", "mysql:*"]
[[runners.docker.services]]
name = "mysql"
alias = "db"
[[runners.docker.services]]
name = "redis:2.8"
alias = "cache"
[[runners.docker.services]]
name = "postgres:9"
alias = "postgres-db"
[runners.docker.sysctls]
"net.ipv4.ip_forward" = "1"
(以下是其他可用区段定义)
3、 [runners.ssh] 区段
| Parameter | Description |
| ------------ | ------------ |
| host | 连接到哪里(使用docker-ssh时被覆盖) |
| port | 指定端口,默认值:22 |
| user | 指定用户 |
| password | 指定密码 |
| identity_file | 指定SSH私有密钥的文件路径(id_rsa、id_dsa或id_edcsa)。文件需要不加密地存储 |
//示例
```bash
[runners.ssh]
host = "my-production-server"
port = "22"
user = "root"
password = "production-server-password"
identity_file = ""
```
4、 [runners.cache] 区段
GitLab Runner 1.1.0 中引入。
| Parameter | Type | Description |
| ------------ | ------------ | ------------ |
| Type | string | s3 或 gcs |
| Path | string | 添加到缓存URL前的路径的名称。 |
| Shared | boolean | 启用运行程序之间的缓存共享,默认为false。 |
##### (1)[runners.cache.s3]
允许配置S3存储用于缓存。本节包含与S3相关的设置,这些设置以前在该[runners.cache]节中全局存在。
//示例
```bash
[runners.cache]
Type = "s3"
Path = "path/to/prefix"
Shared = false
[runners.cache.s3]
ServerAddress = "s3.amazonaws.com"
AccessKey = "AMAZON_S3_ACCESS_KEY"
SecretKey = "AMAZON_S3_SECRET_KEY"
BucketName = "runners-cache"
BucketLocation = "eu-west-1"
Insecure = false
```
参考:https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnerscaches3-section
5、[runners.kubernetes] 区段
GitLab Runner v1.6.0 中添加
| Parameter | Type | Description |
| ------------ | ------------ | ------------ |
| host | string | 可选的Kubernetes主机URL(如果未指定,将尝试自动发现) |
| cert_file | string | 可选的Kubernetes认证证书 |
| key_file | string | 可选的Kubernetes主认证私钥 |
| ca_file | string | 可选的Kubernetes主认证证书 |
| image | string | 默认的docker镜像,当没有指定时用于构建 |
| namespace | string | 命名空间来运行Kubernetes作业 |
| privileged | boolean | 运行所有启用了特权标志的容器 |
| node_selector | table | 一个table的key=value对string=string。设置此限制将Pod的创建限制为与所有key=value对匹配的Kubernetes节点 |
| image_pull_secrets | array | 用于验证docker映像提取的秘密列表 |
//示例
```bash
[runners.kubernetes]
host = "https://45.67.34.123:4892"
cert_file = "/etc/ssl/kubernetes/api.crt"
key_file = "/etc/ssl/kubernetes/api.key"
ca_file = "/etc/ssl/kubernetes/ca.crt"
image = "golang:1.8"
privileged = true
image_pull_secrets = ["docker-registry-credentials"]
[runners.kubernetes.node_selector]
gitlab = "true"
```
更多参考:https://docs.gitlab.com/runner/executors/kubernetes.html
6、Helper image
当使用docker、docker+machine或kubernetes执行器之一时,GitLab Runner使用特定的容器来处理Git、工件和缓存操作。这个容器是由一个名为helper映像的特殊映像创建的。
helper 映像基于Alpine Linux,它提供amd64和arm架构。它包含一个`gitLab-run-helper`二进制文件,这是GitLab Runner二进制文件的特殊编译,只包含可用命令的一个子集,以及Git、Git LFS、SSL证书存储和Alpine的基本配置。
当从DEB/RPM包中安装GitLab Runner时,两个映像(amd64和基于arm的)都安装在主机上。当运行器为作业执行准备好环境时,如果在Docker引擎上没有找到指定版本(基于Runner的Git修订版)中的映像,则会自动加载它。它对docker和docker+machine执行器都是这样工作的。
对于kubernetes executor或手动安装GitLab Runner时,情况略有不同。对于手动安装,gitlab-runner-helper二进制文件不包括在其中,对于kubernetes executor, kubernetes的API不允许从本地存档加载gitlab-runner-helper映像。在这两种情况下,GitLab Runner都将从Docker Hub (GitLab的官方存储库GitLab / GitLab -run -helper)下载帮助器映像,方法是使用Runner的修订和架构来定义应该下载哪个标记
6.1 覆盖 helper image
在某些情况下,您可能需要覆盖帮助器映像。这样做的原因有很多:
(1)加快作业执行: 在internet连接速度较慢的环境中,从Docker Hub一次又一次地下载相同的映像可能会显著增加作业的时间。从本地注册表(其中存储 gitlab/gitlab-runner-helper:XYZ 的精确副本)下载帮助程序映像可能会加快速度。
(2)安全考虑:许多人不喜欢下载以前没有检查过的外部依赖项。可能有一个业务规则只使用被审查并存储在本地存储库中的依赖项。
(3)构建没有internet访问的环境:在某些情况下,作业是在一个具有专用的、封闭的网络的环境中执行的(这不适用于kubernetes执行程序,因为映像仍然需要从外部注册中心下载,至少kubernetes集群可以从外部注册中心下载映像)。
(4)额外的软件:有些用户可能希望在帮助映像中安装一些额外的软件,比如openssh,以支持通过git+ssh而不是git+http访问的子模块。
在上面描述的任何情况下,都可以使用helper_image配置字段来配置自定义映像,该字段可用于docker、docker+machine和kubernetes执行器:
```bash
[[runners]]
(...)
executor = "docker"
[runners.docker]
(...)
helper_image = "my.registry.local/gitlab/gitlab-runner-helper:tag"
```
请注意,助手映像的版本应该与GitLab Runner的版本严格耦合。就像上面所描述的那样,提供这样的的一个主要原因是 Runner 使用gitlab-runner-helper二进制图像,这编译二进制GitLab runner的一部分来源是使用一个内部API,预计在二进制文件都是相同的。
Runner 默认引用 gitlab/gitlab-run-helper:XYZ 映像,其中XYZ基于运行器的体系结构和Git修订。从GitLab Runner 11.3开始,通过使用版本变量之一,可以自动定义使用过的图像的版本:
```bash
[[runners]]
(...)
executor = "docker"
[runners.docker]
(...)
helper_image = "my.registry.local/gitlab/gitlab-runner-helper:x86_64-${CI_RUNNER_REVISION}"
gitlab-ci部署实现持续集成(centos7)的更多相关文章
- 【持续集成】GitLab CI + Docker 实现持续集成
GitLab CI + Docker 实现持续集成 一.持续集成(Continuous Integration, CI)的基本概念 概述 在传统软件的开发中,代码的集成工作通常是在所有人都将工作完成后 ...
- GitLab CI/CD 进行持续集成
简介 从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成. ...
- CI / CD /CD 持续集成 持续交付 持续部署
CI / CD /CD 持续集成 持续交付 持续部署 CI CD 是啥?干了啥? CI continuous integration 持续集成 CD continuous delivery 持续交付 ...
- 利用Travis CI+GitHub实现持续集成和自动部署
前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标 ...
- Docker Gitlab CI 部署 Spring Boot 项目
目前在学习这一块的内容,但是可能每个人环境都不同,导致找不到一篇博客能够完全操作下来没有错误的,所以自己也写一下,记录一下整个搭建的过程. Docker 的安装这里就不赘述了,基本上几行命令都可以了, ...
- 容器镜像服务联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...
- 使用Gitlab实现自动化部署与持续集成
Gitlab-Ci运行原理: 由以下两个模块组成gitlab-ci servergitlab-ci-runner其中,gitlab-ci server负责调度.触发Runner,以及获取返回结果. 而 ...
- ubuntu 16.04.2 源码安装gitlab并且利用runner持续集成
参考原档:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#using-https 本章只 ...
随机推荐
- 朋友,您可能是MCR的受害者
2018 年五月之后,微软将后续发布的所有 docker image 都推送到了 MCR (Miscrosoft Container Registry),但在中国大陆,它的速度实在是令人发指,本文将介 ...
- @atcoder - AGC002E@ Candy Piles
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 堆糖果,第 i 堆包含 ai 个糖果. 现在两人进行博 ...
- 对于Python的GIL锁理解
GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可 ...
- flink实时数仓从入门到实战
第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...
- CKA考试个人心得分享
考试相关准备: 真题:需要的私密: 网络:必须开启VPN,以便能访问国外网络,强烈建议在香港搭建相应FQ: 证件:考试需要出示含有拉丁文(英文)带照片的有效证件,相关有效证件参考(优先建议护照):ht ...
- 无法解析的外部符号 "public: virtual struct CRuntimeClass * _
SetupPropertyPage.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct CRuntimeClass * __this ...
- Flutter学习笔记(33)--GestureDetector手势识别
如需转载,请注明出处:Flutter学习笔记(33)--GestureDetector手势识别 这篇随笔主要记录的学习内容是GestureDetector手势识别,内容包括识别单击.双击.长按.组件拖 ...
- 01MySQL内核分析-The Skeleton of the Server Code
摘要 这个官方文档一段对MySQL内核分析的一个向导.是对MySQL一条insert语句写入到MySQL数据库的分析. 但是,对于MySQL 5.7版本来说,基本上都是写入到innodb引擎.但也还是 ...
- windows RN 环境搭建(实测心得)
首先安装官网的装好依赖 这里特别敲掉的是 jdk 必须要1.8的才行: 装了node 就不要 py了. 官网 其次安装 android studio 开发工具 把对应的都装好: 这里的 ...
- 33_栈程序演示.swf
pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的 pTop执行栈顶最新的节点 如果pTop ...