关于gitlab部署的教程还好,有的看,但到了cicd环节,简直痛苦面具,教程虽多,但断断续续,先不说大部分都是只截取片段,让人云里雾里,不会的看不懂,懂的不需要看,根据步骤跑不起来不说,改了一堆,完全不解释为什么,也分不清是官方要求还是作者自己夹带的私货。痛定思痛,抛弃任何教程,根据报错实时改进,于2023年4月24日完成此篇。

官方文档:

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

前提:

  已部署gitlab,可参阅 docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化,内附官方文档链接

开始:

  #1.拉取并启动runner

 docker run -d --name runner --network=host --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

官网没有--network=host这句话,正常情况不需要加。但是我在公司实际测试中,在后面的过程会说请求不到gitlab,加上这句话就好了

注意,挂载目录不能改,不然到最后会报错,找不到docker的守护进程:Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

  #2.进入容器内部

docker exec -it 容器id /bin/bash

  #3.runner注册

gitlab-runner register

如下图,打开你的项目设置,把URL和token都复制进入

如下图,自己填,tag需要记一下,后续的ci文件里要用到。

镜像由于注册的时候还不懂,随便填了一个,应该填你的项目依赖的环境镜像,mcr.microsoft.com/dotnet/sdk:6.0,随便填也无所谓,yml文件里可以指定

如下图,刷新你的设置页面,会显示已经有了

  #4.docker部署的必要环节:修改runner的config文件

默认他会每次拉取hub里的镜像,我想改成使用本地镜像,可以用vi命令,也可以自己用其他方法改

vi /srv/gitlab-runner/config/config.toml

有就改,没有就结尾加上 pull_policy = "if-not-present"

由于runner默认不识别docker命令,所以 volumes加上 "/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock"

官方配置说明:https://docs.gitlab.com/runner/configuration/advanced-configuration.html

改完就生效,不用重启

  #5.添加.gitlab-ci.yml文件

项目根目录创建.gitlab-ci.yml文件,官方各语言项目模板参考:https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates

以下附上net6项目的简略文件

image: mcr.microsoft.com/dotnet/sdk:6.0

variables:
VERSION: "$CI_PIPELINE_ID" stages:
- deploy deploy:
stage: deploy
script:
- echo "开始构建镜像:webapi:${VERSION}"
- docker build -t webapi:${VERSION} -f ./webapi/Dockerfile .
- if [ $(docker ps -aq --filter name=webapi) ]; then
echo "暂停旧版容器";
docker stop webapi;
echo "删除旧版容器";
docker rm webapi;
fi
- echo "启动新容器"
- docker run -d --name webapi -p 5566:5566 -p 5567:5567 webapi:${VERSION}
only:
  - production
tags:
  - dotnet

解释:

image:mcr.microsoft.com/dotnet/sdk:6.0。依赖net6环境

stages: 定义了多个构建阶段,部署(deploy)阶段。这些阶段将按照定义的顺序依次执行。

$CI_PIPELINE_ID:内置变量,取当前流水线id为版本号

if,如果存在名为webapi的容器,就暂停并删除容器

only: -production  只有production分支的改动才启动deploy阶段

tages: 用于为任务指定标签,让标签为dotnet的runner执行。

  #6.把环境拉取到本地

因为前文把runner改为了使用本地镜像,所以需要先把net6sdk拉取到本地

docker pull mcr.microsoft.com/dotnet/sdk:6.0

  #7.项目提交改动到gitlab

个人建议先拿前端项目练手,因为后端项目依赖比较复杂,坑比较多,我这还涉及依赖私有nuget包等问题,带来的挫折感,陆陆续续搞了两周才完事。

提交改动,然后打开项目的CI/CD流水线,等一等就会发现已经通过

查看控制台,也可以看到,任务执行成功,build成功,且把我docker里的旧容器删了,重新拿新镜像run了一个新的

结束

docker部署gitlab CI/CD (二)终篇:部署gitlab runner和添加gitlab-ci.yml文件 终极踩坑版的更多相关文章

  1. CI/CD持续集成/持续部署 敏捷开发

    敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...

  2. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  3. 使用Gitlab CI/CD功能在本地部署 Spring Boot 项目

    前提条件: 1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runn ...

  4. GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署

    预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...

  5. WTM框架使用技巧之:CI/CD(持续集成/持续部署)

    1. 什么是WTM框架? 一个快速.灵活.社区活跃.最最最最高效的.netcore 后台管理系统.详见 https://wtmdoc.walkingtec.cn/ 欢迎大家付费支持WTMPlus,反哺 ...

  6. 前端初探 Gitlab CI/CD

    前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就是其中一项,那么什么是 C ...

  7. Gitlab CI/CD

    Gitlab CI/CD 前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就 ...

  8. 使用Docker方式部署Gitlab,Gitlab-Runner并使用Gitlab提供的CI/CD功能自动化构建SpringBoot项目

    1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runner,地址: ...

  9. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

  10. GitLab CI/CD的官译【原】

    CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...

随机推荐

  1. 做bad apple第二步: python如何将视频变成一帧帧的图片,如何将一帧帧的图片转为视频

    直接上代码 """视频转图片""" port cv2def getphoto(video_in, video_save): cap = cv ...

  2. Teamcenter_NX集成开发:UF_UGMGR_invoke_pdm_server函数的使用

    之前了解到通过UFUN函数UF_UGMGR_invoke_pdm_server可以调用Teamcenter ITK函数,从而可以获取及编辑Teamcenter对象.UFUN中有样例代码,但是就是不知道 ...

  3. tModLoader随机掉落模组编写

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 1. 整体思路 目标是实 ...

  4. Linux服务器MySQL操作总结

    目录 1. Navicat连接服务器MySQL 2. 如何查看MySQL用户名和密码 3. 修改MySQL的登录密码 4. 安装MySQL开发包(Centos7版) 错误:error 1045 (28 ...

  5. 在Mac搭建一个便捷的Markdown创作环境

    前言 使用 Typora + PicGo + Gitee + Snipaste 在 Mac 搭建一个 Markdown 编辑环境. Typora 是一款简洁的 Markdown 编辑器: PicGo ...

  6. python---滚动条操作

    """ 1.让元素滚动到可见区域后,再操作.(大部分的网页自己会滚,直接找元素---下一页) drive.find_element("id",&quo ...

  7. 源码安装slurm

    一.源码安装munge 1.下载munge 下载地址:https://github.com/dun/munge/releases 2.安装编译 tar -Jxvf munge-0.5.15.tar.x ...

  8. 在 Kubernetes 集群上部署 VSCode

    在 Kubernetes 集群上部署 VSCode Visual Studio Code Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,适用于 Win ...

  9. [Linux]Linux中安装软件的方式?

    近日处理安全漏洞时,出现了这样一个问题: 判断某软件组件是通过何种方式安装的. 知道是何种方式安装,才方便做进一步的解决(升级/配置/卸载等操作) 1 解压即用 例如: sublime_text.py ...

  10. Java中ThreadLocal的用法和原理

    用法 隔离各个线程间的数据 避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象. package com.example.test1.service; i ...