设为首页 收藏本站
查看: 1863|回复: 0

[经验分享] Ubuntu & GitLab& Docker & ASP 2.0 (上)

[复制链接]

尚未签到

发表于 2018-4-29 10:32:35 | 显示全部楼层 |阅读模式
  相关博文:
  由于题目字符的限制,本文的题目本应该是:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(上)
  Ubuntu 简单安装和配置 GitLab
  Ubuntu 简单安装 Docker
  Ubuntu Docker 简单安装 GitLab
  Ubuntu Docker 安装和配置 GitLab CI 持续集成
  服务器版本 Ubuntu 16.04 LTS。
  经过上面四篇博文中的相关安装和配置,我们主要完成了两个容器的创建和运行:gitlab和gitlab-runner(GitLab 站点和 GitLab CI 服务):
  

$ docker ps  
CONTAINER>  
696d559ce382        gitlab/gitlab-runner:latest   "/usr/bin/dumb-ini..."   5 days ago          Up 25 minutes                                                                          gitlab-runner
  
ff95f354200d        gitlab/gitlab-ce:latest       "/assets/wrapper"        7 days ago          Up 6 days (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8888->22/tcp   gitlab
  

  本篇博文目的:使用 GitLab CI 脚本编译 ASP.NET Core 2.0 程序,然后将编译后的文件传输到服务器上,最后使用 SSH 连接服务器,并运行程序,完成发布和部署。
  简单来说,就是我们每次使用git push提交完代码,自动完成发布和部署。
  我们再理一下实现上面目的关键点:


  • 创建一个 ASP.NET Core 2.0 示例程序
  • 完善并正确的.gitlab-ci.yml文件配置
  • GitLab CI 服务器使用ssh连接到测试服务器(在 Docker 中)
  • 使用scp进行服务器之间的文件传输
  • 使用supervisor进行站点程序的进程管理
  我花了很长时间配置第三步,其实最后解决也很简单,当然都是马后炮的结论,下面我们分别来进行操作。

创建 ASP.NET Core 2.0 示例程序
  我自己创建示例程序:http://40.125.206.47/team/hwapp
  注:服务器快过期了,大家可以随便搞。
  自己创建的话,也很简单,官方教程:https://www.microsoft.com/net/core#linuxubuntu
  我再搬运下命令(安装 .NET Core 2.0,并创建 ASP.NET Core 2.0 示例程序):
  

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg  
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
  
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
  

  
$ sudo apt-get update
  
$ sudo apt-get install dotnet-sdk-2.0.0
  

  
$ dotnet new webapi -o hwapp
  
$ cd hwapp
  

  最后,绑定下 ASP.NET Core 2.0 程序端口:
  

public>
{
  public static void Main(string[] args)
  {
  BuildWebHost(args).Run();
  }
  

  public static IWebHost BuildWebHost(string[] args) =>
  WebHost.CreateDefaultBuilder(args)
  .UseKestrel() //add code
  .UseUrls($"http://*:8088") //add code
  .UseStartup<hwapp.Startup>()
  .Build();
  
}
  

gitlab-ci.yml 文件配置
  我的.gitlab-ci.yml文件配置(http://40.125.206.47/team/hwapp/blob/master/.gitlab-ci.yml):
  

image: microsoft/aspnetcore-build  
stages:
  - build
  - deploy_dev
  
before_script:
  # Install ssh-agent if not already installed, it is required by Docker.
  # (change apt-get to yum if you use a CentOS-based image)
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  

  # Run ssh-agent (inside the build environment)
  - eval $(ssh-agent -s)
  

  # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
  # error: https://gitlab.com/gitlab-examples/ssh-private-key/issues/1
  # - echo "$SSH_PRIVATE_KEY_DEV"
  - ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
  

  # For Docker builds disable host key checking. Be aware that by adding that
  # you are suspectible to man-in-the-middle attacks.
  # WARNING: Use this only with the Docker executor, if you use it with shell
  # you will overwrite your user's SSH config.
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  
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>  - scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp
  - ssh root@$DEPLOY_SERVER_DEV "supervisorctl restart hwapp && curl http://localhost:8088/api/values"
  

  上面是我最终调试成功后的.gitlab-ci.yml文件配置,其实整个的构建和发布流程,从上面的配置中都可以看出。
  这里记录下一些东西:
  配置一开始的image,设置的是我们用于构建的镜像(也就是说后面所有的脚本执行,都是在基于这个镜像创建的容器中),如果不设置的话,默认使用的是我们一开始配置 GitLab CI 填写的 Docker Image,也可以手动编辑vim /srv/gitlab-runner/config/config.toml进行修改,我这里使用的是microsoft/aspnetcore-build镜像,只用于 ASP.NET Core 应用程序的编译和构建。
  stage可以理解为台阶,每走一步相当于job,当然,这里的台阶可以走很多步,需要注意的是,每上一个台阶或者每走一步,都必须基于上一个台阶或上一步执行成功,before_script执行在这些步骤之前,可以理解为准备工作。
  environment将执行的job归纳为哪一种执行环境,你可以设置开发环境和正式环境,我们可以通过通过后台进行查看:
DSC0000.jpg


GitLab CI 服务器使用 SSH 连接到测试服务器
  什么意思呢?就是我们需要在 GitLab CI 构建环境中,使用 SSH 连接到测试服务器,这样我们才可以做接下来的一些操作。
  官方配置:SSH keys when using the Docker executor
  .gitlab-ci.yml示例配置:
  

before_script:  # Install ssh-agent if not already installed, it is required by Docker.
  # (change apt-get to yum if you use a CentOS-based image)
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  

  # Run ssh-agent (inside the build environment)
  - eval $(ssh-agent -s)
  

  # Add the SSH key stored in SSH_PRIVATE_KEY_DEV variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
  

  # For Docker builds disable host key checking. Be aware that by adding that
  # you are suspectible to man-in-the-middle attacks.
  # WARNING: Use this only with the Docker executor, if you use it with shell
  # you will overwrite your user's SSH config.
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  # In order to properly check the server's host key, assuming you created the
  # SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines
  # instead.
  # - mkdir -p ~/.ssh
  # - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'
  

  在进行配置之前,我们需要理一下这个步骤,要不然思路容易混乱,会造成一些问题,可以参考这篇文章:Fixing 'Enter passphrase for /dev/fd/63' in a Gitlab CI job
  需要强调一点:别在 GitLab CI 容器中进行 SSH 配置,因为 CI 构建脚本执行在另外的容器中,并且这个容器是动态进行创建的,也没办法在这个动态容器中进行配置(指的是手动生成 RSA 密钥)。
  所以,我们只能手动生成 RSA 密钥,然后强制添加到容器中的 SSH 配置中(通过 RSA 密钥内容)。
  配置步骤:
  首先,在任何一台服务器上,创建 RSA 无密码的密钥:
  

$ ssh-keygen -t rsa -P ''  
$ cat /root/.ssh/id_rsa
  

  然后复制 RSA 密钥内容,添加到/Project/Settings/Pipelines的Secret variables配置中(命名为SSH_PRIVATE_KEY_DEV):
DSC0001.jpg

  这里需要特别注意,复制内容为(包含开头和结尾的注释信息):
  

-----BEGIN RSA PRIVATE KEY-----  
xxxxxxx
  
-----END RSA PRIVATE KEY-----
  

  我一开始复制没有包含注释信息,然后就一直报下面的错误:
DSC0002.jpg

  错误代码:
  

$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")  
Enter passphrase for /dev/fd/63: ERROR: Job failed: exit code 1
  

  这里的$SSH_PRIVATE_KEY_DEV,就是上面我们在Secret variables中,添加的 RSA 密钥内容。
  错误信息就是说需要输入 RSA 密钥的密码,但我创建的确实是无密码的 RSA 密钥,也就是说这个密钥是无效的,我被这个问题折磨了好几天,其他人的记录:
  &quot;Enter passphrase for /dev/fd/63&quot; error(有我的回复)
  &quot;Enter passphrase for /dev/fd/63&quot; error
  https://gitlab.com/gitlab-examples/ssh-private-key/-/jobs/376082(受这个兄弟的启发)
  配置好这一步之后,然后重新测试下,我们就可以看到下面的执行信息了:
  

$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")  
Identity added: /dev/fd/63 (/dev/fd/63)
  

  接着我们需要将这个 RSA 密钥对应的公钥,上传到需要连接到的服务器(也就是我们的测试服务器),命令如下:
  

$ ssh-copy-id root@40.125.201.75  

  到此,GitLab CI 中 SSH 的配置基本上完成了,你可以在.gitlab-ci.yml中添加连接脚本,进行测试:
  

- ssh root@$DEPLOY_SERVER_DEV "ls && cd /"  

  一开始,我们说到使用scp进行服务器之间的文件传输,因为scp可以基于 SSH 连接进行传输文件,所以我们直接进行文件传输了,示例代码:
  

- scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp  

  scp命令参考:http://www.runoob.com/linux/linux-comm-scp.html

使用 Supervisor 进行站点程序的进程管理
  可以参考之前的文章:Ubuntu 安装和使用 Supervisor(进程管理)
  这里贴一下,supervisorctl的常用命令:
  |命令                                                  |       说明        |
  |supervisorctl stop program_name    |停止某个进程|
  |supervisorctl start program_name    |启动某个进程|
  |supervisorctl restart program_name |重启某个进程|
  |supervisorctl stop all                         |停止全部进程|

  |supervisorctl>  |supervisorctl update                         |根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启|

最终效果
  Pipelines 管道(地址:http://40.125.206.47/team/hwapp/pipelines)
DSC0003.jpg

  Build_Job 构建任务(地址:http://40.125.206.47/team/hwapp/-/jobs/113)
DSC0004.jpg

  Deploy_Dev_Job 发布和部署任务(地址:http://40.125.206.47/team/hwapp/-/jobs/115)
DSC0005.jpg


结语:
  GitLab CI & ASP.NET Core 2.0 发布和部署(完成):使用 CI 脚本编译程序,然后将编译后的文件传输到服务器上,最后运行程序,完成发布和部署。
  GitLab CI & ASP.NET Core 2.0 & Docker 发布和部署(下篇):项目中添加Dockerfile文件,使用 CI 脚本构建自定义镜像,然后在服务器上拉取并创建相应容器,最后启动容器,完成发布和部署。

  作者:田园里的蟋蟀
  出处:http://www.cnblogs.com/xishuai/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-453465-1-1.html 上篇帖子: ubuntu 相关软件的安装 下篇帖子: ubuntu 系统上添加根证书
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表