大佬们你们的 go 项目打包到部署的流程是怎么样的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
imherer
V2EX    Go 编程语言

大佬们你们的 go 项目打包到部署的流程是怎么样的

  •  
  •   imherer 2019-05-21 10:23:58 +08:00 7542 次点击
    这是一个创建于 2347 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我现在在本地开发完成了,需要打包部署到服务器上。 因为开发的时候好多配置项都是本地的,比如数据库连接啥的,部署到服务器上需要修改为正式的。

    总不能在代码里把配置项修改了,然后在打包部署。完了开发的时候再改成测试的吧?
    27 条回复    2019-05-21 20:32:51 +08:00
    loveCoding
        1
    loveCoding  
       2019-05-21 10:26:59 +08:00   1
    ./server run --config prod.ini ./server run --config dev.ini ./server run --config local.ini
    godgrp
        2
    godgrp  
       2019-05-21 10:27:52 +08:00   2
    1、配置文件
    2、配置管理中心,etcd 等方案很多
    kwanzaa
        3
    kwanzaa  
       2019-05-21 10:29:22 +08:00   1
    我写的玩具都是读取 Json 文件来获取配置。。。
    Immortal
        4
    Immortal  
       2019-05-21 10:38:19 +08:00
    你们配置不读文件的???
    imherer
        5
    imherer  
    OP
       2019-05-21 10:40:39 +08:00
    @Immortal 公司项目没用到 go,我自己写着玩的
    guyeu
        6
    guyeu  
       2019-05-21 10:49:59 +08:00
    emmmm 第一次见到配置 hardcode 在代码里的。。。
    tjyao520
        7
    tjyao520  
       2019-05-21 10:50:17 +08:00   1
    os.getenv()
    BCy66drFCvk1Ou87
        8
    BCy66drFCvk1Ou87  
       2019-05-21 10:53:18 +08:00   1
    服务器端灵活使用 git+docker,每次代码更新 git pull 后 docker 直接制作镜像 run 起来
    wuchujie
        9
    wuchujie  
       2019-05-21 11:11:26 +08:00
    @loveCoding 看了下 b 站的一个开源 web 库就是用这种方法读写配置文件。。但是不知道是 os.getenv() 读取同目录下的 config.json 好呢。还是用这种方法比较好。
    Muninn
        10
    Muninn  
       2019-05-21 11:11:33 +08:00   3
    https://12factor.net/zh_cn/

    拿走不谢

    这不是个 golang 的问题
    messyidea
        11
    messyidea  
       2019-05-21 11:16:31 +08:00
    判断生产环境还是测试环境,然后用不同的数据库
    xfriday
        12
    xfriday  
       2019-05-21 11:22:19 +08:00
    k8s+configMap
    lonelygo
        13
    lonelygo  
       2019-05-21 11:28:25 +08:00
    @imherer 写着玩,配置 hardcode 在代码里,也不科学鸭,换个机子改起来多累。
    yanzixuan
        14
    yanzixuan  
       2019-05-21 11:29:56 +08:00
    @godgrp 哪个配置管理中心最好?有推荐的么?
    imherer
        15
    imherer  
    OP
       2019-05-21 11:33:06 +08:00
    @lonelygo 所以来向各位大佬取经了
    zichen
        16
    zichen  
       2019-05-21 11:33:42 +08:00
    单独建一个配置文件的代码库,持续集成流水线部署的时候,会直接拉取对应环境的配置文件部署。
    loveCoding
        17
    loveCoding  
       2019-05-21 11:36:14 +08:00
    @wuchujie 相比读 path,配置文件可能会好点,毕竟跟着代码走,不用维护 path 什么的减少运维成本
    wuchujie
        18
    wuchujie  
       2019-05-21 11:46:00 +08:00
    @lonelygo
    @xfriday
    @Muninn
    @zichen
    @loveCoding
    能请教一下 docker 是怎么部署吗?
    我现在一直以来的思路是抛开语言层面。比如 nodejs python 这些需要虚拟环境的语言。
    我是用 docker 做一个包涵所有虚拟环境库的镜像。然后比如我的代码目录是 /home/deploy/app 我就映射 /home/deploy/app 进去镜像的根目录 /app 然后运行 python a target="_blank" href="http://app.py" rel="nofollow noopener">app.py 或者 node app.js
    以后每次更新代码。我只需要在代码目录 git pull 然后 restart 一下容器就可以。。不用每次更新代码都打包一个镜像。
    a134698815
        19
    a134698815  
       2019-05-21 12:30:15 +08:00
    k8s+docker
    Kilerd
        20
    Kilerd  
       2019-05-21 13:02:44 +08:00
    dotenv
    Muninn
        21
    Muninn  
       2019-05-21 15:15:07 +08:00
    @wuchujie 那你基本白用 docker 了,一般不是那么用的。

    基本都是每个版本靠持续集成自动测试和构建镜像。

    生产部署可以自动,也可以手动。

    大项目有很多容器用 k8s,小一点用 swarm 再小一点单机用 docker-compose。

    配置是在配置中心或者在启动集群的配置文件里的。用环境变量传入容器。
    wuchujie
        22
    wuchujie  
       2019-05-21 16:13:49 +08:00
    @Muninn 请教一下。如果按照小一点单机 docker-compose 来处理的话。。正常的配置文件应该怎么写比较好。
    比如 redis -> ip:port mysql-> ip:port user:password 这些好像不能打包进镜像里面 config.yaml 或者 config.json 吧?

    我有个思路是代码层读取环境变量 比如 go python 初始化项目的时候 读取一下+格式化一下 env['redis'] 和 env['mysql']
    然后在 docker-compose 写好 environment 这样可以吗?但是会不会导致上传代码的时候 docker-compose 也给上传了。让人家看的一目了解
    wuhongwei
        23
    wuhongwei  
       2019-05-21 16:15:29 +08:00
    参考 b 站
    zclHIT
        24
    zclHIT  
       2019-05-21 16:42:46 +08:00
    配置文件中设置不同的环境配置,然后配置一个 RunMode,不同环境使用不同的 RunMode
    boris1993
        25
    boris1993  
       2019-05-21 16:55:06 +08:00 via Android
    公司不写 Go
    自己的玩具是读 yaml 的,同时带有命令行开关
    除了配置文件,也可以考虑读环境变量
    但是绝对不要写死在代码里
    gxm44
        26
    gxm44  
       2019-05-21 19:52:52 +08:00
    dotenv + 1
    Muninn
        27
    Muninn  
       2019-05-21 20:32:51 +08:00
    @wuchujie compose file 不放代码库里的,你可以放一个隐藏掉关键信息的 example。 部署的时候只需要这一个文件就行了,你也不需要把 repo clone 下来呀。

    现在还有一个选择是用 docker secret。 这样部署的服务器上也看不到敏感信息了。 不过需要在代码里兼容读取。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3363 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 04:38 PVG 12:38 LAX 21:38 JFK 00:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86