Questions tagged «deployment»

部署是使软件系统可用的所有活动。与部署软件有关的问题在此标签下。

5
您如何处理多方项目中的版本控制?
我知道这是一个广泛的问题,所以我将尽量具体。这个问题比技术性问题更像是一个“组织性”问题。 我们有一个包含以下主要组成部分的多面项目: 服务器,托管核心业务逻辑(数据模型) 使用核心业务逻辑的客户后台 也使用核心业务逻辑的应用程序API(REST) 有使用应用程序API的智能手机应用程序(iOS和android) 还有另一个平板电脑应用程序(android)与使用相同应用程序API的智能手机不同。 很快,我将在活跃的客户中投入生产。作为任何项目,我都需要随着时间的推移维护所有不同的组件。这意味着可以升级以下所有内容: 服务器中核心业务逻辑的代码(由后台,API使用,并且副作用是由移动应用程序使用) API本身(由智能手机和平板电脑应用程序使用) 所有移动应用(通过appstore / googleplay) 当然,服务器端部分(核心业务逻辑代码和API代码)可以由我自己立即更改。但是,客户端必须在appstore / googleplay上下载新的移动应用程序,而且我不确定它们是否是最新的。 您能否提供任何指导和良好操作技巧,以使这些升级顺利进行,并且对客户没有风险? 我需要“版本”的哪个组件?即使客户端不升级其移动应用程序,如何确保一切正常?我应该强迫他升级以简化工作吗? 简而言之,我应该如何组织才能使我的多面项目随着时间的推移而上线?

4
我应该只为Windows部署32位版本,还是同时部署32位和64位版本?
我有一个用编译语言编写的跨平台应用程序。 对于Linux,习惯上可以同时使用amd64和i386版本,因此用户可以选择适合其当前环境的版本。 在Mac中,习惯上制作通用二进制文件,因此它可以支持多个版本的Apple计算机。或者仅提供64位版本,因为当前所有的Apple计算机都使用64位体系结构和OS。 我不想让用户困惑,问“您使用的是什么体系结构?”,但是仅部署32位是个坏主意,因为该程序使用了一些64位优化魔术,并且在这些计算机上运行得更快。 我的想法: 安装32位和64位版本的应用程序,然后在运行时选择。(需要包装程序,因此很难进行点击并启动应用程序(如uTorrent))。 User-agent在网站上使用来检测体系结构,以便用户可以自动下载适当的版本(并链接到“替代版本”)。(这是Google Chrome风格) 强制用户使用32位应用程序并将64位版本设置为“仅限专家”?(如VLC) 在Windows中我该怎么办?

2
Jenkins可以自动部署ASP.NET应用程序
是否有可能使用Jenkins自动/半自动部署ASP.NET Web应用程序。它可以在受控制或不受控制的环境中,因为不受控制的用户需要输入用户名和密码。我正在寻找将文件从目标复制到目标并在Web服务器场方案中运行sql脚本的方法。 编辑 当前,我们正在使用bat文件来xcopy /配置应用程序池/ sql cmd等,以部署应用程序。但是要使其正常工作,生产支持团队需要下载源代码,构建项目并运行bat文件以部署应用程序。 现在,我们希望自动化部署而不需要用户下载源代码,而最终用户只需访问url并填写用户ID和密码参数,然后选择svn标签即可部署。但是Jenkins在匿名登录下运行,因此现有的bat文件将无法运行,因为它没有运行脚本的权限。 因此,我想知道这种情况是否存在其他选择。如果使用输入的用户名和密码来模拟用户上下文,则可以运行现有批处理文件而无需进行进一步更改,那将是很好的选择。如果不可能,我们也想探索其他想法,但是我们没有灵活性来选择诸如puppet之类的自动化工具,我们应该坚持使用这些批处理文件。

2
部署脚本是否应该是构建的产物?
这是一个用Java编写的Web项目。 因此,我正在编写构建和部署脚本。为了创建构建,我使用了ant。詹金斯(Jenkins)完成了连续构建。 构建生成3个不同的工件: 战争档案 带布局的拉链 带图片的拉链 到目前为止,一切都很好,但是现在我需要编写部署脚本,该脚本应该: 将战争(工件1)部署到在服务器1上运行的tomcat 将工件2放置在服务器1的特定目录中 将工件3放置在服务器2的特定目录中 因此,我正在与我的同事交谈,他说我们还应该生成一个工件(也许是deploy.xml),当将其放置在正确的服务器上时,就可以部署这些工件。 因此,将有另一个脚本,它将是: 下载詹金斯文物 scp到每个服务器,并将deploy.xml放在此处 远程调用deploy.xml 使我有些不舒服的是将deploy.xml作为构建工件的行为。其背后的动机是能够进行部署而无需访问VCS存储库,因此构建将是自包含的,即,任何构建只能使用Jenkins生成的内容才能投入生产。 部署脚本应该放在哪里?它们应该只在VCS还是应该是构建工件?


6
您可以与初级程序员一起进行连续部署吗?
有一瞬间,您开始了解到,在微服务体系结构中,要等一周一次部署所有微服务以确保所有功能都能正常工作,要比严格执行api版本控制,编写大量自动文档更令人恐惧。测试(每个测试有点:单元和探索,集成),并在阶段测试通过提交后就自动将其部署到生产中。 现在,只要您记得编写测试,在提交之前测试您的更改,知道如何使用API​​版本控制,并且您不会将数据库删除在部署时执行的增量数据库更新脚本中,这似乎是个好主意。不是大问题,因为它应该在舞台上失败)。 但是,与初级程序员一起这样做是否可行?也许我将必须实现请求请求模式。这会使它不像连续部署(这是我的猜测)吗? 我希望这不是基于观点的,我可以指望您分享您的经验,谢谢。 请注意,我不是在问CI还是在持续交付。我们已经有了。我们现在正在尝试使其连续部署,这意味着在代码签入之后将其全部投入生产。

2
作为一家欧洲公司,是否可以为客户编写定制的iPad应用程序?
我们的客户希望我们为他编写一个自定义应用程序,以供他在公司的少数iPad上使用。此应用程序可能仅对这个客户有用(将来可能会再增加两个或三个,但只有在进行其他自定义之后)。 我了解到,如果客户订阅了Apple的批量购买计划,我们便可以为他提供定制的B2B应用程序。但是,这似乎仅限于美国开发商(或客户?或两者兼有?)。 对于欧洲(或更常见的非美国)软件开发人员及其本地客户,有哪些替代方案?

9
您可以采取什么措施来减少实时网站的部署错误数量?
我敢肯定你们中的很多人都遇到了这个问题。网站或Web应用程序正在运行并且正在运行。您想上传下一个版本,但是您还没有弄清所有内容,例如在配置文件中将值设置为false,将另一条记录插入数据库中以及进行许多次要的工作,这些工作有时可以计算20个或更多的参数。 上传新版本后,一切都会中断。现在,解决问题可能只需要20分钟,但是您所能忍受的总体压力以及对公司的财务和商誉损失有时也不会忘记。 有什么方法可以减少由新版本部署的初始配置引起的这些类型的错误? PS:请不要提及检查清单,因为我们已经有了它们。检查清单的问题在于,它们应该始终得到更新,但不会更新。

4
将Web应用程序直接从SVN部署到生产环境是否可以接受
题 是否有合理的理由不使用SVN进行生产部署,或者这仅仅是个人喜好而没有针对SVN的真实案例? 背景 我的工作场所具有在SVN中标记发布的文化,然后使用(svn co或svn switch直接包括)将这些发布直接部署到各种Web服务器。 我个人对此有一个问题,因为我相信如果不使用构建和部署脚本,某种形式或自动部署,就会丢失集成环境设置,因为它们没有文档说明。然而,不仅如此,我有一种直觉,认为这样做可能存在隐藏的危险,而这种危险尚未被抬起头来。 我已经向负责将代码部署到我们的各种环境(阶段,预生产,生产)等中的运营人员提出了自己的担忧。他们的观点几乎是到目前为止效果很好,没有理由进行更改。 编辑: 我的意思是关于构建和部署: 例如,如果开发人员需要为特定环境添加web.config设置。Web.config通常不保存在svn中,因此无需任何形式的自动构建脚本即可手动更新这些文件。因此,如果它们丢失或OPS忘记为发行版在web.config中添加字段,则可能会遇到问题。 可以使用XMLPoke自动生成适合于特定环境的web.config的构建脚本非常理想,因为您有一个可版本化的脚本,该脚本记录了每个环境所需的所有更改。 当前的构建和部署方法 对于有问题的项目,开发人员可以手动构建发行版,而其他项目则可以使用NANT或MSBuild将构建步骤自动化。 对于大多数项目,数据库迁移是通过DB脚本,迁移脚本(Migrator.NET)或CMS程序包进行的。 CI通常是由Team City在每次签入的基础上完成的,我们有一个代码审查过程,所有票证都在分支机构中完成,然后在进入中继线之前进行同行审查,以确认其有效性和正确性/质量(运作良好)。 但是,实际的代码部署几乎总是通过SVN来进行,或者是通过签出带标记的版本,或更通常是通过SVN Switch来进行。在我们使用存储库作为部署过程的一部分时,这让我感到奇怪。 配置通常不会经常更改,配置文件中唯一会发生的事情就是特定于环境的信息。其他所有内容都在数据库中。 不要误会我的意思,这行之有效。但是,我想尝试推动自动化的构建和部署。我已经在Rails和Capistrano以及用于Cygwin,Nant和SSH的个人项目中使用了它。 更重要的是,我需要非常具体的有效参数来使我的同事转变为使用自动生成和部署。 还是没有真正的有效论据反对使用SVN专门部署到生产环境?

2
缩小的CSS是否应该存储在Git中?
我使用Gulp从我正在处理的项目的SASS代码中生成缩小的CSS。 我想知道从Git上线时重新生成此缩小的CSS是否被认为是最佳实践... 要么 要将缩小的CSS文件存储在Git中,以便将它们自动实时发布到生产环境,而无需服务器方面的进一步工作? 我很感谢人们对此的想法。谢谢!

1
使用TFS构建过程模板(工作流)进行部署
我正在考虑将TFS Build工作流用于复杂的部署。我们有一些可能需要部署: Web应用程序和服务 数据库 SSRS报告 SSIS软件包 谁知道 我喜欢这样一个事实,我可以为工作流提供一些基本参数,例如要部署的构建以及它将运行的构建。潜在地,某些部分可能需要人工批准,而且我知道工作流也可以处理。一个示例是,我们可能使用工作流从Visual Studio数据库项目中创建更改脚本,但是DBA组希望在运行脚本之前对其进行批准。 我想知道过去是否有人为此使用过“构建”,以及发现了什么问题。

1
软件/固件自动更新策略
我现在有一个中型项目,该项目已经接近“为客户演示提供草率咖啡因的原型”阶段的结尾,并过渡到“思考未来”阶段。该项目由具有软件和固件的基于Linux的设备以及中央管理Web服务器组成。目前存在10个原型,预计产量将低至1000左右。 我不熟悉自动更新技术,而且时间紧迫,所以我迅速制定了自己的软件部署/自动更新策略,坦率地说,它很糟糕。当前由以下各项组成: 带有生产发行分支的托管git repo(GitLab)(请注意,Web服务器源也位于此相同的repo中,还有其他一些东西)。 Web界面上的“部署更新”按钮,该按钮: 从生产发行分支将最新版本拉到本地回购区域,并将其复制到临时软件包准备登台区域。 在登台区域中运行清理脚本(存储在仓库中)以删除不相关的源文件(例如服务器源,固件源等)和.git文件。 将当前git哈希写入更新包中的文件(目的将在下面变得清楚)。 如果一切顺利,它将用gzip压缩并准备好使用,方法是使用同名文件覆盖以前的gzip压缩包,然后删除暂存区。 请注意,服务器上现在有两个当前设备软件的副本,它们有望同步:最新生产分支上的完整本地git repo和一个现成的gzip压缩包,现在假定该软件包代表了以下内容:相同的版本。 设备上的软件独立包含在名为的目录中/opt/example/current,该目录是该软件当前版本的符号链接。 引导时设备上的自动更新功能: 检查do_not_update文件是否存在,如果文件存在,则不采取进一步措施(有关开发设备,请参见下文)。 从上述文本文件中读取当前提交哈希。 使用该哈希作为查询参数向服务器发出HTTP请求。服务器将以304(哈希为当前版本)响应,或者将提供压缩后的更新程序包。 如果收到更新包,则/opt/example通过以下方式安装: 提取更新的软件信息,将其命名为stage。 从更新包运行安装后脚本,该脚本执行诸如对该更新进行必要的本地更改等操作。 将当前软件的根文件夹复制到previous(previous如果存在,则首先删除现有文件夹)。 将stage文件夹复制到latest(latest如果存在,则首先删除现有文件夹)。 确保current符号链接指向latest。 重新引导设备(固件更新(如果存在)在重新引导时应用)。 在新建设备上也存在初始部署的问题。这些设备当前基于SD卡(存在其自身的问题集,不在本文范围内),因此此过程包括: 存在一个SD映像,上面带有该软件的某些稳定早期版本。 从该映像创建SD卡。 首次启动时,会进行各种首次特定于设备的(基于序列号)初始化,然后自动更新程序将照常获取并安装该软件的最新生产版本。 另外,我需要开发设备的支持。对于开发设备: 完整的本地git repo会保留在设备上。 该current符号链接指向开发目录。 do_not_update存在一个本地文件,该文件可防止自动更新程序随生产更新一起删除开发代码。 现在,从理论上讲,部署过程应为: 一旦准备好部署代码,就将其推送到发布分支。 按下服务器上的“部署更新”按钮。 该更新现已生效,设备在下次检查时将自动更新。 但是,实践中存在大量问题: Web服务器代码与设备代码位于相同的存储库中,并且服务器具有我要执行的本地git存储库。最新的Web服务器代码与最新的设备代码不在同一分支上。目录结构有问题。当“部署更新”按钮从生产分支中提取最新版本时,会将其提取到服务器代码的子目录中。这意味着当我从头开始部署到服务器时,我必须通过将设备生产分支捕获到该子目录中来手动“播种”该子目录,因为如果我不进行部署,则可能是由于git user错误造成的。从父目录的Web服务器分支中提取设备代码。我认为这可以解决,方法是使暂存区不是服务器本地git repo的子目录。 Web服务器当前不永久维护设备软件的git哈希。在服务器启动时,它会git rev-parse HEAD在其本地设备软件仓库中执行,以检索当前哈希。由于某些原因,我无法全神贯注,这还会导致大量逻辑错误,在此不再赘述,足以说明有时重新启动服务器会使事情搞砸,特别是如果服务器是全新的并且没有生产分支仓库已被撤消。如果需要的话,我很乐意分享该逻辑的源代码,但是这篇文章越来越长。 如果清理脚本(服务器端)由于某种原因而失败,则服务器将拥有最新的存储库,但同步/丢失更新包不完整,因此git rev-parse HEAD将返回与实际不匹配的哈希服务于设备,并且必须在服务器命令行上手动更正此处的问题。即服务器不知道更新程序包是不正确的,它只是始终以纯属为前提。结合以上几点,使服务器在实践中极为脆弱。 最大的问题之一是:设备上当前没有运行单独的updater守护程序。由于等待wifi上网的复杂性和最后一刻的黑客行为,它是检查和更新设备的主要设备控制软件。这意味着,如果某种程度上未经测试的版本将其投入生产,并且控制软件无法启动,则实际上存在的所有设备都是砖砌的,因为它不再能够自我更新。这将是生产中的绝对噩梦。如果单个设备在不幸的时间断电,则同样的处理方法。 另一个主要问题是:不支持增量更新。举例来说,如果设备一段时间没有打开,那么下次对其进行更新时,它会跳过一系列发行版本,因此它必须能够进行直接的版本跳过更新。更新部署的结果是确保任何给定更新都可以应用在任何给定过去版本之上的噩梦。此外,由于使用git散列来标识版本而不是版本号,因此目前尚无法对版本进行字典式比较以促进增量更新。 我当前不支持的一个新要求是,将存在一些必须在管理服务器端配置的每设备配置选项(键/值对)。我不介意以某种方式将这些每设备选项以与软件更新相同的HTTP请求提供给设备(也许我可以将其封装在HTTP标头/ Cookie中),尽管我不太担心,因为我可以始终使其成为单独的HTTP请求。 …

2
将我们的代码分解为可重用的位之后,我们如何测试和部署?
我们从一个开发人员开始,然后是一个包含我们所有代码的svn存储库: ^/foo/trunk/module-a ^/foo/trunk/module-b ^/foo/trunk/module-b/submodule-b1 ^/foo/trunk/website1 (当时是一个很大的进步)。在这有了长足发展的机会之后,我们开始遇到循环依赖项,缓慢的测试套件以及重用代码的一般困难的问题(因为例如website1的功能集已潜入其他通用模块-a中)。 想要对代码库进行模块化,并希望我们不久就迁移到git(并且已经读过git不喜欢svn mega-repos的地方),我们已经过渡到了更精细的结构: ^/module-a/trunk/ ^/module-b/trunk/ ^/module-b/trunk/sumbmodule-b1 ^/earlier-sub-sub-sub-module-c/trunk etc. (about 120 such modules) 从概念上讲,这很棒。更多的模块化代码,更快的测试套件,更容易记录的文档,等等。我们开源了一些更通用的组件,并使所有模块都可以pip安装(pip install -e .用于将它们安装在developmentvirtualenv中)。 我们创建了一个^/srv/trunk存储库,其中包含运行时环境的文件夹结构。^/srv/trunk/lib用于模块,/srv/trunk/src用于的其余部分^/foo/trunk,^/srv/trunk/www用于网站等。 最后(从我很久以前与perforce合作的[ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html]中吸取灵感),我们创建了一个“ vcs-提取”文本文件,其中列出了所有相关的存储库以及应将其检出到开发环境中的位置,并提供了相应的命令来执行此操作。例如vcs-fetc行: svn srv/lib/module-a ^/module-a/trunk 会导致(第一次) cd /srv/lib && svn co ^/module-a/trunk module-a 或(之后) cd /srv/lib/module-a && svn up 同样适用于github repos(我们自己的和更改/未更改的供应商软件包)。 我们使用了相同的vcs-fetch流程来创建生产环境,但是我们很快发现,在进行vcs-fetch之后,我们无法知道哪个版本在prod中运行。 对于大型仓库,我们可以在从主干更新产品之前记下修订号,然后回去就很简单svn -r nnn up .了。使用svn和git中的代码(以及hg中的一个模块)以及〜120个仓库,如何执行此操作并不明显。 …

5
公司在开发时如何隐藏网站?
我是新来的人,也是刚入职的19岁新PHP开发人员,所以我不确定这是如何工作的。许多公司在开发其网站时都会隐藏其网站,以免被索引。从搜索引擎隐藏html5 / css和php / mysql的方法有哪些?如果我没看错,这些是技巧: 离线开发:使用本地存储呈现html / css;不知道PHP / mysql将如何工作。 使用.htaccess阻止访问 使用VPN阻止访问。

1
打包Python程序的良好做法
在个人和专业项目的背景下,我已经使用Python一段时间了。 最近发生在我身上的一件事是,我从未想过部署Python程序的好方法。基本上,因为它主要是一堆脚本,所以我通常只将它们复制到要部署它的机器上,瞧! 但是我相信应该有一些关于如何部署Python项目的良好实践。我听说过Python Eggs,但对它并不熟悉,以了解它是否是一个不错的选择。还是带有一堆Shell脚本来运行核心模块脚本的普通老压缩包? 基本上,我希望能够做一个很好,优雅且自包含的部署,而不仅仅是在这里和那里复制文件,因为它不允许轻易地进行版本跟踪,而且非常混乱。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.