Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

We have a small scrum-team which develops a webseite with a lot of users. We would like to improve our development and relase/deployment process, but there are a lot of concepts out there, which in our eyes don't fit together perfectly. Since we're not the only company developing a website, I thought it might be a good idea to ask here ;)

First of all, the software is not in good shape, so things like continuous delivery or continuous depoloyment are not possible because of bad test coverage and that's nothing we can change soon.

We have two-week sprints, so we develop new features or resolve bugs in that period, after the final sprint meeting we merge the feature branches into master (we use feature branches in git and pull-request for review and merging), do some testing, and deploy master to a public beta enveriment. There we usually find some bugs, resolve them and after that we deploy master inckuding beta fixes to the production enviroment. After that we start with our next sprint.

But that process is far from being perfect. First of all it's difficult to show features with all those branches in our sprint review meeting, and because we only have one master branch which gets deployed, we can't easyly deploy hotfixes to different enviroments. Sometimes we need more time for testing in our beta enviroment, so we can't merge new features to master, or same for production, once deployed, we can't deploy hotfixes if we are already testing new features on beta. If we expect bugs in beta or production due to larger changes, development has too keep feature branches for a longer period, so merging feature branches later on becomes more and more painful.

First we thought about long running branches, like master for development, production and beta. So we could merge whatever feature we want into one of the thre branches. But we really like to work with pull requests (reviews, feedback and deleting feature branch after merging), it's really nice to work with, but we can only apply a pull-request branch to one other branch. So here, we could merge to master without deleting the branch, and have to swithc to another tool to merge a feature to beta or production, or create new pull requests for beta and production. It works that way, but its not such a nice workflow as only merging to one master branch.

We also thought about git-flow (Vincent Driessen's branching model), which looks nice, but it seems to be better suited to software with traditional release cycles and versioning, not 100% for web aplications, which have no real versions but deploy everything which is ready after a sprint. It solves the hotfix problems, has an extra develop branch, but it requirs release-versions. So we could create a release branch, get problems sorted out, release it to production and delete the release branch. We could open a pull request for merging into master with the release branch, but problems start if we want to release it to beta (we use capistrano for deployment), because the branch changes every sprint. And what if we want to test features in our beta enviroment? We could use the release branch for beta, but this way a release to production has to wait until all features in the release/beta branch are ready. If testing of large features takes long, we can't upload small updates to production.

Next problem is versioning. We use jira and jira likes to use versions for releases. We could use versions like "1,2,3"..., but should one sprint be one version? Doesn't feel right, because sprint planning is not the same as release planning, or should it be the same when developing a web application? Because sometimes we develop featurs in a sprint, which take longer and are released later after being completed in the next 1-2 sprints. With git-flow, this changes could not be merged to develop until they are ready, because every release is branched from develop branch. So this way, some feature branches are not merged for a long time and merging them becomes more and more difficult. It's the opposite of continuous integration.

And last but not least, the deployment and QA process does not fit to scrum so very much, we don't have an own web operations team, when a sprint is ready, the product owner has to review the stories, we have to test them, deploy them to beta/production, and have to fix the problems in it immediately, which also interrupts or next sprint. We are not sure when is the right time to merge the feature branches? Before review meeting? This way we could have merged features which are not accepted by the product owner into the branch which should be released soon, but if we don't merge them, we have to demonstrate each feature in it's own branch and merge every accepted feaure branch, so integration and testing could only start after the sprint review meeting. Integration and testing could take days and needs development resources, so when should the next sprint start? After release to production? But this way we could not start a sprint every two weeks, and not every developer is needed for integrating and QA, so what should they work on? Currently we start the planning meeting for the next sprint immidiatly after the review meeting of the last sprint, but if we do it this way we are not sure how many time we need for the release which draws resources from the sprint...

So how do you release web applications? What workflow do you use? What's the best way if we want to integrate pull requests in the workflow? How do you integrate QA and deployment into the scrum workflow?

best regards Andreas

share|improve this question
    
I certainly appreciate the effort behind your post, but you're bringing up way too many issues for a single question! Please read the faq for guidelines on how to ask questions. Please consider breaking this into several individual questions. –  Bob Kaufman May 28 '13 at 21:22
    
The problem is, that all those problem interfere with each other. Do you have an idea how to seperate them in different areas? –  ak2 May 28 '13 at 21:35
add comment

2 Answers

Regarding QA and deployment, I suggest the following:

  • Commit your code early to the main branch, and commit often. I am totally unfamiliar with git so I can't comment on how you're using it but I've always worked off the main trunk (using Subversion) with all the developers committing new code to the trunk. When we create a release we branch the trunk to create a release branch.
  • If you haven't done so already then set up a continuous integration system (we use TeamCity, but it'll depend to some degree on your stack). Get what unit tests you do have running at each commit.
  • Create a definition of 'done' and use it. This will stop you from being in the situation of testing features implemented during the previous sprint. Make sure your definition of done includes the passing of acceptance tests that have been co-written by your Product Owner, in my opinion the PO should not be rejecting features during the Sprint Review.
share|improve this answer
    
committing early and often does not fit well to feature branching, where we develop one feature in a seperate branch. We use pull requests as you might know from github to integrate a feature into the master branch. We use a CI server which runs our tests every few minutes on the master branch. You're right with definition of done, we should improve here to finish testing and reviewing earlier, before a sprint ends. Thanks a lot for your feedback! –  ak2 Jun 30 '13 at 20:52
add comment

I try to make a backlog and prioritize it:

Prio 1: Refit you Definition of Done.

I think you are betraying yourself how many features you can develop in a sprint. Scrums defines the result of an sprint as "useful increment of software". What you do is to produce a "testable increment of software". You have to include the test into the sprint. All stories that are not tested and have a "production ready" stamp on it, are simply not DONE.

Prio 1: Do your retrospectives

Get the team together and talk about this release mess. You need a lightweight way to test stories. You and your team knows best what's available and what is hindering you. If you already doing those retrospectives, this one is done. ;)

Prio 1: Automated Tests

How can you get any story done without UnitTests? Start making them. I would propose that you search for the most delicate/important component in the system and bring test coverage (ECLemma helps) up to at least 60% for this component. Commit a whole sprint to this. I don't know your DOD, but this is work that has been procrastinated and has to be redone. If a manager tells you its impossible, remind him of the good old waterfall days, where 2 weeks of development have not raised his eyebrow, why should it now...

Prio 2: Integration testing

You have Unit-Tests in place and you do some additional manual testing in the sprints. What you want is to include the integration test (merging with master) to the sprint.

This has to happen, because you have to(!) solve the bugs in the sprint they have been introduced. So a early integration has to happen. To get there it is important that during a sprint you work by priorities: The highest prio task/Story has to be solved by the whole team first. Goal is, to have it coded and unit tested, then you hand it over to your tester for smoke testing. Bugs found have the prio of the story. When it works good enough this part is deployed to the integration and tested there. (Of course most of the time, not all team members can work effectively on 1 story. So one other story is processed in parallel. But whenever something stops your Prio1 Story, the whole team has to help there.)

Prio 2: Reduce new features increase Quality

To include more quality you have to lower expectations regarding amount of new features. Work harder is not what scrum tells you. It tells you to deliver more quality because this will speed up your development in mid term.

share|improve this answer
    
you are right with your critics on our definition of done, we will improve it to get features ready for release earlier. But it's not that easy, because some stories need more testing, perhaps also with beta users in a staging environment. Would you integrate that into definition of done? Automated tests is really difficult, its a lot of legacy code, which is in many parts not even OOP and mixes template-code with business logic. We replace more and more of it, but replacing all of it would take a year or more. With bugs, we often need beta testers to learn about bugs (many different settings) –  ak2 Jun 30 '13 at 21:04
    
thanks a lot for your long answer, was quite helpful! –  ak2 Jun 30 '13 at 21:05
    
regarding your lack on unit tests. Just watch this video: youtube.com/watch?v=_NnElPO5BU0 Maybe it helps/motivates you to refactor some legacy code and correct the lack of tests on the way. This video is really great. I never thought I would watch it completely but I did. Se TDD on legacy code! –  KFleischer Jul 10 '13 at 14:16
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.