资讯详情

【项目自动发布】基于Docker/单节点Rancher/GitLab搭建简易的CI/CD流水线(备忘+补充完善)

前言

最近面试好像经常问一个问题: 你的项目是怎么发布的? 传统的Java本地包装的项目 jar包 或者 war包, 上传到服务器, 然后通过shell启动脚本的方式 要求我们有一定的shell编写脚本的能力。

这里介绍一种流行的发布方式(所谓的发布方式)DevOps?), 也是我目前项目在用的。基于Gitlab内置的CI/CD功能, (所谓CI/CD, 不懂的可以简单理解为自动构建, 自动打包, 仓库自动发布) 以及rancher容器管理功能。 rancher是基于k3s, k8s的简略版, 这里的博主还没有深入学习k8s, 暂时跳过。

一般的发布过程是, gitlab仓库中配置 CI/CD, 配置在项目文件中 gitlab-ci.yml配置文件 和 gitlab-runner(所谓CI/CD执行者), 当您推送最新代码时gitlab仓库, 自动触发流水线(pipeline), 根据你的 gitlab-ci.yml 配置项目jar包的构建(build), 发布到maven仓库, docker镜像(image)的构建, 并发布最新的镜像docker仓库。 然后我们可以通过它rancher拉最新镜像, 重新启动一个pod。这样实现了自动构建, 一个自动发布的过程。

Docker安装

docker的安装, rancher也可以参考本博文的安装 -> 单节点rancher快速部署

*了解 - 部署Nginx(非Rancher方式)

其实Rancher自带负载均衡器, Nginx Ingress, 通过Ingress可配置服务路由, SSL证书, 包括 uri->端口 等等, 所以这里不需要单独部署一个nginx。

但通过配置nginx也可以对rancher的 ingress实际做了什么事情有一个摸得着看得见的理解, 否则我们只会通过ui配置rancher, 却不会使用nginx, 不太优雅。

docker run --name nginx -v nginx-html:/usr/share/nginx/html  -v nginx-conf:/etc/nginx -d -p 80:80 -p 443:443 nginx:1.20 

nginx配置

这是我的配置之一

user  nginx; worker_processes  auto;  error_log  /var/log/nginx/error.log notice; pid        /var/run/nginx.pid;   events { 
             worker_connections  1024; }   http { 
             include       /etc/nginx/mime.types;     default_type  application/octet-stream;      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                       '$status $body_bytes_sent "$http_referer" '                       '"$http_user_agent" "$http_x_forwarded_for"';      access_log  /var/log/nginx/access.log  main;      sendfile        on;     #tcp_nopush on;      keepalive_timeout  65;      gzip  on;      include /etc/nginx/conf.d/*.conf;          client_max_body_size 100m;        # 文件上传你的大小, 默认1m     proxy_ssl_session_reuse off;      # 关闭代理ssl验证          proxy_set_header   Host                $host;     proxy_set_header   X-Real-IP           $remote_addr;     proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;     proxy_set_header   X-Forwarded-Proto   $scheme;          # 开启websocket     proxy_http_version 1.1;     proxy_set_header Upgrade $http_upgrade;     proxy_set_header Connection "Upgrade";          # 开启websocket支持     map $http_upgrade $connection_upgrade { 
                 default upgrade;         '' close;     }          server_tokens off;          ssl_session_timeout 5m;     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;                                   #可参考此 SSL 协议配置     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;    #可根据此加密套件配置,并遵循写作方法 openssl 标准     ssl_prefer_server_ciphers on;          # 负载均衡     #upstream halo {      # server 124.223.63.15:30001;     # server 124.223.63.15:30002 backup;     #}          # chenyao.icu halo博客     server{ 
                 keepalive_requests 200;      #单连接请求上限次数。         listen 80;                   #监听端口
        server_name chenyao.icu;     #监听域名 
        location  / { 
                        #地址匹配
           #proxy_pass http://halo; #请求转向halo 定义的服务器列表
           
           #root path; #静态资源根目录
           #index index.html; #设置静态首页 
           #deny 127.0.0.1; #拒绝的ip
           #allow 172.18.5.54; #允许的ip 
           
           # 重定向到443
           return 301 https://$host$request_uri;         
        }
    }
    server { 
        
        listen 443 ssl;
        server_name chenyao.icu;                         #填写您的证书绑定的域名,例如:www.cloud.tencent.com
        #root /usr/local/lighthouse/softwares/wordpress; #填写您的网站根目录,例如:/usr/local/lighthouse/softwares/wordpress
        #index index.php index.html;
        
        access_log logs/chenyaoicu.log;
        error_log logs/chenyaoicu.error.log;
        ssl_certificate chenyao.icu/fullchain.cer;        #填写您的证书文件名称,例如:cloud.tencent.com_bundle.crt
        ssl_certificate_key chenyao.icu/chenyao.icu.key;  #填写您的私钥文件名称,例如:cloud.tencent.com.key
        
        location / { 
        
            #proxy_pass http://halo;
            proxy_pass http://10.0.16.3:32140;
        }
        
        # 静态资源反向代理 
        # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
        location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$
        { 
        
            proxy_pass http://10.0.16.3:32140;
            expires      10d;
        }
    } 
    
    
    # rancher.chenyao.icu Rancher
    server{ 
        
        keepalive_requests 200;            #单连接请求上限次数。
        listen 80;                         #监听端口
        server_name rancher.chenyao.icu;   #监听域名 
        location  / { 
                              #地址匹配 
           # 重定向到443
           return 301 https://$host$request_uri;         
        }
    }
    server { 
        
        listen 443 ssl;
        server_name rancher.chenyao.icu;

        access_log logs/rancher.chenyaoicu.log;
        error_log logs/rancher.chenyaoicu.error.log;
        ssl_certificate rancher.chenyao.icu/fullchain.cer;
        ssl_certificate_key rancher.chenyao.icu/rancher.chenyao.icu.key;
        
        location / { 
        
            proxy_pass https://10.0.16.3:1443;
        }
    }
    
    
    # nexus.chenyao.icu Nexus
    server{ 
        
        keepalive_requests 200;          #单连接请求上限次数。
        listen 80;                       #监听端口
        server_name nexus.chenyao.icu;   #监听域名 
        location  / { 
                            #地址匹配 
           # 重定向到443
           return 301 https://$host$request_uri;         
        }
    }
    server { 
        
        listen 443 ssl;
        server_name nexus.chenyao.icu;

        access_log logs/nexus.chenyaoicu.log;
        error_log logs/nexus.chenyaoicu.error.log;
        ssl_certificate nexus.chenyao.icu/fullchain.cer;
        ssl_certificate_key nexus.chenyao.icu/nexus.chenyao.icu.key;
        
        location / { 
        
            proxy_pass http://10.0.16.3:32719;
        }
        
    }
    
    # gitlab.chenyao.icu GitLab
    server{ 
        
        keepalive_requests 200;          #单连接请求上限次数。
        listen 80;                       #监听端口
        server_name gitlab.chenyao.icu;  #监听域名 
        location  / { 
                            #地址匹配 
           # 重定向到443
           return 301 https://$host$request_uri;         
        }
    }
    server { 
        
        listen 443 ssl;
        server_name nexus.chenyao.icu;

        access_log logs/gitlab.chenyaoicu.log;
        error_log logs/gitlab.chenyaoicu.error.log;
        ssl_certificate gitlab.chenyao.icu/fullchain.cer;
        ssl_certificate_key gitlab.chenyao.icu/gitlab.chenyao.icu.key;
        
        location / { 
        
            proxy_pass http://10.0.16.3:1080;
        }
    }
}

SSL证书(HTTPS访问, 非必须)

FreeSSL (推荐, 可免费申请的ssl证书)

https://freessl.cn/acme-deploy?domains=chenyao.icu%2Cwww.chenyao.icu

acme.sh --install-cert -d chenyao.icu \
--key-file       /var/lib/docker/volumes/nginx-conf/_data/chenyao.icu/chenyao.icu.key  \
--fullchain-file /var/lib/docker/volumes/nginx-conf/_data/chenyao.icu/fullchain.cer \
--reloadcmd     "docker restart nginx"

acme.sh --install-cert -d rancher.chenyao.icu \
--key-file       /var/lib/docker/volumes/nginx-conf/_data/rancher.chenyao.icu/rancher.chenyao.icu.key  \
--fullchain-file /var/lib/docker/volumes/nginx-conf/_data/rancher.chenyao.icu/fullchain.cer \
--reloadcmd     "docker restart nginx"

acme.sh --install-cert -d gitlab.chenyao.icu \
--key-file       /var/lib/docker/volumes/nginx-conf/_data/gitlab.chenyao.icu/gitlab.chenyao.icu.key  \
--fullchain-file /var/lib/docker/volumes/nginx-conf/_data/gitlab.chenyao.icu/fullchain.cer \
--reloadcmd     "docker restart nginx"

acme.sh --install-cert -d nexus.chenyao.icu \
--key-file       /var/lib/docker/volumes/nginx-conf/_data/nexus.chenyao.icu/nexus.chenyao.icu.key  \
--fullchain-file /var/lib/docker/volumes/nginx-conf/_data/nexus.chenyao.icu/fullchain.cer \
--reloadcmd     "docker restart nginx"

acme.sh --install-cert -d *.chenyao.icu \
--key-file       /var/lib/docker/volumes/nginx-conf/_data/*.chenyao.icu/*.chenyao.icu.key  \
--fullchain-file /var/lib/docker/volumes/nginx-conf/_data/*.chenyao.icu/fullchain.cer \
--reloadcmd     "docker restart nginx"

错误: HTTPS 访问的页面上不允许出现 HTTP 请求

已阻止载入混合活动内容“http://nexus.chenyao.icu/static/rapture/app.js?_v=3.27.0-03&_e=OSS”

指向“http://nexus.chenyao.icu/static/rapture/app.js?_v=3.27.0-03&_e=OSS”的 <script> 加载失败。

在安全的加密网页中载入混合(不安全的)显示内容“http://nexus.chenyao.icu/static/rapture/resources/favicon-32x32.png?_v=3.27.0-03&_e=OSS”

在 nginx 配置文件增加 proxy_set_header X-Forwarded-Proto $scheme; 这样HTTPS请求nginx 在转发时就还是使用HTTPS协议。

单节点部署rancher(基于Docker)

安装启动rancher/rancher

单节点部署仅用于测试学习, 不用于生产环境

docker run -d --privileged \
 -v rancher-etcd:/var/lib/rancher \
 -v rancher-log:/var/log/auditlog \
  # 使用已有证书 \
 -v /opt/rancher/ssl/rancher_fullchain.pem:/etc/rancher/ssl/cert.pem \
 -v /opt/rancher/ssl/rancher_private_key.pem:/etc/rancher/ssl/key.pem \
 -e AUDIT_LEVEL=1 \
 --restart=unless-stopped \
 -p 1080:80 -p 1443:443 \
 rancher/rancher:v2.4.17 \
 --no-cacerts

开启权限

--privileged

Rancher 2.4.x 及之前的版本

登录到 Linux 主机,然后运行下面这个非常简洁的安装命令。

docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  rancher/rancher:latest

Rancher 2.5.x 及之后的版本

登录到 Linux 主机,然后运行下面这个非常简洁的安装命令。

与 2.4.x 或之前的版本相比,使用docker run命令安装 Rancher 2.5.x 时,需要添加--privileged标志变量,启用特权模式安装 Rancher。

docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  --privileged \
  rancher/rancher:latest

端口映射

在相同节点运行rancher/rancher 和 rancher/rancher-agent

在要使用单个节点运行 Rancher 并将同一个节点添加到集群的情况下,必须为rancher/ rancher容器调整映射的主机端口。

如果将节点添加到集群中,它将部署使用端口 80 和 443 的 nginx ingress 控制器。这将与我们建议为rancher/ rancher容器公开的默认端口冲突。

请注意,不建议将此设置用于生产环境,这种方式仅用来方便进行开发/演示。

要更改主机端口映射,可以将以下部分-p 80:80 -p 443:443替换为-p 1080:80 -p 1443:443

挂载卷

持久化数据

/var/lib/rancher

Rancher 使用 etcd 作为数据存储。使用 Docker 安装时,将使用嵌入式 etcd。持久数据位于容器中的以下路径中:/var/lib/rancher。您可以将主机卷挂载到该位置,以将数据保留在运行 Rancher Server 容器的主机上。使用 RancherOS 时,请检查哪些持久性存储目录可用。

API审计日志

/var/log/auditlog

API 审计日志记录通过 Rancher Server 进行的所有用户请求和系统事务。

默认情况下,API 审计日志会写入 rancher 容器内的/var/log/auditlog中。您可以设置AUDIT_LEVEL以启用日志,并将该目录作为卷共享。

参考API 审计日志获取更多信息。

使用自己的已有的证书 (可信证书用于公网访问)

  • 证书文件必须为 PEM 格式。
  • 在您的证书文件中,。您需要对您的证书进行排序,把您的证书放在最前面,后面跟着中间证书。有关示例,请参见SSL 常见问题解答/故障排查。

获得证书后,运行下面的 Docker 命令。

  • 使用该 -v 标志并提供证书的路径,以将其挂载到容器中,由于您的证书是由权威的 CA 签名的,因此不需要安装其他 CA 证书文件。
  • 使用 --no-cacerts 作为容器的参数, 位置在镜像后面,来禁用由 Rancher 生成的默认 CA 证书。
占位符 描述
<CERT_DIRECTORY> 证书文件所在目录。
<FULL_CHAIN.pem> 证书链文件路径。
<PRIVATE_KEY.pem> 证书私有密钥路径。
docker run -d --privileged --restart=unless-stopped \
    -p 80:80 -p 443:443 \
    -v /<CERT_DIRECTORY>/<FULL_CHAIN.pem>:/etc/rancher/ssl/cert.pem \
    -v /<CERT_DIRECTORY>/<PRIVATE_KEY.pem>:/etc/rancher/ssl/key.pem \
    rancher/rancher:latest \
    --no-cacerts

宿主机部署kubectl

https://kubernetes.io/docs/tasks/tools/install-kubectl/

宿主机部署helm3

版本选择

Helm a.b.c

a是主版本 b是次版本 c是补丁版本

不推荐将Helm用于比编译它所依赖的版本更高的Kubernetes版本,因为Helm并没有做出任何向前(新)兼容的保证。

Helm版本支持策略

Helm 版本 支持的 Kubernetes 版本
3.8.x 1.23.x - 1.20.x
3.7.x 1.22.x - 1.19.x
3.6.x 1.21.x - 1.18.x
3.5.x 1.20.x - 1.17.x
3.4.x 1.19.x - 1.16.x
3.3.x 1.18.x - 1.15.x
3.2.x 1.18.x - 1.15.x
3.1.x 1.17.x - 1.14.x
3.0.x 1.16.x - 1.13.x
2.16.x 1.16.x - 1.15.x
2.15.x 1.15.x - 1.14.x
2.14.x 1.14.x - 1.13.x
2.13.x 1.13.x - 1.12.x
2.12.x 1.12.x - 1.11.x
2.11.x 1.11.x - 1.10.x
2.10.x 1.10.x - 1.9.x
2.9.x 1.10.x - 1.9.x
2.8.x 1.9.x - 1.8.x
2.7.x 1.8.x - 1.7.x
2.6.x 1.7.x - 1.6.x
2.5.x 1.6.x - 1.5.x
2.4.x 1.6.x - 1.5.x
2.3.x 1.5.x - 1.4.x
2.2.x 1.5.x - 1.4.x
2.1.x 1.5.x - 1.4.x
2.0.x 1.4.x - 1.3.x

安装

https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.5.1-linux-amd64.tar.gz

解压后将helm拷贝到/usr/local/bin

helm version验证是否work:

清理Rancher节点

http://docs.rancher.cn/docs/rancher2/trending-topics/cleaning-cluster-nodes/_index/

修改nginx-ingress默认的80/443端口

Rancher集群创建后可以修改nginx-ingress默认的80/443端口, 会重新创建Pod

创建集群

修改nginx-ingress-controller映射的端口, 主机端口要和容器端口一致

再编辑命名空间ingress-nginx的YAML

    containers:
      - args:
        - /nginx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
        - --configmap=$(POD_NAMESPACE)/nginx-configuration
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --annotations-prefix=nginx.ingress.kubernetes.io
        # 增加以下两个参数参数(一个是http端口,一个是https端口)
        - --http-port=2080
        - --https-port=2443   

* 了解 - docker-desktop部署k8s (开发调试用)

k8s-docker-desktop-dashboard token令牌(示例)

eyJhbGciOiJSUzI1NiIsImtpZCI6Ilp1bjkzSDFtTV82MV9xVEpoMnUxdWNHUDJDNzBzb1hCR2N5WU1UbTF6VUEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLTQ1bHhyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhM2E0ODlmNS0zZWVjLTQyZDktOGI4MC0yMDg0NzFkODFhMmMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.xGGkf_qlV9uFFxMqBrFwCCPoWzGvgZRh8mVVsytSvwNcj9rf6cpD5QQW87Ac9Aw6ty-Ew1q5c0kHPHeyetUvUrgvWL5_SL9my0pQ6xwX5I1DXnqNtoK5gyWJD_0rCnBStEU_FYN64PPuGyPhZBFd4Tb_rPT791LWPoYsaq44ApVOOGWPdymSRvQUuQ5b4mBKdP08H_LQqKP_kn85aP_q1xQI60CmC1IaYNNBiAOWjGo5VPLEmr2myqpI7nYrFImfbpIMJujejWfNFObyHt6MU_cEG8tt_J-NM4A6gopFtN9HzogmegOKCPUgFnrofwuHAIRuqYCFznzbhbY3elDPGw

或者 kubeconfig文件

Win: %UserProfile%\.kube\config

开启dashboard代理 (每次访问需要开启代理)

kubectl proxy

访问dashboard

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/workloads?namespace=default

部署MySQL

https://registry.hub.docker.com/_/mysql

镜像 mysql:8.0

端口 3306

环境变量:

MYSQL_ROOT_PASSWOR=root

挂载卷:

配置 /etc/mysql/conf.d

数据 /var/lib/mysql

修改mysql密码

 set password for root@'%' = 'chenyao';

错误

Public Key Retrieval is not allowed

修改驱动属性, 连上后再改回来 , JDBC在url后面拼 ?allowPublicKeyRetrieval=true

部署Halo博客

https://docs.halo.run/getting-started/install/docker

镜像 halohub/halo:1.4.17

端口 8090

挂载卷:

静态资源和application.yaml /root/.halo

下载application.yaml配置文件模板

wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

配置mysql数据库:

spring:  
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 注意在容器里不要用localhost和127.0.0.1, 要用宿主机的内网/外网ip
    url: jdbc:mysql://10.0.16.3:31641/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: update
    open-in-view: false

: 备份静态资源目录和数据库的数据

部署Nexus

镜像

sonatype/nexus

sonatype/nexus3:3.27.0 ✔

端口 8081

默认nexus2帐号 admin/admin123

默认nexus3帐号 admin/admin.password 文件

环境变量

  • 注意: Nexus2/3版本差异
  • NEXUS_CONTEXT 这用于定义访问 Nexus 的 URL。默认为 ‘/’

  • INSTALL4J_ADD_VM_PARAMS 传递给 Install4J 启动脚本。默认为-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs

    • -Djava.util.prefs.userRoot=/some-other-dir可以设置为持久路径,如果容器重新启动,它将保持已安装的 Nexus 存储库许可证
    • 内存要求 2703m 8G https://help.sonatype.com/repomanager3/product-information/system-requirements#SystemRequirements-MemoryRequirements

数据持久化

1. 挂载卷

配置 /opt/sonatype/nexus/etc

数据 /nexus-data 注意要有写权限

$ docker volume create --name nexus-data
$ docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3

2. 挂载主机目录

挂载目录注意: 需要赋予宿主机目录写权限!

mkdir /opt/cni/volume/nexus/data && chown -R 200 /opt/cni/volume/nexus/data
  • nexus不能自动生成文件到卷: 先把容器起起来, 拷贝文件, 再挂载卷重启容器
  • 把容器中默认的文件拷贝出来, 挂载pvc不用复制
# 复制前不用创建/conf和/data目录, 否则会复制到这个文件夹下面
$ docker cp 270aca39b5f1:/nexus-data /opt/cni/volume/nexus/data
$ docker cp 270aca39b5f1:/opt/sonatype/nexus/etc /opt/cni/volume/nexus/conf

错误: nexus启动失败, 没有宿主机文件夹写权限

Could not lock User prefs. Lock file access denied

FileNotFoundExceprion: Permission denied

chown -R 200 /opt/cni/volume/nexus/data

3. *使用数据容器(2版本)

由于数据量是持久的,直到没有容器使用它们,所以可以专门为此目的创建一个容器。这是推荐的方法。

$ docker run -d --name nexus-data sonatype/nexus echo "data-only container for Nexus"
$ docker run -d -p 8081:8081 --name nexus --volumes-from nexus-data sonatype/nexus

部署GitLab

https://docs.gitlab.com/ee/install/docker.html

镜像

gitlab/gitlab-ee

gitlab/gitlab-ce:13.11.7-ce.0 ✔

端口 22 80 443

环境变量

# 应该没用
GITLAB_HOME=/opt/cni/volume/gitlab

EXTERNAL_URL=http://124.221.116.110

# GITLAB_OMNIBUS_CONFIG好像不生效
GITLAB_OMNIBUS_CONFIG="external_url='http://124.221.116.110';gitlab_rails['gitlab_shell_ssh_port']=30022;gitlab_rails['time_zone']='Asia/Shanghai';"

ssh信任端口也可在容器启动后通过CMD配置 (重新部署可能需要重新配置)

挂载卷

/etc/gitlab 用于存储 GitLab 配置文件 $GITLAB_HOME/conf

/var/opt/gitlab 用于存储应用程序数据 $GITLAB_HOME/data

/var/log/gitlab 用于存储日志 $GITLAB_HOME/logs

查看密码

sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

密码文件将在 24 小时后的第一次重新配置运行中自动删除

进入容器配置gitlab外部访问地址, ssh端口

https://blog.51cto.com/xiaoma90/2433673?source=dra

进入正在运行的容器:

sudo docker exec -it gitlab /bin/bash

打开 /etc/gitlab/gitlab.rb与您的编辑器并设置 external_url:

external_url是外部访问gitlab的地址, 如果不是从这个地址访问, 将会被拒绝

如果你将gitlab置于你自己创建的nginx代理之后, 实际访问gitlab的是你的nginx, 那就要将external_url配置为你访问的nginx的地址。通过防火墙等访问同理。

# For HTTP
external_url "http://124.221.116.110"

or

# For HTTPS (notice the https)
external_url "https://124.221.116.110"

此 URL 中指定的端口必须与 Docker 发布(-p)到主机的端口(容器外)匹配。 此外,如果 NGINX 侦听端口未设置在 nginx['listen_port'],它将从 external_url拉取. 有关详细信息,请参阅 NGINX 文档 。

gitlab_shell_ssh_port:

gitlab_rails['gitlab_shell_ssh_port'] = 30022

最后,重新配置 GitLab:

gitlab-ctl reconfigure

按照上面的示例,您将能够在8929端口下从您的浏览器访问网页, 并在2289端口下使用 SSH 推送 .

上面修改后gitlab.yml会自动对应修改为external_url(nginx也是)

如果我们想要仓库地址显示为域名, 则需要修改gitlab.yml

进入容器修改仓库地址

# 也在卷data(/var/opt/gitlab)下
vi /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
  ## GitLab settings
  gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    host: gitlab.chenyao.icu
    port: 443
    https: true
gitlab-ctl restart

修改后访问显示502不要着急, 项目重新部署需要时间, 等一段时间后再试。

性能要求

4C 4G

https://docs.gitlab.com/ee/install/requirements.html

集成k8s集群

https://gitlab.chenyao.icu/help/user/project/clusters/add_remove_clusters.md#add-existing-cluster

部署GitLab-Runner

https://docs.gitlab.com/runner/

部署

https://docs.gitlab.com/runner/install/index.html

https://docs.gitlab.com/runner/install/docker.html

使用

https://gitlab.chenyao.icu/help/ci/runners/README

注册

https://docs.gitlab.com/runner/register/index.html#docker

镜像

gitlab/gitlab-runner 版本跟gitlab一致, 或次要版本略新于gitlab

gitlab/gitlab-runner:v13.12.0

端口 8093

环境变量

时区 TZ=Asia/Shanghai 查看可用时区列表

安装SSL证书 CA_CERTIFICATES_PATH=/etc/gitlab-runner/certs/fullchain.cer

配置模板TEMPLATE_CONFIG_FILE 等同于run的命令 --template-config

挂载卷

配置 /etc/gitlab-runner

数据 /var/run/docker.soc

注册

1. 交互方式

docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
  • 也可以进入容器后执行
sudo gitlab-runner register
# 如果需要经过代理, 需要添加环境变量
export HTTP_PROXY=http://yourproxyurl:3128
export HTTPS_PROXY=http://yourproxyurl:3128
sudo -E gitlab-runner register

输入您的 GitLab 实例 URL(也称为 gitlab-ci coordinator URL).

输入您获得的令牌(token, 在gitlab的管理中心-runner查看)以注册runner。

输入runner的描述。 您可以稍后在 GitLab 用户界面修改。

输入 与runner相关的标签 , 用逗号隔开。 您可以稍后在 GitLab 用户界面中更改此值。

输入流水线的任何可选维护说明。

Docker执行器, 提供 runner executor 。 对于大多数用例,输入 docker

如果你输入 docker作为您的executor,您被要求提供默认镜像用于未定义在 .gitlab-ci.yml中定义镜像的项目

2. 命令

docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \ #免交互
  --executor "docker" \
  --docker-image alpine:latest \ #基础镜像
  --url "http://10.0.4.8:30080" \
  --registration-token "3gaENJhz6AxZhya-X1r_" \
  --description "docker-runner" \
  --maintenance-note "Free-form maintainer notes about this runner" \
  --tag-list "docker,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

这里 --access-level是GitLab Runner 12.0 中增加的参数。 它使用 GitLab 11.11 中引入的注册 API 参数。 在注册期间使用此参数来创建 受保护的跑步者 。 对于受保护的跑步者,请使用 --access-level="ref_protected"范围。 对于未受保护的跑步者,请使用 --access-level="not_protected"相反,或者保留未定义的值。 菜单中打开或关闭此值

这里 --maintenance-note参数 添加 GitLab Runner 14.8 您可以使用它来添加与流水线维护相关的信息。 允许的最大长度为 255 个字符。

3.配置文件

config.toml

--config 指定

4.配置模板

--regist优先级高于--template-config

--config优先级高于--template-config

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test-runner"
  url = "https://gitlabchenyao.icu"
  token = "__REDACTED__"
  executor = "kubernetes"
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.kubernetes]
    host = "http://localhost:9876/"
    bearer_token_overwrite_allowed = false
    image = ""
    namespace = ""
    namespace_overwrite_allowed = ""
    privileged = false
    service_account_overwrite_allowed = ""
    pod_annotations_overwrite_allowed = ""
    [runners.kubernetes.volumes]
sudo gitlab-runner register \
     --config /tmp/test-config.toml \
     --template-config /tmp/test-config.template.toml \

gitlab-runner无法访问外网

gitlab-runner容器中无法访问到外网如 https://gitlab.chenyao/.icu, 只能访问到本机和宿主机

把gitlab-runner的网络模式改为主机网络。

Docker Runner三种作用域

Shared Runner 供所有项目使用

Group Runner 适用于组中的所有项目和子组

Specific runners 适用于个别项目

配置Runner的 tag

当您注册跑步者时,您可以为其添加

当 CI/CD 作业运行时,它通过查看分配的tag知道要使用哪个运行器。

例如,如果跑步者有 ruby标签,您可以将此代码添加到你的项目 .gitlab-ci.yml文件:

job:
  tags:
    - ruby

当作业运行时,它使用带有 ruby的runner

Docker执行器

{ 
        
"insecure-registries" : [ "dp.chenyao.icu" ]
}

标签: 板线连接器s3b

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台