从0开始使用Docker搭建Gitlab环境以及实现项目(CI/CD)自动部署与持续集成

环境搭建:

注意:因为虚拟机IP第二天会变,我这里创建CentOS虚拟机使用的是NAT模式,并固定IP 教程:https://www.yuque.com/yangwen-xizok/mnwq8w/mhuwi8/edit#iwkSH

  • 结构图:

一、CentOS安装Docker:

1、说明:yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2、使用以下命令设置稳定的存储库。即使您想从边缘或测试存储库安装构建,也总是需要稳定的存储 库:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、可选执行:启用边缘和测试存储库。这些存储库包含在docker.repo上面的文件中,但默认情况下处于禁用状态。您可以将它们与稳定的存储库一起启用:

sudo yum-config-manager --enable docker-ce-edge

4、更新 yum 软件源缓存,安装最新版本的Docker CE,或者转到下一步安装特定版本:

sudo yum makecache fast

sudo yum install docker-ce -y

注:如果想安装指定版本,参考如: 
	sudo yum install docker-ce:18.06
18.06即是版本号。

5、docker 服务启动,设置开机自启动

服务启动:

sudo service docker start

开机启动:

systemctl enable docker

二、(A)Docker部署GitLab:

1.下载镜像:

docker pull gitlab/gitlab-ce

2.创建目录挂载到A虚拟机:

mkdir -p /usr/local/gitlab/config
mkdir -p /usr/local/gitlab/logs
mkdir -p /usr/local/gitlab/data

3.启动运行:

执行启动命令:

docker run -detach --publish 8443:443 --publish 8880:80 --publish 8222:22 --name gitlab --restart always --volume /usr/local/gitlab/config:/etc/gitlab --volume /usr/local/gitlab/logs:/var/log/gitlab --volume /usr/local/gitlab/data:/var/opt/gitlab --privileged=true gitlab/gitlab-ce:latest

启动成功后执行“docker ps”查看gitlab容器状态为“healthy”时**(图1),我们就直接访问“http://192.168.1.127:8880”(图2)**
图1:
image.png
图2:
image.png

其他:

  • 记得将端口映射出来 如:8888:80 (外 : 里)
  • 用户"admin@example.com" 默认密码:gitlab文件夹中找到一个config文件夹里
  • vi /usr/local/gitlab/config/gitlab.rb 修改配置文件

三、(B、C)安装gitlab-runner、git、notnet6.0sdk:

1.安装gitlab-runner、git、notnet6.0sdk(sdk用于runner执行dotnet命令的):https://www.yuque.com/yangwen-xizok/mnwq8w/mhuwi8/edit#lJHoo

2.安装完gitlab-runner以后,执行runner注册命令:

1.运行gitlab-runner register命令进行注册
gitlab-runner register

2. 输入 gitlab 的 url 地址:
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): 
http://192.168.1.xxxxx/

3. 输入注册的 token:
Please enter the gitlab-ci token for this runner:
pnsBhDZy_iYH_xxxxxx

4. 输入对这个Runner的表述(同时也是这个Runner的名字),可以在GitLab page上修改它:
Please enter the gitlab-ci description for this runner: [96b8ba5db706]:
test_runner

5. 输入Runner的tag,同样可以在GitLab page上修改它:
Please enter the gitlab-ci tags for this runner (comma separated): 
test

6. 输入Runner的executor:
Please enter the executor: ssh, kubernetes, shell, docker, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine, custom: 
shell

7.注册完成后,生成 /etc/gitlab-runner/config.toml 文件,该文件是Runner的配置文件.

2.1 Executors 执行者概述(如何选择runner类型)

我这里用的是shell,但从官方给的表格来看,docker无疑是最佳选择。
Executors 执行者概述

3.根据提示输入gitlab服务地址,以及token,选择执行者为"shell" 注册成功后在gitlab上可以看到Runner

image.png

四、创建一个项目上传到GitLab并自动部署到不同环境的Docker(项目名:MyWebApi):

1.在Program中将swagger放到"if"外面,如图:

image.png

2.添加.gitlab-ci.yml文件:


# 我这里想定义两个阶段,分别使用两种部署方式(源码部署方式,发布文件部署方式)
# 两种方式用到的Dockerfile文件不同
# 第一个阶段test是发布到测试环境(即:B)v1      注意:第一阶段用的是源码部署方式
# 第二个阶段master是发布到生产环境(即:C)v2    注意:第二阶段用的是发布文件部署方式(该方式不需要修改原本的Dockerfile文件)
# 指定tags时要指定对应环境虚拟机里面的runner我这里当时在B里面注册runner时设置的tag是“v1”,C则是“v2”

variables:
  GIT_STRATEGY: none
stages: # 定义两个阶段,我这里是 “test”和“master” 表示模拟测试环境(B虚拟机)和生产环境(C虚拟机)
  - test
  - master

test:
  tags: 
    - v1 # 指定v1标签的Runner(该runner是部署在B虚拟机上的,所以是测试环境)
  stage: test
  script:
    - cd /home/gitproject # 进入文件目录
    - rm -rf /home/gitproject/MyWebApi # 删除MyWebApi文件夹
    - git clone http://root:12345678@192.168.1.127:8880/root/MyWebApi.git # 克隆MyWebApi项目源码到当前目录
    - cd ./MyWebApi # 进入MyWebApi项目源码目录
    - dotnet build --configuration Release # 在源码目录下编译 
    - rm -rf /home/project/MyWebApi # 删除发布文件夹中的MyWebApi项目
    - docker stop mywebapi # 暂停容器
    - docker rm mywebapi # 删除容器
    - docker rmi mywebapiimages # 删除镜像
    - dotnet publish -c Release --output /home/project/MyWebApi # 将MyWebApi项目发布到指定文件夹“/home/project/MyWebApi”
    - cd /home/project/MyWebApi # 进入MyWebApi发布文件夹
    - docker build -t mywebapiimages . # 打包镜像
    - docker run -d -v /home/project/MyWebApi:/code --privileged=true -p 5000:80 --name mywebapi --restart always mywebapiimages #运行镜像

master:
  tags: 
    - v2 # 指定runner标签(所以以下命令都是由C虚拟机的runner来执行,项目部署到C “即:生产环境”)
  stage: master
  script:
    - cd /home/gitproject # 进入文件目录
    - rm -rf /home/gitproject/MyWebApi # 删除MyWebApi文件夹
    - git clone http://root:12345678@192.168.1.127:8880/root/MyWebApi.git # 克隆MyWebApi项目源码到当前目录
    - cd /home/gitproject/MyWebApi # 进入MyWebApi项目源码目录
    - docker stop mywebapi # 暂停容器
    - docker rm mywebapi # 删除容器
    - docker rmi mywebapiimages # 删除镜像
    - docker build -f ./MyWebApi/Dockerfile -t mywebapiimages . # 指定Dockerfile打包镜像
    - docker run -d --privileged=true -p 5000:80 --name mywebapi --restart always mywebapiimages #运行镜像

3.将Dockerfile文件改为:

1.发布文件部署方式Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
COPY . /code
WORKDIR /code
EXPOSE 80
ENTRYPOINT ["dotnet","MyWebApi.dll"]

2.源码部署方式Dockerfile(原文件,无需更改的样子,如果使用上一种发布方式当Dockerfile文件用的是这一种,可能会报找不到.csproj错误):

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyWebApi/MyWebApi.csproj", "MyWebApi/"]
RUN dotnet restore "MyWebApi/MyWebApi.csproj"
COPY . .
WORKDIR "/src/MyWebApi"
RUN dotnet build "MyWebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyWebApi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWebApi.dll"]

4.将项目上传到Gitlab:

显示两个阶段都成功了
image.png
我们可以点击进去看到对应的JOB,(通过该JOB可以看到其实就是我们的v1这个runner执行了,yml文件的命令将项目部署,从而实现自动化)
image.png

5.部署成功后我们就可以访问对应虚拟机上的服务了

image.png

五、使用Docker-compose自动部署:

1.从国内服务器下载并安装docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.文件夹权限

 chmod +x /usr/local/bin/docker-compose

3.验证是否安装成功: (安装目录为:/usr/local/bin/docker-compose)

docker-compose --version

4.源码部署方式:

4.1、ci文件:
variables:
  GIT_STRATEGY: none
stages: # 定义两个阶段,我这里是 “test”和“master” 表示模拟测试环境(B虚拟机)和生产环境(C虚拟机)
  - build
  - test
  - master

build:
  tags: 
    - build
  stage: build
  script:
    - cd /home/gitproject # 进入文件目录
    - rm -rf /home/gitproject/MyWebApi # 删除MyWebApi文件夹
    - git clone http://root:12345678@192.168.1.127:8880/root/MyWebApi.git # 克隆MyWebApi项目源码到当前目录
    - cd ./MyWebApi # 进入MyWebApi项目源码目录
    - dotnet build --configuration Release # 在源码目录下编译
test:
  tags: 
    - test # 指定runner标签(所以以下命令都是由B虚拟机的runner来执行,项目部署到B “即:测试环境”)
  stage: test
  script:
    - cd /home/gitproject # 进入文件目录
    - rm -rf /home/gitproject/MyWebApi # 删除MyWebApi文件夹
    - git clone http://root:12345678@192.168.1.127:8880/root/MyWebApi.git # 克隆MyWebApi项目源码到当前目录
    - cd /home/gitproject/MyWebApi # 进入源码目录
    - docker-compose up -d --build mywebapi # 重新构建镜像并后台启动
    - docker container prune -f  # 裁剪
    - docker image prune -f  # 裁剪

master:
  tags: 
    - master # 指定runner标签(所以以下命令都是由C虚拟机的runner来执行,项目部署到C “即:生产环境”)
  stage: master
  script:
    - cd /home/gitproject # 进入文件目录
    - rm -rf /home/gitproject/MyWebApi # 删除MyWebApi文件夹
    - git clone http://root:12345678@192.168.1.127:8880/root/MyWebApi.git # 克隆MyWebApi项目源码到当前目录
    - cd /home/gitproject/MyWebApi
    - docker-compose up -d --build mywebapi # 重新构建镜像并后台启动
    - docker container prune -f # 裁剪
    - docker image prune -f # 裁剪

4.2、Dockerfile文件(在项目创建Dockerfile文件,设置为始终复制):
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyWebApi/MyWebApi.csproj", "MyWebApi/"]
RUN dotnet restore "MyWebApi/MyWebApi.csproj"
COPY . .
WORKDIR "/src/MyWebApi"
RUN dotnet build "MyWebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyWebApi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWebApi.dll"]

4.3、docker-compose文件(在项目创建docker-compose.yml文件,设置为始终复制):
version: '3.4'

services:
  mywebapi:
    build:
      context: .
      dockerfile: ./MyWebApi/Dockerfile
    ports:
      - "5000:80"

执行完Job后检查容器是否启动了,启动后就可以访问

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晒黑的绵羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值