背景知识

启动Gitlab Runner时,使用Gitlab提供的官方镜像gitlab/gitlab-runner:latest即可。

Runner以容器的方式启动以后,根据前文我们注册到Gitlab服务器,然后就可以等着执行“流水线”里面的“作业”了。

执行“作业”是要启动另外的容器的,在这个容器里面才能运行dotnet build、dotnet pack甚至docker build之类的命令的。“作业”结束,这个容器会自动销毁。

本文要制作的镜像,是给这一步的临时容器用的。

准备一个空白的制作镜像的目录

这个目录下,将会有3个文件。1个是Docker打包必须的Dockerfile文件,没有扩展名。另外两个是我们引入了微软的集中定义版本号的技术,所依赖的,我们放在镜像里,能让我们编写.gitlab-ci.yml的时候更加规范和便捷。

1、Dockerfile

from ubuntu:20.04
MAINTAINER zhongfang@qq.com
RUN apt update && apt install -y libcurl4
RUN apt install wget -y
RUN apt install apt-utils -y
RUN ln -s /lib/x86_64-linux-gnu/libdl-2.24.so /lib/x86_64-linux-gnu/libdl.so
RUN wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN apt-get update
RUN apt-get install -y apt-transport-https
RUN apt-get update # 下边的工具都是方便调试的。有时候一个“卡住”了,我们可以docker exec -it进入执行“作业”的容器,进行一些操作。
RUN apt install net-tools -y
RUN apt install bind9-utils -y
RUN apt install vim -y
RUN apt install iputils-ping -y
# 下边是安装.NET的环境,我们的项目需要.NET的什么版本,就安装什么版本。
RUN apt-get install -y dotnet-sdk-5.0
RUN apt-get install -y dotnet-sdk-6.0
RUN apt-get install -y dotnet-sdk-7.0
RUN apt-get install -y dotnet-sdk-8.0 # 安装了docker,才能执行docker build来打包我们的网站等应用程序
RUN apt-get install docker.io -y # 准备这里的目录,是为了让Runner的“作业”中,SSH用私钥登入远程服务器
# Ruunner的config.toml目录里,必须挂载包含私钥的文件夹,我们约定是挂载到容器的/deploy/ssh目录。为什么不直接挂载到.ssh目录?因为属于隐藏文件夹,无法直接
挂载。
# 在执行脚本的时候,从上述文件夹里先拷贝私钥到/root/.ssh下
# 脚本中的命令将是:cp /deploy/ssh/* /root/.ssh
RUN mkdir /root/.ssh
# 私钥的权限太宽的话,SSH程序可能拒绝执行
RUN chmod -R 700 /root/.ssh RUN mkdir /home/public
COPY download-directory-builds-props.sh /home/public
COPY update-remote-version-number.sh /home/public
COPY ssh-to-app-server-docker-run.sh /home/public
RUN chmod +x /home/public/*.sh #现在用docker build会收到警告,要求使用docker buildx
#下边语句来源于https://github.com/docker/buildx?tab=readme-ov-file#dockerfile
COPY --from=docker/buildx-bin /buildx /usr/libexec/docker/cli-plugins/docker-buildx

2、download-directory-builds-props.sh

echo off

rm -vf Directory.*.props

# 文件名
file="urls.txt"
rm -vf $file echo "共享版本号的http服务器是" $1 urlsFile="http://$1/$file" echo "下载urlx.txt" echo $urlsFile wget $urlsFile --content-disposition # 检查文件是否存在
if [ ! -f $file ]; then
echo "$file 不存在"
exit 1
fi
# 循环读取文件内容
while IFS= read -r line; do
# echo "$line" # WIndows以“\r\n”作为换行符,Shell里只有最后的“\n”被识别为换行符
# 所以程序员在Windows下用“记事本”编辑的urls.txt文件,需要做下面的处理
new_content=$(echo "$line" | tr -d '\r') wget -nv -x -nH $new_content --content-disposition
done < "$file" # 可以清理nuget的缓存,目前看起来不需要
# 不清理可以节省打包的时间
# dotnet nuget locals plugins-cache --clear

3、update-remote-version-number.sh

#!/bin/bash

echo "登入远程服务器的linux账户名称" S1
echo "分发版本号的http服务器名称或IP" $2
echo "网站根目录的文件夹名称" $3
echo "文件名:" $4
echo "新的版本号" $5 # 这个文件夹里有用户的私钥,配合传进来的用户名$1,就能免密码登入到远程服务器了
# /deploy/ssh 这个目录,是在Runner的config.toml文件里面挂载的
cp /deploy/ssh/* /root/.ssh ssh $1@${2} <<EOF
cd /www/wwwroot/$3/version-numbers
sed -i "s/\([0-9\.]\{2,20\}\)/$5/g" $4

4、ssh-to-app-server-docker-run.sh

SSH登入应用服务器,执行docker run

#!/bin/bash
echo "docker容器实例名称:" $1
echo "目标服务器对外端口号" $2
echo "docker容器开放端口号" $3
echo "docker镜像URL" $4
echo "容器AspNetCore的环境【ASPNETCORE_ENVIRONMENT】" $5
echo "Docker服务器DNS名称" $6
echo "登入Docker服务器的用户名称" $7
echo "登入Docker服务器的密码" $8
echo "SSH自动登入目标服务器使用的用户名" $9
echo "SSH自动登入的目标服务器" ${10}
echo "在服务器上执行的命令是"
echo "docker run -d --privileged=true --restart=always -d --name "$1" -v /mnt/data/yee-change:/var/config -e ASPNETCORE_ENVIRONMENT="$5" -p "$2":"$3 $4ssh $9@${10} <<EOF
EOF
# cd;bash ~/docker/gitlab/runner/deploy.sh $1 $2 $3 $4 $5 $6 $7 $8 # 下边的命令,是在远程服务器上执行的
conName=$1
eonPort=$2
conPort=$3
images=$4 # 下边的命令,是在远程服务器上,停止和删除容器及image
count=`docker ps -a |grep "$conName"|wc -l `
if [ $count -eq 0 ];then
echo "$conName container is not exit"
else
id=$(docker ps -a |grep "$conName" |awk '{print $1}')
for i in $id
do
docker stop $i
docker rm $i
done
fi
docker rmi $images
docker login -u $7 -p $8 $6
docker run --restart=always -d --name $conName -v /mnt/config:/var/config -e ASPNETCORE_ENVIRONMENT=$5 -p $eonPort:$conPort $images

构建和推送镜像到仓库

做好上述准备工作,我们的工作目录下有4个文件:

root@dev-server:/data/images/gitlab/docker-linux-dotnet8.0# ls -al
total 24
drwxr-xr-x 2 root root 4096 Feb 28 11:47 .
drwxr-xr-x 5 root root 4096 Feb 28 10:08 ..
-rw-r--r-- 1 root root 1253 Feb 28 07:22 Dockerfile
-rwxr-xr-x 1 root root 825 Feb 28 00:53 download-directory-builds-props.sh
-rw-r--r-- 1 root root 1337 Feb 28 10:57 ssh-to-app-server-docker-run.sh
-rw-r--r-- 1 root root 524 Feb 27 13:55 update-remote-version-number.sh

docker build

docker build -t docker.amihome.cn/amihome/gitlab/docker-linux-dotnet8.0:20240227005 .

docker push

docker push docker.amihome.cn/amihome/gitlab/docker-linux-dotnet8.0:20240227005

如果没有登入docker仓库,必须先执行docker login username

制作docker方式执行Gitlab Runner所需要的镜像的更多相关文章

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

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

  2. 一:优化Docker中的Spring Boot应用:单层镜像方法

    优化Docker中的Spring Boot应用:单层镜像方法 1.Docker关键概念 2.镜像层内容很重要 3.镜像层影响部署 4.Docker中的Spring Boot应用 5.单层方法 5.1 ...

  3. 利用docker compose启动gitlab及runner

    添加docker compose配置文件 新建文件docker-compose.yml,输入如下内容: gitlab: image: 'gitlab/gitlab-ce:latest' contain ...

  4. 制作Docker镜像的两种方式

    此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...

  5. gitlab runner使用docker报错(x509: certificate signed by unknown authority)定位

    如果gitlab runner使用docker,docker是普通配置,配置好后,runner就可以正常执行任务了. 另外一个环节Docker配置了tls加密连接,添加runner后,runner的配 ...

  6. win10专业版Hyper-v下Docker挂载volume的方式使用Gitlab(汉化版)保存资料数据(使用外部redis)

    目录 话题 (191) 笔记 (137) 资料区 (2) 评价 (33) 介绍 讨论区 话题 win10专业版Hyper-v下Docker挂载volume的方式使用Gitlab(汉化版)保存资料数据( ...

  7. 基于Ubuntu下以Docker方式gitlab软件的部署

    基于Ubuntu下以Docker方式gitlab软件的部署 目录 基于Ubuntu下以Docker方式gitlab软件的部署 1.安装Docker Compose 1.1 下载curl 1.2 安装c ...

  8. 修复gitlab权限(docker方式搭建)

    docker exec -it gitlab update-permissions docker restart gitlab

  9. 超详细Gitlab Runner环境配置中文教程

    配置GitlabRunner环境 GitLab Runner 是一个开源项目, 它用来运行你定制的任务(jobs)并把结果返回给 GitLab. GitLab Runner 配合GitLab CI(G ...

  10. docker 安装使用gitlab

    官方镜像地址  ce版本: https://hub.docker.com/r/gitlab/gitlab-ce 文档地址: https://docs.gitlab.com/omnibus/docker ...

随机推荐

  1. Oracle 查询用户下表名,表列数,表行数,表大小的SQL

    最近想分析下数据库的信息, 然后写了这个SQL. 比较lowB一些. 因为Oracle的 deferred_segment_creation 参数的影响. 很多表如果是0行,那么是不会创建extent ...

  2. 2022 倒带 - NutUI

    作者:京东零售 于明明 前言 时光飞逝,流年似水,让我们倒带 2022,回首这跌宕起伏一年走过的 "升级之路". NutUI 表现如何? 成绩单等着您打分! 2022 是 NutU ...

  3. 【JS 逆向百例】建筑市场监管平台企业数据

    声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关. 逆向目标 目标:住房和城乡建设部&全国建筑市场监管公共服务平台的企业数据 主页:http: ...

  4. springboot security 权限控制 -- @PreAuthorize 的使用

    1. 说明 security 鉴权方式常用的有两种配置,1.配置文件中配置:2.使用注解标注:他们都是基于 acess 表达式,如果需要自定义逻辑的鉴权认证,只需要自定义 access 表达式即可.本 ...

  5. 【主流技术】聊一聊对 Mybatis Plus 的理解与应用

    前言 mybatis plus是一个mybatis的增强工具,在其基础上只做增强不做改变.作为开发中常见的第三方组件,学习并应用在项目中可以节省开发时间,提高开发效率. 官方文档地址:MyBatis- ...

  6. SqlSugar跨库查询/多库查询

    一.跨库方式1:跨库导航 (5.1.3.24) 优点1:支持跨服务器,支持跨数据库品种, 支持任何类型数据库 优点2:   超级强大的性能,能达到本库联表性能 缺点:不支持子表过滤主表 (方案有ToL ...

  7. C/C++ 实现通过FTP上传下载

    实现FTP文件下载: #include <stdio.h> #include <Windows.h> #include <WinInet.h> #pragma co ...

  8. Redis安装及使用详解篇

    一.什么是Redis? Redis(Remote Dictionary Server ),即远程字典服务. Redis是是现在最受欢迎的NoSQL数据库之一,是一种支持key-value等多种数据结构 ...

  9. 如何在Visual Studio新C++项目中调用之前配置过的库?

      本文介绍在Visual Studio软件中调用C++各种配置.编译完毕的第三方库的方法.   在撰写C++代码时,如果需要用到他人撰写的第三方库(例如地理数据处理库GDAL.矩阵运算库Armadi ...

  10. CH9140,CH9141,CH9143异同点

    9140:是一款蓝牙转串口芯片,芯片支持蓝牙主从一体模式或从机模式,支持蓝牙 BLE4.2.串口波特率最高 1Mbps,支持 MODEM 联络信号,蓝牙主从模式可以自动连接或绑定. 智能配对功能 当 ...