TFS 2018内部部署如何构建和部署多个租户站点

时间:2018-04-06 18:46:52

标签: tfs visual-studio-2017 filtering continuous-deployment tfs2018

使用内部部署TFS 2018.寻找建议并使用以下结构将多个租户部署到IIS的建议。我们正在使用GIT进行源代码控制。

每个租户都是一个定制的克隆' .Net Core 2.0网站。它通过程序集共享一些基本功能,但提供每个租户自定义。 每个租户都有自己的Visual Studio 2017 sln和csproj文件。目前,该解决方案直接引用了共享程序集(因为我们尚未使用nuget作为共享程序集)。

结构是:

import React from 'react'

export default class Pagination extends React.Component {
  constructor() {
    super();


    const peoples =[{id:0, name:"a"},
      {id:1, name:"b"},
      {id:2, name:"c"},
      {id:3, name:"d"},
      {id:4, name:"e"},
      {id:5, name:"f"},
      {id:6, name:"gg"},
      {id:7, name:"ff"},
      {id:8, name:"fg"},
      {id:9, name:"de"},
      {id:10, name:"gf"},
      {id:11, name:"gh"}];

    this.state = {
      elementsPerPage:3,
      currentPage:0,
      peoples,
      input: "",
      filtered: peoples,
    };

    this.nextPage = this.nextPage.bind(this);
    this.previousPage = this.previousPage.bind(this);
    this.filterNames = this.filterNames.bind(this);
    this.getValueInput = this.getValueInput.bind(this);
  }

    getValueInput (value) {
    this.setState({ input: value.target.value });
  }

  handledelTodoItem=(v)=>{
    console.log(v);
    let { filtered } = this.state; // changed const to let
// removed the return statement

// the code here was wrong. The function below will delete the element with The
// id that was passed to it from the array filtered.
// then the state is changed to the new array.
    filtered.splice(filtered.map(e => e.id).indexOf(v.id),1)

    this.setState({
      filtered:filtered
    })
  }

  filterNames (){
  const {peoples} = this.state;
   this.setState({
      filtered: peoples.filter(item => item.name.includes(this.state.input)),
      currentPage:0})
  }


  elementsOnScreen() {
    const {elementsPerPage, currentPage, filtered} = this.state;
    return filtered
      .map((item) => <li key={item.id}>{item.name}</li>)
      .slice(currentPage*elementsPerPage, currentPage*elementsPerPage + elementsPerPage);
  }

 nextPage() {
         console.log(this.state.filtered)

    const {elementsPerPage, currentPage, filtered} = this.state;

    if ((currentPage+1) * elementsPerPage < filtered.length){
      this.setState({ currentPage: this.state.currentPage + 1 });
    }
  }

    previousPage () {
      const { currentPage } = this.state;
      if(currentPage - 1 >= 0){
         this.setState({ currentPage: this.state.currentPage - 1 });
      }

  }

  render() {
    console.log(this.state);
     let { filtered } = this.state;
    return (
      <div>
        <input type="text" onChange={ this.getValueInput }></input>
        <button className='search' onClick={this.filterNames}> Search </button>
        <button onClick={this.previousPage}> Previous </button>
        <button onClick={this.nextPage}> Next </button>
        <h3>Current Page: {this.state.currentPage}</h3>
        <ul>Names: {this.elementsOnScreen()}</ul>
        {filtered.map((v) => {
          return <div key={v.id}><h1 className="font" ><button className="allbutton" onClick={this.handledelTodoItem.bind(this, v)}>DelTodoItem</button>{v.name}</h1></div>
        })}
      </div>
    );
  }
}

我感兴趣的是如何部署(通过持续部署)1)在项目级别进行更改的租户,以及2)使用已更改的共享程序集的租户的建议。

我们有可能让我们的租户变得非常大,所以我们不希望在每个版本上部署所有租户。

有没有办法过滤,所以我们只部署有变化的租户?

由于

1 个答案:

答案 0 :(得分:0)

一种选择是为每个租户使用单独的环境,并添加批准以部署到环境中。

其他选项可以有一个环境和多个阶段,每个租户一个。我更喜欢第一个。

另一个可能是拥有一个文件并创建一个powershell脚本来为每个租户创建一个循环并进行部署。这个实现起来比较复杂。