V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taogen
V2EX  ›  程序员

今天老大说想让我自己部署项目,但又怕我删错东西

  •  
  •   taogen ·
    tagnja · 2020-12-11 20:26:34 +08:00 · 5758 次点击
    这是一个创建于 1441 天前的主题,其中的信息可能已经有所发展或是发生改变。

    远程代码仓库用的是阿里云 code,没有 CI 。服务器没有备份,怕我一不下心 rm -rf /

    老大只是今天下班前提了一下,还没给服务器登录帐号。

    自己部署会方便一点。我该不该争取自己部署项目呢?

    第 1 条附言  ·  2020-12-12 08:05:33 +08:00
    想了一个部署方案,大家觉得可行吗?

    部署方案特点:

    1. 使用 Shell 脚本,实现自动化更新。
    2. 使用 Nginx 反向代理,24 小时随时可更新,实现无缝热更新。
    3. Shell 脚本先本地测试后再使用,安全可靠。

    部署流程

    - 本地提交最新代码。
    - 服务器拉取最新代码。
    - 服务器编译最新代码。
    - 检查系统端口占用,运行“部署脚本”,部署新版本代码(与上一次运行的端口不同)
    - 使用 IP 访问,测试新版本项目是否运行正确、新增功能是否正确。
    - 新版本项目测试通过后,运行“切换项目脚本”,Nginx 修改项目运行端口配置,Kill 旧版本项目的进程,备份旧版本项目可执行文件。
    - 运行一段时间,发现其他紧急问题,可以运行“恢复项目脚本”,运行上一个版本的项目代码。
    - 部署流程结束。

    实现过程

    - 获取服务器相关信息。Nginx 目录。部署运行方式。
    - 本地虚拟机模拟线上环境,编写 Shell 脚本。
    - 服务器测试 Shell 脚本自动部署。(测试之前,如有必要可备份系统镜像)
    - 测试通过后,创建一个系统用户,只对该脚本有可读可执行的权限。
    36 条回复    2020-12-14 11:07:01 +08:00
    QingStone
        1
    QingStone  
       2020-12-11 20:27:17 +08:00 via iPhone
    哈哈哈哈,跟我一样。每次部署怂得一批!
    hcsu
        2
    hcsu  
       2020-12-11 20:28:01 +08:00 via iPhone
    我也是…每次操作生产怂的一批
    nightwitch
        3
    nightwitch  
       2020-12-11 20:30:06 +08:00   ❤️ 6
    "服务器没有备份"
    出事是迟早的
    40EaE5uJO3Xt1VVa
        4
    40EaE5uJO3Xt1VVa  
       2020-12-11 20:32:34 +08:00
    3l 说得对
    echowuhao
        5
    echowuhao  
       2020-12-11 20:41:32 +08:00
    CI 都没有的公司,要么跟老大说,自己来弄 CI 。要么赶紧跑路。
    darksword21
        6
    darksword21  
       2020-12-11 21:00:22 +08:00 via iPhone
    反正做事之前准备好备份和恢复。然后放开干
    taogen
        7
    taogen  
    OP
       2020-12-11 21:24:01 +08:00 via Android
    @nightwitch 这就是墨菲定律啊
    rabbbit
        8
    rabbbit  
       2020-12-11 21:24:55 +08:00   ❤️ 6
    那必须得中午部署了
    wxsm
        9
    wxsm  
       2020-12-11 21:59:43 +08:00
    简单,写个 bash,在自己机器上执行一次,没问题就到远程机器上执行。
    dream4ever
        10
    dream4ever  
       2020-12-11 22:02:36 +08:00
    权限控制呢?限制账号只能操作指定目录?
    raaaaaar
        11
    raaaaaar  
       2020-12-11 22:15:40 +08:00 via Android
    权限被吃了吗?就是干这个事的啊
    jimiy
        12
    jimiy  
       2020-12-11 22:26:40 +08:00
    部署前,先把上一个可运行版本先备份,然后再部署新的,给自己一个退路啊
    Noisky
        13
    Noisky  
       2020-12-11 22:36:14 +08:00
    一定一定要先备份
    f165af34d4830eeb
        14
    f165af34d4830eeb  
       2020-12-11 22:40:35 +08:00   ❤️ 5
    你们有体验过给生产环境服务器调整分区么?我觉得应该和给飞行中的飞机换发动机的感觉差不多。
    iloveayu
        15
    iloveayu  
       2020-12-11 22:53:10 +08:00   ❤️ 1
    代码都有了,先在自己本机装虚机部署,跑通整个流程,实际部署时心里就有底了。
    正式环境部署前,云服务器先来个镜像,本地虚机先打快照,手潮误删滚回就好。
    hushao
        16
    hushao  
       2020-12-12 04:49:19 +08:00
    既然老大有这个想法,自己就争取一下吧,生产部署也没什么可怕的。
    事先做好部署方案,形成文档,固化成 shell 脚本,自己本地测试通过,然后拿给老大过目,生产环境严格按照文档或者测试通过的脚本来。
    生产部署前一定记得备份!
    securityCoding
        17
    securityCoding  
       2020-12-12 10:19:14 +08:00   ❤️ 1
    为什么不直接起一个 jenkins.... pkg 包每次构建扔到 oss 上面呗
    taogen
        18
    taogen  
    OP
       2020-12-12 10:38:46 +08:00 via Android
    @securityCoding 看了一下,阿里云 code 仓库有 webhooks,可以考虑使用 Jenkins 。
    有一点疑惑,pkg 包扔到 oss 上怎么结合 Jenkins 是怎么操作呀?( Jenkins 不太熟悉
    ericgui
        19
    ericgui  
       2020-12-12 11:14:00 +08:00
    如果你们有负载均衡,就可以放心的多了
    loveyu
        20
    loveyu  
       2020-12-12 11:26:13 +08:00
    先本机测试,搭一个完整的环境,脚本全部先验证一遍。
    securityCoding
        21
    securityCoding  
       2020-12-12 11:32:17 +08:00
    @taogen jenkins pipline 可以自定义一个上传文件到 oss 的 stage, stage 里面可以执行命令.

    下面是我项目里面的 stage 定义供参考

    stage('上传 JAR 至 OSS') {
    steps {
    script {
    path = env.WORKSPACE + "/" + params.moduleDir + "/build/libs"
    echo 'jar 包目录:' + path
    jarName = params.jarName
    echo 'jar 包名称:' + jarName
    branch = env.BRANCH_NAME
    echo 'jar 构建分支:' + branch
    sh(script: "/home/user_00/./oss_deploy.sh " + " " + path + " " + jarName + " " + branch + " ", returnStdout: true)
    }
    }
    post {
    failure {
    println('上传失败')
    }
    success {
    println('上传成功')
    }
    }
    }
    taogen
        22
    taogen  
    OP
       2020-12-12 11:41:46 +08:00 via Android
    taogen
        23
    taogen  
    OP
       2020-12-12 11:43:33 +08:00 via Android
    @ericgui
    to B 的项目,并发量不大,就一台服务器。
    codehz
        24
    codehz  
       2020-12-12 13:25:49 +08:00 via Android
    楼上这种拼凑字符串的怎么看问题都比较大(
    lower
        25
    lower  
       2020-12-12 15:16:22 +08:00
    编译操作可能会对服务器 CPU 有大量消耗,不要直接在应用服务器上搞;
    尽量只在生产服务器做有限的备份 /替换 /热更新等基本操作哇……
    taogen
        26
    taogen  
    OP
       2020-12-12 16:26:40 +08:00 via Android
    @lower 大佬,要自动化部署,只能在服务器上编译了。有什么其他办法吗?
    lower
        27
    lower  
       2020-12-12 17:02:48 +08:00
    @taogen
    我的意思是防止影响生产服务的正常运行。。。
    比如专门独立的服务器来编译打包,最后只是把部署包 发布到应用服务器……
    mlxj
        28
    mlxj  
       2020-12-12 17:05:49 +08:00
    心里默认一定不要“rm -rf”;
    心里默认一定不要“rm -rf”
    心里默认一定不要“rm -rf”
    心里默认一定 要“rm -rf”
    心里默认一定 要“rm -rf”
    心里默认一定 要“rm -rf”
    taogen
        29
    taogen  
    OP
       2020-12-12 17:16:49 +08:00 via Android
    @lower 明白了。
    js8510
        30
    js8510  
       2020-12-12 17:29:26 +08:00 via Android
    短期 hacking solution 可以 没啥大毛病。长期建议是使用 成熟的 CI/CD solution 比如你这个 hotswap solution 如果 v2 OOM/dead loop 然后 server no response 无法 rollback 你怎么办?
    boolstone
        31
    boolstone  
       2020-12-12 17:38:03 +08:00
    我记得阿里云已经禁止 rm -rf / 要加参数才可以
    taogen
        32
    taogen  
    OP
       2020-12-12 21:53:00 +08:00 via Android
    @js8510 这种情况,那只能登录服务器查看 gc 日志、进程状态和系统资源占用,或者重启服务器。迫于不是 leader CI/CD 不好推行。
    mingt
        33
    mingt  
       2020-12-13 11:12:21 +08:00
    @mlxj 念着念着就打出来了
    baozhuo
        34
    baozhuo  
       2020-12-14 09:13:00 +08:00 via Android
    反正我是担责任的情况下能不自己部署,甩给别人不香吗?反正我不背锅
    draguo
        35
    draguo  
       2020-12-14 10:59:03 +08:00   ❤️ 1
    用阿里 code,直接用云效更方便
    julyclyde
        36
    julyclyde  
       2020-12-14 11:07:01 +08:00
    这个方案看起来不是很靠谱
    不过各企业具体情况不一样,你也可以先做出来再沟通
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2935 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.