Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

简介:

1. GitLab Runner 运行在 Docker 容器中

第二种和第三种实现方式,放在一块说,如果 Executor 选择shell,然后我们需要在 GitLab Runner 容器中配置编译环境,但这样会产生一个问题,就是如果我们是升级 GitLab Runner 的时候,需要重新配置编译环境,实际情况是,我进入容器docker exec -it gitlab-runner bash,并没有安装成功 .NET Core 和 Docker 环境(各种服务器中没出现的问题,而且速度非常慢),其实,还有一种方式,就是在.gitlab-ci.yml中执行安装 .NET Core 和 Docker 环境的脚本(检查是否安装),不过,编写是有些问题,这个我没进行尝试。

如果 Executor 选择docker,其实,这样会嵌套很多容器,首先服务器上运行 GitLab Runner 容器,然后在此容器内,运行另外一个构建容器,然后在此容器内,执行构建和发布操作,因为 GitLab Runner 在每次构建的时候,会创建和运行一个新的构建容器,所以,我们不能直接在这个容器中,配置 .NET Core 和 Docker 环境,也不能在.gitlab-ci.yml中执行安装,因为每次都会覆盖之前的操作,唯一的解决方式,就是自定义构建一个包含 .NET Core 和 Docker 环境的镜像文件,然后每次构建使用它进行创建对应容器,执行构建和发布脚本即可。

这里说下,自定义构建一个包含 .NET Core 和 Docker 环境的镜像文件,两种方式:

  • docker build -t 139.219.65.81:5000/xishuai-gitlab-ci-build .:在Dockerfile文件编写安装环境脚本。
  • docker commit microsoft-aspnetcore 139.219.65.81:5000/xishuai-gitlab-ci-build:使用一个容器,然后在容器中安装环境,最后基于这个容器,创建一个自定义镜像文件

第一种方式,我没有进行尝试,第二种方式尝试了下,我使用microsoft/aspnetcore镜像作为基础镜像(800M 左右),然后在其创建的容器中安装 Docker 环境,速度非常慢,而且有时候报各种奇怪的错误,如果安装成功了,左右构建的自定义镜像文件,也非常的大。

这两种方式,我最后都没有采用,最后使用的是下面最简单的方式。

2. GitLab Runner 不运行在 Docker 容器中(Executor 选择 Shell)

如果我们不使用 Docker 安装和运行 GitLab Runner,就得手动进行安装和配置下 GitLab Runner。

安装命令:

$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-linux-amd64

然后进行给予其权限:

$ sudo chmod +x /usr/local/bin/gitlab-runner

接着就可以进行注册 GitLab Runner 了,命令:

$ sudo gitlab-runner register

示例配置:

配置好之后,我们需要添加一个用于跑 GitLab Runner 的gitlab-runner用户,命令:

$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

然后指定 GitLab Runner 执行的用户和工作目录,命令:

$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

配置好之后,我们可以从配置文件中,查看相关配置信息:

$ cat /etc/systemd/system/gitlab-runner.service 
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/bin/gitlab-ci-multi-runner

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/gitlab-ci-multi-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "gitlab-runner"





Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target

上面工作完成之后,就可以启动 GitLab Runner 了,命令:

$ sudo gitlab-runner start

然后,我们就可以在项目中看到 GitLab Runner 了,示例:

另外,我们还需要做一些其他工作,来保证 GitLab Runner 可以正常运行。

两台服务器需要配置的环境:

  • GitLab Runner 服务器:.NET Core 2.0、Docker、Docker 私有仓库(或者其他服务器)、SSH
  • 测试服务器:Docker

首先,我们需要创建一个 Docker 私有仓库,用于存放程序生成的镜像,这个最好是配置在一个单独的服务器,配置详见:Ubuntu Docker Registry 搭建私有仓库

通过下面两个连接,查看 Docker 私有仓库中的镜像:

然后,我们需要把 GitLab Runner 服务器中的gitlab-runner账户,添加到docker用户组中,命令:

$ sudo usermod -aG docker gitlab-runner

否则会报如下错误:

然后,我们在 GitLab Runner 服务器中,切换到gitlab-runner用户下,配置 SSH,命令:

$ su gitlab-runner
$ ssh-keygen -t rsa -P ''
$ ssh-copy-id root@139.219.69.172

139.219.69.172是测试服务器的 IP 地址,如果不进行这样配置,SSH 连接的时候,会报如下错误:

原因是,GitLab Runner 在执行脚本的时候,会切换到gitlab-runner用户下,我们在root账户下配置 SSH,是无效的。


以上工作完成之后,GitLab Runner 执行编译脚本,基本上执行是没有问题了,我们在示例项目中添加.gitlab-ci.yml配置文件,示例:

stages:
  - build
  - deploy_dev
build_job:
  stage: build
  only:
    - master
  script:
    - dotnet restore
    - dotnet build
deploy_dev_job:
  stage: deploy_dev
  environment:
    name: development
  only:
    - master
  script:
    # 发布程序并部署运行
    - dotnet publish -c Release --output bin/publish
    - docker build -t $GITLAB_SERVER:5000/hwapp .
    - docker push $GITLAB_SERVER:5000/hwapp
    - ssh root@$DEPLOY_SERVER_DEV "docker pull $GITLAB_SERVER:5000/hwapp && docker run -d -p 5001:5001 $GITLAB_SERVER:5000/hwapp"

build_job执行效果:

deploy_dev_job执行效果:


然后,我们在测试服务器上,就可以看到创建和运行的容器了:

浏览器打开http://139.219.110.30:5001/api/values,查看效果:



本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/ubuntu-gitlab-ci-docker-aspnet-core-part-2.html,如需转载请自行联系原作者

相关文章
|
4天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
10天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
47 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
12天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
35 2
|
13天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
24 3
|
16天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
152 2
|
1月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
58 4
|
28天前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
47 4
|
6天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
25 4
|
28天前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
1月前
|
运维 Prometheus 监控
运维中的自动化实践每月一次的系统维护曾经是许多企业的噩梦。不仅因为停机时间长,更因为手动操作容易出错。然而,随着自动化工具的引入,这一切正在悄然改变。本文将探讨自动化在IT运维中的重要性及其具体应用。
在当今信息技术飞速发展的时代,企业对系统的稳定性和效率要求越来越高。传统的手动运维方式已经无法满足现代企业的需求。自动化技术的引入不仅提高了运维效率,还显著降低了出错风险。本文通过几个实际案例,展示了自动化在IT运维中的具体应用,包括自动化部署、监控告警和故障排除等方面,旨在为读者提供一些实用的参考。