热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gitlabrunnerdocker基于sftp实现项目CI/CD自动部署

最近在给单位组建了CICD,要求对开发人员git的代码进行build和deploy,第一次从头研究CICD,真的踩了不少坑,

最近在给单位组建了CI/CD,要求对开发人员git的代码进行build和deploy,第一次从头研究CI/CD,真的踩了不少坑,尤其是deploy部分,卡了我三天了。

起因

环境:

ubuntu物理机专门做CI/CD工具机,已经使用了docker-compose同时安装了gitlab和gitlab-runner

gitlab用于代码托管,gitlab-runner用于run gitlab-ci,实现自动编译,测试,部署一步到位

一台远程的WEB服务器,生产环境

问题:

由于gitlab-runner是在docker下跑的,而gitlab-runner使用的执行环境也是docker,这就导致一个问题,编译后的文件无法直接拷贝到物理机,docker是个完全隔离的沙盒,docker也会在结束CI/CD后立马销毁,好在在docker CI/CD任务没有完成前,我们是可以获得build的文件的。

如何把需要部署的文件,例如jar,bin包部署到服务器呢?我思考了很多种方案:

  • 使用scp复制到远程,失败:需要账号密码,gitlab-ci都不给你机会输入
  • 使用sshpass+scp,可以条过密码,但过程繁琐,而且还是出现了权限问题,没深入
  • 使用ftp,由于ftp这个老东西无论是被动模式还是主动模式对双方开放随机端口,我觉得不安全,放弃
  • 使用rsync,要同时配置服务端,客户端,真的很麻烦,都不想看
  • 最后决定使用sftp,利用了服务器自带的ssh用户(需要新建安全的用户,指定目录)
  • jekenis,这个很强大,也很重,需要较长学习周期,部署各种服务,但我方项目较小,暂不考虑,优先考虑轻量级的sftp

以上都是我参考了大量在线的文档,博客,最后总结了一套自己的docker下sftp deploy方法

这里用node下vue项目举例,比如build过后的vue项目会产生一个dist目录,我现在要把这个下面所有的文件都发布到web服务器上!

开始

首先,你需要先把runner添加到gitlab才能run呀,这个在上两篇docker-compose搭建gitlab的文章中讲述过,这里在提醒下:gilab打开项目,左边菜单栏,Settings-》CI/CD,下拉runner,找到url和token,通过gitlab-runner register注册进去,注册完,就可以看到新的runner显示绿色可用状态。
在这里插入图片描述
下一步,你需要写gitlab-ci.yml和deploy.sh,当然你也可以一并写到gitlab-ci.yml中。我分开了,因为我喜欢写shell!

我的.gitlab-ci.yml

stages:- build- deploycache:key:files:- package.jsonpaths:- node_modulesbuild:stage: buildbefore_script:- npm config set registry https://registry.npm.taobao.orgscript:- npm install- npm run buildartifacts:expire_in: 1 daypaths:- distdeploy:stage: deployimage: ubuntu:20.04before_script:- rm /etc/apt/sources.list- echo 'deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse' >> /etc/apt/sources.list- echo 'deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse' >> /etc/apt/sources.list- echo 'deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse' >> /etc/apt/sources.list- mkdir ~/.ssh- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >~/.ssh/config- 'which lftp || ( apt-get update -y && apt-get install lftp -y )'script:- bash ./deploy.sh

关于gitlab-ci这个yml脚本,我必须特别说明下,里面有很多精华是我踩了很多的坑才写出来的。

下面是一篇官方文档:

Running Composer and NPM scripts with deployment via SCP in GitLab CI/CD

重点在before_script里面:

  • 首先你需要更换ubuntu的apt源到国内,提高速度,否则CI/CD很慢!
  • 把npm也换到国内,否则也很慢!
  • 然后你需要关闭ssh验证,这个很繁,docker下的runner系统每次都会问(每次run都是一个新环境),但你无法输入yes,所以你必须关闭StrictHostKeyChecking,否则失败。在你本地一般不会报错,原因是你看看.ssh下的kownhosts阿!你已经允许过了!
  • 安装lftp,用这个工具上传到sftp!很方便!

deply.sh

#!/bin/bash
#指定对端FTP服务器的用户名和密码
USER="xxxx"
PASSWD="xxxx"
IP='xxx.xxx.xxx.xxxx'
P='22'
DIR='example.com'
targetDay&#61;$(date -d "-1 days" &#43;"%Y-%m-%d")lftp -u $USER,$PASSWD sftp://$IP:$P <<EOMmirror -R dist $DIRbye
EOM
[ $? -eq 0 ] && echo "Upload SFTP server successful [$targetDay]"

这里这个deploy.sh其实是可以合并到yml里的&#xff0c;因为gitlab-ci.yml本来就是shell脚本的简化而以&#xff0c;用了gitlab-ci就不必要单独写shell&#xff0c;这里独立出来对我来说更加清晰&#xff0c;我解释下里面内容&#xff1a;

  • 首先定义连接sftp服务器的变量&#xff0c;用户名&#xff0c;密码阿之类的。这些以后要放到gitlab-runner的variables里更安全&#xff0c;不然提交git的人都知道部署生产服务器的账户密码了&#xff0c;在大公司里是绝对不可以的。
  • 关于上一条里的用户&#xff0c;肯定是不建议用root的&#xff0c;可以useradd新建一个用户&#xff0c;把www目录分配给他&#xff0c;我新建了一个deploy用户&#xff0c;最好再把网站deploy目录也chmod 777一下&#xff0c;不然还可能会有“permission denied”问题
  • lftp里面上传的是整个目录&#xff0c;要用mirror命令&#xff01;注意不是put, 也不能用所谓的put -r&#xff0c;这都是坑阿&#xff0c;坑的我哭了。

一看job succeed&#xff0c;甚是激动&#xff0c;终于从坑里爬出来了。

在这里插入图片描述


推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文详细介绍了如何在Azure DevOps Services和Azure DevOps Server中调整时区设置,以及这些设置对不同功能的影响。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
author-avatar
Karson2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有