Hi Joel,

I think the missing piece may be that *#{UPSTREAM_BUILD_PIPELINE} *does not 
need to be a direct parent of the Pipeline where the Fetch Artifact Task 
resides.

I recommend the following changes to Pipeline C:

   1. Change the value of *#{UPSTREAM_BUILD_PIPELINE}* from *Pipeline A* to 
*Pipeline 
   A/Pipeline B*.
   2. Remove the *Pipeline A* Material.

I modified your original XML document to show what I mean.

Hope this helps,
Jason

On Friday, 27 November 2020 at 10:43:15 UTC-5 [email protected] wrote:

> Thank you for your reply, Ketan.
>
> I've come across the fan-in & fan-out capabilities - which is one of the 
> main reasons I decided to give GoCD a try and hopefully switch to it 
> eventually.
> I've read the documentation you've linked prior to creating this 
> conversation. However, I'm unclear as to how to modify my pipeline C (or 
> rather template T_C) so there's no more explicit dependency on the upstream 
> pipeline. In my opinion I did this by having the *Fetch Artifact* task in 
> T_C which allows C which uses T_C to specify the upstream pipeline with 
> *#{UPSTREAM_BUILD_PIPELINE}*.
> What am I missing / doing wrong?
>
> In my pipeline C -> Materials I am unable to remove the dependency to the 
> upstream build pipeline A. As far as I can tell this has been added 
> automatically when creating pipeline A from template T_A as T_A requires 
> the *#{UPSTREAM_BUILD_PIPELINE}* parameter for the *Fetch Artifact* task.
>
> ~ Joel
>
>
> On Friday, November 27, 2020 at 4:16:38 PM UTC+1 [email protected] 
> wrote:
>
>> If pipeline "C" requires a binary from "A", there's no need to add an 
>> explicit dependency. You can specify an upstream pipeline as part of your 
>> fetch artifact task.
>>
>> In either case, C should not trigger twice. Pipeline C should wait for B 
>> to be complete before kicking off.
>>
>> Also — what you're looking at is called "fan-in" in gocd terminology. This 
>> document <https://docs.gocd.org/current/advanced_usage/fan_in.html> 
>> might help.
>>
>> - Ketan
>>
>>
>>
>> On Fri, Nov 27, 2020 at 7:47 PM Joel Bodenmann <[email protected]> wrote:
>>
>>> Hello folks,
>>>
>>> Consider the following scenario:
>>>
>>>    - Template *T_A*: Builds some binaries and stores them as an 
>>>    artifact.
>>>    - Template *T_B*: Fetches binaries from the upstream pipeline *T_A *and 
>>>    runs tests. To achieve this,  *T_B* has a *Fetch Artifact *task with 
>>>    the upstream pipeline as a parameter *#{UPSTREAM_BUILD_PIPELINE}.*
>>>    - Template *T_C*: Fetches binaries from upstream pipeline *T_A* and 
>>>    creates packages. To achieve this,  *T_C* has a *Fetch Artifact *task 
>>>    with the upstream pipeline as a parameter 
>>>    *#{UPSTREAM_BUILD_PIPELINE}.*
>>>    - Pipeline *A*: Uses template *T_A*.
>>>    - Pipeline *B*: Uses template *T_B**. *Sets *UPSTREAM_BUILD_PIPELINE  
>>>    *to pipeline *A.*
>>>    - Pipeline *C*: Uses template *T_C*. Sets *UPSTREAM_BUILD_PIPELINE  *
>>>    to pipeline *A.*
>>>
>>> This results in the following VSM:
>>>
>>>
>>> The problem I have is that pipeline C will be triggered twice: Once 
>>> after A finishes and once after B finishes. The expected behavior (or the 
>>> behavior I wish to achieve) is that C will only run after B finishes 
>>> successfully.
>>>
>>> How can I make sure that C only runs after successful completion of B 
>>> (and therefore implicitly A)?
>>>
>>> Attached is the corresponding XML fragment of my templates & pipelines 
>>> where:
>>>
>>>    - *T_A -> Build-CMake-OS-Compiler*
>>>    - *T_B -> Test-OS*
>>>    - *T_C -> Package-OS*
>>>    - *A -> GPDS-Build-FreeBSD-GCC*
>>>    - *B -> GPDS-Test-FreeBSD-GCC*
>>>    - *C -> GPDS-Package-FreeBSD*
>>>
>>> -- 
>>> 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].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/go-cd/0a8a6dc4-0b49-4036-a573-44d0feca32b9n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/go-cd/0a8a6dc4-0b49-4036-a573-44d0feca32b9n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/go-cd/b3e4e221-1a00-424a-9d51-fef13e885b7fn%40googlegroups.com.
  <pipelines group="GPDS">
    <pipeline name="GPDS-Build-FreeBSD-GCC" template="Build-CMake-OS-Compiler">
      <params>
        <param name="COMPILER_SUITE">gcc</param>
        <param name="OS">FreeBSD</param>
        <param name="CMAKE_CXX_COMPILER">g++10</param>
        <param name="CMAKE_GENERATOR">Unix Makefiles</param>
        <param name="CMAKE_C_COMPILER">gcc10</param>
        <param name="NUM_JOBS">4</param>
      </params>
      <materials>
        <git url="https://github.com/simulton/gpds"; />
      </materials>
    </pipeline>

    <pipeline name="GPDS-Test-FreeBSD-GCC" template="Test-OS">
      <params>
        <param name="TEST_BIN">build/test/gpds-tests</param>
        <param name="OS">FreeBSD</param>
        <param name="UPSTREAM_BUILD_PIPELINE">GPDS-Build-FreeBSD-GCC</param>
      </params>
      <materials>
        <pipeline pipelineName="GPDS-Build-FreeBSD-GCC" stageName="Build" />
      </materials>
    </pipeline>

    <pipeline name="GPDS-Package-FreeBSD" template="Package-OS">
      <params>
        <param name="UPSTREAM_BUILD_PIPELINE">GPDS-Build-FreeBSD-GCC/GPDS-Test-FreeBSD-GCC</param>
        <param name="OS">FreeBSD</param>
      </params>
      <materials>
        <pipeline pipelineName="GPDS-Test-FreeBSD-GCC" stageName="Run" />
      </materials>
    </pipeline>
  </pipelines>

  <templates>
    <pipeline name="Build-CMake-OS-Compiler">
      <stage name="Build">
        <jobs>
          <job name="Build">
            <tasks>
              <exec command="mkdir">
                <arg>build</arg>
                <runif status="passed" />
              </exec>
              <exec command="cmake" workingdir="build">
                <arg>-G</arg>
                <arg>#{CMAKE_GENERATOR}</arg>
                <arg>-DCMAKE_C_COMPILER=#{CMAKE_C_COMPILER}</arg>
                <arg>-DCMAKE_CXX_COMPILER=#{CMAKE_CXX_COMPILER}</arg>
                <arg>..</arg>
                <runif status="passed" />
              </exec>
              <exec command="make" workingdir="build">
                <arg>-j#{NUM_JOBS}</arg>
                <runif status="passed" />
              </exec>
            </tasks>
            <resources>
              <resource>#{OS}</resource>
              <resource>#{COMPILER_SUITE}</resource>
            </resources>
            <artifacts>
              <artifact type="build" src="build" />
            </artifacts>
          </job>
        </jobs>
      </stage>
    </pipeline>

    <pipeline name="Test-OS">
      <stage name="Run">
        <approval type="success" allowOnlyOnSuccess="true" />
        <jobs>
          <job name="Run">
            <tasks>
              <fetchartifact artifactOrigin="gocd" srcdir="build" pipeline="#{UPSTREAM_BUILD_PIPELINE}" stage="Build" job="Build">
                <runif status="passed" />
              </fetchartifact>
              <exec command="chmod">
                <arg>+x</arg>
                <arg>#{TEST_BIN}</arg>
                <runif status="passed" />
              </exec>
              <exec command="#{TEST_BIN}">
                <runif status="passed" />
              </exec>
            </tasks>
            <resources>
              <resource>#{OS}</resource>
            </resources>
          </job>
        </jobs>
      </stage>
    </pipeline>

    <pipeline name="Package-OS">
      <stage name="Generate">
        <jobs>
          <job name="Installer">
            <tasks>
              <fetchartifact artifactOrigin="gocd" srcdir="build" pipeline="#{UPSTREAM_BUILD_PIPELINE}" stage="Build" job="Build">
                <runif status="passed" />
              </fetchartifact>
              <exec command="ls" workingdir="build">
                <arg>-lhs</arg>
                <runif status="passed" />
              </exec>
            </tasks>
            <resources>
              <resource>#{OS}</resource>
            </resources>
          </job>
        </jobs>
      </stage>
    </pipeline>

  </templates>

Reply via email to