Run GitLab Runner in a container (Docker in docker)

GitLab Runner 官方文档:https://docs.gitlab.com/runner/

支持以下运行环境:详情见上述文档。
Install using GitLab’s repository for Debian/Ubuntu/CentOS/RedHat (preferred).
Install on GNU/Linux manually (advanced).
Install on macOS.
Install on Windows.
Install as a Docker service.
Install in autoscaling mode using Docker machine.
Install on FreeBSD.
Install on Kubernetes.
Install the nightly binary manually (development).
Register GitLab Runner

明确概念:Docker in docker。runner部署在docker 容器中作为外层的docker,register GitLab Runner的时候会让你选一个default Docker image这个就是里面的运行docker,是具体执行.gitlab-ci.yml命令的容器。

注册详细过程:
在这里插入图片描述
gitlab-ci coordinator
前面两步的gitlab-ci coordinator URL和token都在gitlab-setting-CI/CD-Runners (Set up a specific Runner manually)处找到;

gitlab-ci tags
gitlab-ci tags在执行环境Runtime platform: arch=amd64 os=linux pid=33 revision=ac8e767a version=12.6.0
中应该是只能用dockertag,试过其他的tag,runner api 都返回500,NETWork Error。猜测是该版本的bug的。这里的tag要与.gitlab-ci.yml中的tag一致,不然runner找不到预定义的pipline。

enter the executor:选择docker;接下来就会选一个the default Docker image:docker:latest,这里有个坑:the default Docker image如果用私有仓库的的话,只支持s3, gcs两种鉴权方式:
https://docs.gitlab.com/runner/configuration/advanced-configuration.html#using-a-private-container-registry
因此这里选用的docker hubbor的docker:latest;
the default Docker image只是个备用镜像;这个可以在.gitlab-ci.yml声明指定(images),优先使用yaml文件中的这个image.

至此,docker in docker注册完成。

在跑ci的时候还有些坑:
Docker in docker模式,
报错:

error during connect: Post http://docker:2375/v1.40/auth: dial tcp: lookup docker on 10.38.193.12:53: no such host

需要打开privileged mode:
https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode
First, configure your Runner (config.toml) to run in privileged mode:

[[runners]]
  executor = "docker"
  [runners.docker]
    privileged = true

Then, make your build script (.gitlab-ci.yml) to use Docker-in-Docker container:

image: docker:git
services:
- docker:dind

build:
  script:
  - docker build -t my-image .
  - docker push my-image

报错:

Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

此时还专门本地拉了个镜像,执行了下docker命令,无报错,查文档后,docker镜像19版本以上会有这个问题:https://gitlab.com/gitlab-org/gitlab-foss/issues/64959
Hotfix for runners “you” control:
config.toml

[[runners]]
  environment = ["DOCKER_TLS_CERTDIR="]

Hotfix for projects “you” control:
.gitlab-ci.yml

variables:
  DOCKER_TLS_CERTDIR: ""

或者使用低版本:

image: docker:18-git
services:
  - docker:18-dind

最后附上常用三板斧:
gitlab runner 安装:

docker run -d --name yapi-gitlab-runner --restart always -v /srv/gitlab-runner/config1:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

修改完/srv/gitlab-runner/config配置后重启:docker restart [container id]

将gitlab项目注册到在运行的runner容器(842471cead2e):
docker exec -it 842471cead2e gitlab-runner register

基于Kubernetes和GitLab CI构建持续集成(CI)是一种现代的、灵活的、可扩展的持续集成和持续交付(CI/CD)解决方案。以下是构建这种方案的步骤和关键组件: ### 1. 环境准备 首先,确保你有一个Kubernetes集群和GitLab实例。你可以使用云服务提供商(如AWS、GCP、Azure)提供的托管Kubernetes服务,或者在本地环境中搭建Kubernetes集群。 ### 2. 配置GitLab Runner GitLab RunnerGitLab CI/CD的代理,负责执行CI/CD作业。你需要在Kubernetes集群中部署GitLab Runner。可以使用Helm Chart来简化这个过程: ```bash helm repo add gitlab https://charts.gitlab.io helm repo update helm install --namespace gitlab gitlab-runner gitlab/gitlab-runner ``` ### 3. 编写.gitlab-ci.yml 在项目的根目录下创建一个名为.gitlab-ci.yml的文件,定义CI/CD流程。以下是一个简单的示例: ```yaml stages: - build - test - deploy build: stage: build script: - echo "Building the application..." - docker build -t myapp:latest . artifacts: paths: - echo "Testing the application..." - docker run myapp:latest npm test deploy: stage: deploy script: - echo "Deploying the application..." - kubectl apply -f deployment.yaml ``` ### 4. 配置Kubernetes资源 在项目中创建一个deployment.yaml文件,定义Kubernetes部署和服务: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: myapp ``` ### 5. 触发CI/CD流程 每次将代码推送到GitLab仓库时,GitLab Runner会自动触发.gitlab-ci.yml中定义的CI/CD流程,构建、测试和部署应用程序。 ### 6. 监控和日志 使用Kubernetes的监控工具(如Prometheus)和日志系统(如ELK)来监控应用程序的运行状态和日志。 ### 总结 通过以上步骤,你可以在Kubernetes集群上使用GitLab CI构建一个强大的持续集成和持续交付系统。这种方案不仅灵活可扩展,还能充分利用Kubernetes的容器编排能力和GitLab的CI/CD功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值