0%

大部分都是因为 external_url 在外网导致的:

  1. external_url 在外网时,下载 gitlab-sans 字体可能超时,这导致通过 url 进入网页时字体是细的,但刷新后或者进入其他页面后字体又会变粗(版本是 v16.3.0-jh)。内网也可能发生,但是概率较小。
  2. external_url 在外网时,创建新的 gitlab runner 会自动配置成连接外网,需要手动修改。如果不修改,runner 克隆仓库等都要经过外网,不仅速度慢还容易受到外网服务器 NGINX 最大包体大小的限制使得 artifacts 无法保存。(本地有包大小上限的设置项,但是外网服务器上的 NGINX 也需要配置一下)
  3. external_url 为外网时,Web IDE 无法正常加载资源。可能是 NGINX 相关配置有问题。

换到内网之后就好了(当时我没有外网服务器的修改权限,无法对 NGINX 配置)。

例子:

$ echo A >&3
-bash: 3: Bad file descriptor
$ echo A 3>&2 >&3|grep 8
A

第一行输出给描述符 3 相关的文件,但是没有这个文件,所以出错。

第二行把描述符 3 分配给了原先 2 的文件,然后又将输出导入到描述符 3 对应的文件中,也就是将结果输出到 stderr 中,所以 grep 8 不能拦截 echo 的输出(可以看到 A 被打印出来了)。

这种方法可以用来交换标准输入和输出流。

docker pull

docker pull 不会读取 http_proxy 环境变量,因为拉取请求是发给守护进程的(不清楚守护进程是否是经典的 listen-fork 模式),环境变量早就在启动时读入,需要专门配置 docker 守护进程并让它重新加载配置。可以参考: https://stackoverflow.com/a/71036185

根据 docker 官方文档 的说法,Docker Engine version 23.0 之前是需要让 daemon 启动时通过环境变量读取代理的(可以通过修改 systemctl 的 service 文件完成),现在也能通过修改 /etc/docker/daemon.json 文件来修改代理。尽管如此,我在 Docker Engine 24.0.7 上面测试,修改代理之后也需要完全重启 docker 才能让代理生效。这说明代理配置是在启动时读入,不可以运行时重载的

如果条件允许, 使用镜像源 是比配置代理更好的选择,它支持在运行时重载

docker build

docker build 的时候应该要用 --build-arg 传代理,然后还得大写

docker build . --build-arg HTTP_PROXY=$http_proxy --build-arg HTTPS_PROXY=$http_proxy ...

How to show the run command of a docker container - Stack Overflow

docker inspect --format "$(curl -s \
    https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" \
  {your_container}

得到的结果样例:

docker run \
  --name "/gitlab-runner-4" \
  --runtime "runc" \
  --volume "/srv/gitlab-runner/config:/etc/gitlab-runner" \
  --volume "/var/run/docker.sock:/var/run/docker.sock" \
  --log-driver "json-file" \
  --restart "always" \
  --network "bridge" \
  --env "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
  --detach \
  "gitlab/gitlab-runner:latest" \
  "run" "--user=gitlab-runner" "--working-directory=/home/gitlab-runner"

还有一种方法是使用 https://github.com/lavie/runlike 提供的 pip 包 runlike。使用起来也比较方便,但是输出的结果里面有些参数还得再检查和调整一下。

在运行有 gitlab-jh 的服务器上启用 runner 没有效果

要确保 runner 允许 untagged 的任务。gitlab-runner status 的确是会报错,但是不用管,对结果没有影响。

Runner 的配置

gitlab-runner 容器中的配置文件是 /etc/gitlab-runner/config.toml

concurrent = 4
check_interval = 0

[session_server]
  session_timeout = 1800

[runners]
  name = "xxx"
  url = "http://xxx.xxx.xxx.xxx:xxxx" # 要改成内网的,不然太慢,还受到外部服务器的 nginx 传输限制
  token = "xxxxxxxx"                  # 要改
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "ubuntu" # default runner 其实不用改,因为 CI 任务可以指定不同的镜像
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]           # 这里做路径映射,如果需要只读,用 ro 而不是 r
    shm_size = 0
    gpus = "all"                   # 没有这个就不能运行 GPU
    pull_policy = "if-not-present" # 没有这个每次都会检查镜像是否最新,对国内网络不友好

git fetch 的时候遇到 lock 文件存在

没有解决。删了也没成功。就把下载模式改成 git clone 了。

cmd 对 双引号中的 ^ 不会转义。由于单引号不是 cmd 认可的引用方式,单引号中的 ^ 会转义。

cmd 的 echo 命令并不会去掉双引号参数的双引号。例子:

C:\Users\xx>echo "6" | C:\Users\xx\scoop\shims\bash.exe -c "cat"
"6"

其他命令貌似会去掉双引号,比如 cd 和 set。外置命令就更不用说了,写 git show “HEAD” 能够正常运行,可能是因为 cmd 为非内置命令去掉了双引号。

问题:加入 pre-commit 之后,在 VS Code 的侧边栏 git 模块中提交代码看似卡住,看不到 pre-commit 的输出,也无法和 pre-commit 交互。

将下面的 entry_point 函数替换成要执行的流程,然后作为 .git/hooks/pre-commit 的内容即可。其主要作用是判断当前是否在 VS Code 环境中,如果是,则将输出写到一个临时文件中,然后再用 VS Code 打开这个文件以观察输出。解决了看不到输出、进度的问题,但是还解决不了输入的问题

#!/bin/bash
is_inside_vscode() {
  if ([[ "$TERM" == "" ]] || [[ "$TERM" == "dumb" ]]) && [[ "$PATH" == *".vscode-server/"* ]]; then
    return 0
  fi
  return 1
}

print_header() {
  echo "############################################################"
  echo "#   This is the temp file for showing pre-commit output.   #"
  echo "############################################################"
  echo
}

entry_point() { :; }

if is_inside_vscode; then
  tmp=$(mktemp)
  code $tmp
  print_header >$tmp
  if ! entry_point >>$tmp 2>&1; then
    echo "pre-commit failed, please check $tmp" && false
  fi
else
  entry_point
fi

Warning

这样的脚本并不总是有效。比如我在 2024 年 3 月 30 日 发现 .vscode-server/bin 开头的路径已经改成了 .vscode-server/cli,所以又给 PATH 检查去掉了 bin 后缀。

和 scp 相比可以断点续传。

$ rsync -avz -e ssh -r --info=progress2 --info=name0 coco/images/train2014.zip xxserver:/data/xxx/data/

2024年2月8日:这里已经是 zip 了,感觉没必要压缩。

设置 VS Code clangd 检查的语言标准为 C++17

Set -std in the .yaml file and then reload window of VS Code.

CompileFlags:
    Add:
      [
        --std=c++17,
        -Wno-documentation,
        -Wno-missing-prototypes,
      ]
Diagnostics:
  ClangTidy:
    Add:
    [
        performance-*,
        bugprone-*,
        modernize-*,
        clang-analyzer-*,
        readability-identifier*,
    ]
    CheckOptions:
      readability-identifier-naming.VariableCase: camelCase

Clangd 找不到头文件

macOS 自带的 /usr/local/bin 中的 clang 不能提供查询路径。要么把绝对路径改成 PATH 中的命令,要么添加 "--query-driver=/usr/bin/clang++" 在参数中。

Windows 下,如果用的是 MSYS2 的编译器,需要添加: