我的团队使用TeamCity进行持续集成。 它将通过Web Deploy构build,testing和部署Web应用程序到dev和qa Web服务器。 棘手的部分是部署到生产Web服务器 – 我们的政策规定,开发人员不能部署到生产,只有系统pipe理员可以。
我们目前的方法是让TeamCity构build一个Web部署包,pipe理员可以下载并安装在生产Web服务器上。 但是,我们希望允许他们只需点击构buildconfiguration上的“运行”,但我们不确定如何确保该button的安全。
我们可以创build一个只有pipe理员才能访问的TeamCity项目,但是我们也必须解决Web Deploy安全问题。 Web部署服务需要使用生产服务器上的本地pipe理员帐户进行身份validation。 我们不希望开发人员在构build脚本中访问用户名/密码,也不希望每个构build代理都以此帐户运行,因为开发人员可以创build一个构build,以便将其部署到生产环境。
在TeamCity安全/部署最佳实践方面,我还没有find太多的运气,但是我无法想象我们是这种情况下唯一的公司。 其他人如何pipe理自动部署安全性?
使用Teamcity中的angular色和权限 ,您可以拥有一个只有您的部署团队才有权访问的项目。 它可以在主构build上具有构件依赖性 ,甚至可以使用“最后的固定构build”,以便开发人员可以控制甚至可用。
我将安装一个能够部署到目标系统的构build代理,然后在TeamCity UI中使用该代理的“兼容构build”function,使其仅与您的生产部署构build兼容。 (当然你也想确保你的开发者没有权限去修改代理configuration。)
这是Teamcity使用代理兼容configuration选项的一个缺点:如果您将其他构build代理与所有构build兼容,那么可以尝试从其中一个构build代理(如果有空)访问其中一个构build代理。 我所知道的唯一的解决方法是将它们全部设置为只运行“指定的构build”,并将所有其他构build添加到其他代理。 如果你添加一个新的版本,那么痛苦就是如果你添加一个新的版本,它将无法在任何地方运行。
还有一些方法可以限制构build只能在构buildconfiguration中使用代理需求运行在特定代理上。
一个是添加一个要求, teamcity.agent.name等于您希望它运行的代理名称。 (或者相反,不等于你不希望它运行的那个)。
另一种方法是添加环境variables(存在或具有特定值)的要求,然后仅在要运行该构build的代理上设置该环境variables。
另一个可能的解决scheme是有两个Teamcity安装,因为你实际上有两个不同的用户组。 你显然不能使用工件依赖,但你总是可以使用如下的url来获得给定的构build的最新的工件:* http://teamcity.server/repository/download/bt41/latest.lastSuccessful/setupfile.exe
哪里:
bt41是bt41中的构build标识(当您导航到任何构build时,您可以在URL中find它) latest.lastSuccessful也可以是lastest.lastPinned ,最新版本,最新版本或最终版本号 setupfile.exe是您要从工件输出中抓取的文件(如果未在顶层发布,也可以是path) 为了保护Web部署过程,如果您位于域中,可以将Web部署设置为接受Windows身份validation,然后让teamcity构build代理作为有权在IIS中部署的域用户运行。 我已经用这种方式设置了一些东西,并且在web部署脚本中不需要任何密码。
为Web部署设置Windows身份validation: http : //blogs.iis.net/carlosag/archive/2011/12/13/using-windows-authentication-with-web-deploy-and-wmsvc.aspx