环境搭建:
注意:因为虚拟机IP第二天会变,我这里创建CentOS虚拟机使用的是NAT模式,并固定IP 教程:https://www.yuque.com/yangwen-xizok/mnwq8w/mhuwi8/edit#iwkSH
- 结构图:
- 环境搭建教程以及链接:
- VMware创建NAT模式虚拟机(A,B,C) --> 固定IP -->
修改配置文件:https://www.yuque.com/yangwen-xizok/mnwq8w/mhuwi8/edit#iwkSH - (A,B,C)安装Docker:https://www.yuque.com/yangwen-xizok/mnwq8w/aue24f
- (A)Docker上部署GitLab:https://www.yuque.com/yangwen-xizok/mnwq8w/epzxl2#scPUv
- (B,C)上安装gitlab-runner、git、notnet6.0sdk:https://www.yuque.com/yangwen-xizok/mnwq8w/mhuwi8
一、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:
图2:
其他:
- 记得将端口映射出来 如: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
四、创建一个项目上传到GitLab并自动部署到不同环境的Docker(项目名:MyWebApi):
1.在Program中将swagger放到"if"外面,如图:
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:
显示两个阶段都成功了
我们可以点击进去看到对应的JOB,(通过该JOB可以看到其实就是我们的v1这个runner执行了,yml文件的命令将项目部署,从而实现自动化)
5.部署成功后我们就可以访问对应虚拟机上的服务了
五、使用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后检查容器是否启动了,启动后就可以访问