使用Octopus Deploy和EPiServer来处理数据库升级

时间:2017-02-21 15:51:34

标签: automation episerver octopus-deploy

由于EPiServer 7升级到更新版本涉及:

  1. 更新所有EPiServerPackage NuGet包
  2. 正在运行/EPiUpdatePackage - 升级本地数据库
  3. 运行Export-EPiServer - 生成一组可在其他服务器上运行的数据库升级脚本文件。
  4. 但是,如果Octopus Deploy仅构建和部署升级的EPiServer解决方案,则不会升级数据库,这意味着该站点将无法运行。

    目前,我在部署后在每个环境中的服务器上运行<iframe width="560" height="315" src="https://www.youtube.com/embed/h-FjYkSBuNM" frameborder="0" allowfullscreen></iframe> 手动

    我试图确定最简洁的方法来包含 class QuesAnsFeedTableViewCell: UITableViewCell { override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setup() } override func layoutSubviews() { super.layoutSubviews() self.questionLabel.preferredMaxLayoutWidth = questionLabel.frame.width self.answerLabel.preferredMaxLayoutWidth = answerLabel.frame.width super.layoutSubviews() } func setup(){ topLeftLabel = UILabel() topLeftLabel.font = UIFont(name: regularFont, size: 12) topLeftLabel.text = "Yesterday" topLeftLabel.textColor = CommonFunctions.hexStringToUIColor(hex: lightGray) topRightLabel = UILabel() topRightLabel.font = UIFont(name: regularFont, size: 12) topRightLabel.textColor = CommonFunctions.hexStringToUIColor(hex: lightGray) topRightLabel.text = "" topRightLabel.textAlignment = .right questionLabel = UILabel() questionLabel.font = UIFont(name: mediumFont, size: 14) questionLabel.text = "First Ques Comes Here and ans will be below this question" questionLabel.numberOfLines = 0 questionLabel.lineBreakMode = .byWordWrapping userImageView = UIImageView() userImageView.backgroundColor = .purple userImageView.layer.cornerRadius = CGFloat(sidePadding)/2 userImageView.clipsToBounds = true userNameLabel = UILabel() userNameLabel.font = UIFont(name: regularFont, size: 12) userNameLabel.text = "" answerLabel = UILabel() answerLabel.font = UIFont(name: regularFont, size: 14) answerLabel.text = "" answerLabel.numberOfLines = 0 answerLabel.lineBreakMode = .byWordWrapping viewOtherAnswerLabel = UILabel() viewOtherAnswerLabel.font = UIFont(name: mediumFont, size: 12) viewOtherAnswerLabel.text = "" viewOtherAnswerLabel.textAlignment = .center viewOtherAnswerLabel.textColor = CommonFunctions.hexStringToUIColor(hex: lightGray) writeAnswerLabel = UILabel() writeAnswerLabel.font = UIFont(name: mediumFont, size: 14) writeAnswerLabel.backgroundColor = CommonFunctions.hexStringToUIColor(hex: crispBlue) writeAnswerLabel.text = "Write Answer" writeAnswerLabel.textAlignment = .center writeAnswerLabel.textColor = .white tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tappedCell(sender:))) tapGesture.numberOfTapsRequired = 1 self.addGestureRecognizer(tapGesture) // self.addSubview(likeButton) // self.addSubview(descriptionLabel) } func updateData(data:NSDictionary) -> CGFloat{ if let viewCount = data["vc"] { topRightLabel.text = "\(viewCount) read" } if let ques = data["q"] as? String{ topLeftLabel.frame = CGRect(x:sidePadding/2, y: 2*sidePaddingForCollectionCells, width: screenWidth/2-sidePadding, height: Int(CommonFunctions.calculateHeight(inString: topLeftLabel.text!, forFont: topLeftLabel.font, andWidthOfLabel: CGFloat(screenWidth/2)))) topRightLabel.frame = CGRect(x: screenWidth/2, y: 2*sidePaddingForCollectionCells, width: screenWidth/2-sidePadding/2, height: Int(topLeftLabel.frame.height)) let newHeight = CommonFunctions.calculateHeight(inString: ques,forFont:questionLabel.font,andWidthOfLabel:questionLabel.frame.width) questionLabel.frame = CGRect(x:sidePadding/2 ,y: Int(topLeftLabel.frame.maxY)+sidePaddingForCollectionCells,width: screenWidth - sidePadding, height: Int(ceil(Float(newHeight)))) questionLabel.text = ques self.addSubview(topLeftLabel) self.addSubview(topRightLabel) self.addSubview(questionLabel) // questionLabel.attributedText = CommonFunctions.justifiedText(string: ques) } if let user = data.object(forKey: "user") as? NSDictionary{ if let usrName = user.value(forKey: "name"){ userNameLabel.text = "\(usrName)" } if let imgLink = user["image"] as? String{ if let url = URL(string: imgLink){ userImageView.sd_setImage(with: url,placeholderImage:#imageLiteral(resourceName: "placeholderImage")) } } } if let otherAnswer = data.value(forKey: "cc") { viewOtherAnswerLabel.text = "View Other Answer \(otherAnswer)" } if let ans = data.value(forKey: "comt") as? String{ answered = true userImageView.frame = CGRect(x: sidePadding/2, y: Int(questionLabel.frame.maxY)+2*sidePaddingForCollectionCells, width: sidePadding, height: sidePadding) userNameLabel.frame = CGRect(x: 3*sidePadding/2+2*sidePaddingForCollectionCells, y:Int(questionLabel.frame.maxY)+sidePaddingForCollectionCells, width: screenWidth-2*sidePadding, height: Int(topLeftLabel.frame.height)) let newHeight = CommonFunctions.calculateHeight(inString: ans,forFont:answerLabel.font,andWidthOfLabel:answerLabel.frame.width) let frame = CGRect(x: 3*sidePadding/2+2*sidePaddingForCollectionCells, y:Int(userNameLabel.frame.maxY) + sidePaddingForCollectionCells, width: screenWidth-2*sidePadding-2*sidePaddingForCollectionCells, height: Int(ceil(Float(newHeight)))) answerLabel.frame = frame answerLabel.text = ans viewOtherAnswerLabel.frame = CGRect(x: 0, y: Int(answerLabel.frame.maxY)+2*sidePaddingForCollectionCells, width: screenWidth, height: 2*sidePadding/3) self.addSubview(userImageView) self.addSubview(userNameLabel) self.addSubview(answerLabel) self.addSubview(viewOtherAnswerLabel) writeAnswerLabel.removeFromSuperview() return viewOtherAnswerLabel.frame.maxY } else{ answered = false writeAnswerLabel.frame = CGRect(x: 0, y:Int(questionLabel.frame.maxY) + 2*sidePaddingForCollectionCells, width: screenWidth, height: sidePadding) self.addSubview(writeAnswerLabel) userImageView.removeFromSuperview() userNameLabel.removeFromSuperview() answerLabel.removeFromSuperview() viewOtherAnswerLabel.removeFromSuperview() return writeAnswerLabel.frame.maxY } } 文件夹和运行class GenericView: UIView ,UITableViewDelegate,UITableViewDataSource { var tableView:UITableView! var viewFrame = CGRect() var parentView = "" var discussViewHeight = [Int:CGFloat]() var nextUrlPath = "" var currentUrlPath = "" private var sliderLabelsText = ["Favourites","Sign In"] private var tableBlocks = [NSDictionary]() override init(frame: CGRect) { super.init(frame: frame) viewFrame = frame setup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) if viewFrame != CGRect() { setup() } } public func updateView(){ viewFrame = self.frame tableView.frame = (viewFrame) getRequest() } func getRequest(){ currentUrlPath = baseUrl+nextUrlPath if parentView == discussView{ // let url = baseUrl + nextUrlPath Alamofire.request(currentUrlPath).responseJSON { response in if let dict = response.result.value as? [String:AnyObject]{ if (dict["msc"]) as? String == "700", let blocks = dict["blocks"] as? NSArray{ self.nextUrlPath = (dict["next"] as? String ?? "") for block in blocks{ if let blk = block as? NSDictionary{ if blk.value(forKey: "ty") as? String == "qa"{ self.tableBlocks.append(blk) } appDelegate.tableBlocks.append(blk) } } DispatchQueue.main.async(execute: { () -> Void in self.refreshControl.endRefreshing() self.tableView.reloadData() }) } else{ DispatchQueue.main.async(execute: { () -> Void in self.currentUrlPath = "" self.getRequest() }) } } } return } } func setup(){ backgroundColor = UIColor.white tableView = UITableView(frame: viewFrame, style: .grouped) tableView.delegate = self tableView.dataSource = self self.addSubview(tableView) registerCells() } //MARK: TableView DataSource Methods func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if parentView == discussView{ return 1 } return 0 } func numberOfSections(in tableView: UITableView) -> Int { if parentView == discussView{ return tableBlocks.count } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if (parentView == discussView){ var cell:QuesAnsFeedTableViewCell? = tableView.dequeueReusableCell(withIdentifier: quesAnsFeedViewCellIdentifier, for: indexPath) as? QuesAnsFeedTableViewCell if (cell == nil){ cell = QuesAnsFeedTableViewCell(style: .default, reuseIdentifier: quesAnsFeedViewCellIdentifier) } cell?.selectionStyle = .none discussViewHeight[indexPath.section] = (cell?.updateData(data: tableBlocks[indexPath.section]))! cell?.setNeedsLayout() cell?.layoutIfNeeded() return cell! } return UITableViewCell() } //MARK: TableView Delegate Methods func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if parentView == discussView{ return discussViewHeight[indexPath.section] ?? 0 } return 0 } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if parentView == discussView{ return sectionHeaderView } return UIView() } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if parentView == discussView && indexPath.section+5 > tableBlocks.count{ if currentUrlPath != baseUrl + nextUrlPath{ getRequest() } } } } 命令的内容生成,以便它将:

    • 签入源代码管理
    • 在构建服务器
    • 上变成了一个NuGet包
    • Octopus Deploy 部署,以便可以在部署脚本的服务器上远程执行

1 个答案:

答案 0 :(得分:1)

根据Eric Herlitz的建议,我只是在<episerver.framework updateDatabaseSchema="true">转换中使用了web.config用于我希望自动升级数据库的环境。

如果SQL连接字符串用户没有所需的权限级别,我不确定这会出现问题。但在我的情况下,这是正常的。