On Monday, 25 July 2016 10:13:12 UTC+2, Varsha Varadarajan wrote:
>
> Hey, 
>
> I am trying to understand why you have set up the pipelines the way you 
> have. You have an upstream pipeline "BuildCore" and another pipeline 
> "BuildApp" dependent on 'BuildCore' and a git material 'repo' is common to 
> both. If your intention is to trigger the BuildCore for certain changes and 
> BuildApp for the rest of the changes in 'repo', can you please explain why 
> 'BuildApp' should be dependent on 'BuildCore'? 
>

"repo/core" builds an artifact that is used by the application - a common 
library. This path is not updated that regularly. This library is also used 
by other pipelines. A new build of "Core" takes quite a long time..
"repo/app" builds an app that uses the core library. It is updated 
regularly, and builds relatively quickly.

If a developer commits to "repo/app" on a daily basis the idea is to 
rebuild the app with the latest version of core - by this I mean compile 
the latest commit under "repo/app" path against the library built by the 
latest commit to "repo/core" path). Rebuilding "Core" for each "app" commit 
takes time and results in the same artifact being generated (as nothing in 
the core path has changed) - it slows down our CD process.  I want to 
quickly build new revisions of app against 1 revision of core, unless core 
is updated.
 

>
> Thank you.
>
> On Monday, 25 July 2016 13:17:53 UTC+5:30, Brett Cave wrote:
>>
>>
>>
>> On Monday, 25 July 2016 08:50:07 UTC+2, Varsha Varadarajan wrote:
>>>
>>> The scenario:
>>>>
>>>>
>>>>    - A git repository "repo" with "core" and "app" root paths.
>>>>    - A "BuildCore" pipeline that uses "repo" with a whitelist on 
>>>>    "core/*" - triggers automatically
>>>>    - A "BuildApp" pipeline that uses "repo" with a blacklist on 
>>>>    "core/*" and an upstream pipeline dependency / material on "BuildCore" 
>>>> - 
>>>>    triggers automatically
>>>>    
>>>> The bug is that it seems like Go traces its upstream pipelines' 
>>>> materials and if a common material is found, the downstream pipeline will 
>>>> wait for the upstream pipeline to finish before triggering.
>>>>
>>>>
>>>>
>>> Given that the pipeline BuildApp is dependent on the git repository 
>>> 'repo' and pipeline 'BuildCore', any *valid* change in either materials 
>>> will trigger 'BuildApp'. In this scenario, a valid change is any change to 
>>> 'core/*'.
>>> If you observe the build cause for BuildApp, when a commit is made in 
>>> 'core/*', the build cause will only list the 'BuildCore' as the reason for 
>>> the trigger. 
>>> It may seem that it is a violation of the blacklist in BuildApp, but a 
>>> change in core/* is not the direct reason for BuildApp being triggered. It 
>>> is the expected behaviour.  
>>>
>>
>> I know it is the expected behaviour, but this behaviour could be improved 
>> to better suit build requirements.
>>
>> If I were to move the "core" and "app" paths to different repos, with 
>> "core" repo at revision "c01" and "app" repo at revision "a01", then I have 
>> a nice workflow in Go, the way it was designed:
>>  - If I commit "#c02" to the "core" repo, BuildCore will trigger. The new 
>> "#c02" build of BuildCore will trigger BuildApp with the old "#a01" 
>> revision from "app". 
>>  - If I commit "#a02" to the "app" repo, the AppBuild pipeline will build 
>> "#a02" with "#c02". Subsequent commits to the app repo will build "#a03", 
>> "#a04", etc with "#c02"
>>
>> This workflow is not possible when using paths in 1 repo for different 
>> pipelines. I'm suggesting this is a shortfall in the workflow design - 
>> something that could be improved to give the same flow in a monolithic repo 
>> structure. The fan-in algorithm should not only trace materials, but also 
>> factor in black / whitelists as part of the algorithm.
>>
>> I am able to work around this and get the desired workflow by using a 
>> different hostname for the same repo in the 2 pipelines.
>>
>>  
>>
>>>
>>> In this scenario, if a commit is pushed to "app/foo", both BuildCore and 
>>>> BuildApp detect the new "repo" material. BuildCore doesn't trigger because 
>>>> only "core" is in its whitelist ("app/foo" is blacklisted). BuildApp finds 
>>>> the change, but doesn't trigger because it sees that BuildCore also uses 
>>>> the "repo" material and wants to wait for it to trigger and finish - it 
>>>> doesn't realize that BuildCore will not trigger due to the blacklist - 
>>>> BuildApp never triggers automatically. I'd imagine that it's only when I 
>>>> push to "core/bar" that BuildCore would trigger and that would then kick 
>>>> off BuildApp...
>>>>
>>>
>>> Since BuildApp is dependent on BuildCore and git repository 'repo', the 
>>> fan-in algorithm kicks in where it tries to find a compatible revision with 
>>> both the git material 'repo' and BuildCore. Since it cannot find that 
>>> BuildCore has been run with "app/foo", BuildApp will never get triggered. 
>>> This behaviour exists irrespective of the blacklist and whitelist feature. 
>>> And, because of the fan-in algorithm, the only valid change for BuildApp, 
>>> as mentioned above to be triggered is any change to 'core/*' only.
>>>  
>>>
>>>>
>>>> I now either need to remove the black / white lists and build BuildCore 
>>>> for all commits or trigger manually. I'd imagine a solution to this is 
>>>> that 
>>>> BuildApp should not only check if "repo" is an upstream of "BuildCore" but 
>>>> should also ensure that the new "repo" material is not blacklisted 
>>>> there....
>>>>
>>>
>>> Yes, that is correct.
>>> The whitelist on the upstream pipeline "BuildCore" is respected even in 
>>> BuildApp because of the dependency.  A workaround would be to remove the 
>>> whitelist in "BuildCore". However, keep in mind once the whitelist is 
>>> removed, the blacklist in downstream "BuildApp" will not be respected (that 
>>> is, blacklist on "BuildApp" is useless in this scenario to have) as any 
>>> change triggering "BuildCore" will end up triggering "BuildApp" anyway. 
>>>
>>> Thank You.
>>> Varsha
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"go-cd" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to