{"id":628555,"date":"2025-06-04T12:56:43","date_gmt":"2025-06-04T10:56:43","guid":{"rendered":"https:\/\/www.devoteam.com\/?post_type=expert-view&#038;p=628555"},"modified":"2025-06-04T12:59:38","modified_gmt":"2025-06-04T10:59:38","slug":"pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias","status":"publish","type":"expert-view","link":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/","title":{"rendered":"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\" id=\"h-descubra-como-gerir-dependencias-com-cloud-workflows-utilizando-o-google-cloud-apis-e-sensores-inteligentes\">Descubra como gerir depend\u00eancias com Cloud <em>Workflows <\/em>utilizando o Google Cloud APIs e sensores inteligentes<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Introdu\u00e7\u00e3o<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Gerir as depend\u00eancias entre v\u00e1rios <em>workflows <\/em>\u00e9 um desafio comum em <em>pipelines <\/em>de dados complexos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta publica\u00e7\u00e3o demonstra como utilizar a Cloud Workflows e o Google Cloud APIs para orquestrar processos complexos, destacando os benef\u00edcios de dividir <em>workloads <\/em>em <em>workflows <\/em>separados para melhorar a modularidade, a otimiza\u00e7\u00e3o dos custos e a resili\u00eancia.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embora o pre\u00e7o da Cloud Workflows seja baseado no n\u00famero de etapas executadas, as vantagens de um <em>pipeline <\/em>bem orquestrado ultrapassam de longe qualquer pequeno aumento de custos.&nbsp;<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Antes de come\u00e7ar:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>J\u00e1 deve ter o Cloud Workflows a funcionar corretamente no seu projeto de GCP.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-funcoes-do-utilizador\"><strong>Fun\u00e7\u00f5es do utilizador:<\/strong><\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Workflows Editor<\/em><\/strong><strong>:<\/strong>&nbsp; Esta fun\u00e7\u00e3o permite-lhe criar, editar e implementar <em>workflows<\/em>.<\/li>\n\n\n\n<li><strong><em>Workflows Invoker:<\/em><\/strong><em> <\/em>Esta fun\u00e7\u00e3o permite-lhe executar <em>(run)<\/em> <em>workflows<\/em>.<\/li>\n\n\n\n<li><strong><em>Logging Viewer:<\/em><\/strong> Esta fun\u00e7\u00e3o permite-lhe ler e visualizar <em>logs<\/em>.&nbsp;<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-funcoes-da-service-account\"><strong>Fun\u00e7\u00f5es da <\/strong><strong><em>service account<\/em><\/strong>:<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Workflows Invoker<\/em><\/strong><\/li>\n\n\n\n<li><strong><em>Logging Log Writer<\/em><\/strong><\/li>\n\n\n\n<li>Certifique-se de que o seu utilizador tem permiss\u00e3o para atuar como <em>service account<\/em>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para testar o c\u00f3digo, certifique-se de que cumpre os requisitos acima referidos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Amostra Workflow 1<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos come\u00e7ar por construir dois Cloud Workflows simples e dependentes. Crie um novo <em>workflow<\/em>, escolha uma regi\u00e3o de baixo carbono e selecione a <em>service account<\/em> para o lan\u00e7amento. (N\u00e3o \u00e9 necess\u00e1rio configurar vari\u00e1veis de ambiente, etiquetas ou accionadores para este exemplo).<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:503px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O <em>workflow <\/em>pr\u00e9-constru\u00eddo inclui c\u00f3digo funcional, que vamos modificar ligeiramente. Copie e cole o seguinte c\u00f3digo:&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group has-secondary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted\">main:<br>    steps:<br>    - init:<br>        assign:<br>            - searchTerm: \"europe\"<br>    - readWikipedia:<br>        call: http.get<br>        args:<br>            url: '&lt;https:\/\/en.wikipedia.org\/w\/api.php&gt;'<br>            query:<br>                action: opensearch<br>                search: '${searchTerm}'<br>        result: wikiResult<br>    - returnOutput:<br>            return: {\"wiki\":'${wikiResult.body[1]}'}<\/pre>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Este <em>workflow <\/em>pesquisa na Wikipedia por artigos relacionados com a \u201ceuropa\u201d. Implemente o <em>workflow <\/em>sem altera\u00e7\u00f5es e dever\u00e1 obter resultados semelhantes.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXfxzHp6ctRnj6-MjOmySVRyH3sMqAJ9M0yFk_Tq-DXK1twBWfQVVTNzA36fUiMHu6ZSqUtNn6fAjimBQwo4duFWjT4fEqRoWpBVyJ8CRCyC9qczqyiCfweKGcIyy4LTOTPvSWSgNgyY1LRvQXZ87D_-pB02?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:504px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-amostra-workflow-2\"><strong>Amostra Workflow 2<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">De seguida, vamos criar um segundo <em>workflow <\/em>que se baseie no <em>output<\/em> do primeiro. Este <em>workflow <\/em>ir\u00e1 converter uma lista de cadeias de caracteres para mai\u00fasculas, demonstrando uma depend\u00eancia simples. (Cen\u00e1rios mais complexos s\u00e3o poss\u00edveis, mas n\u00e3o s\u00e3o o foco aqui). Siga o mesmo processo de cria\u00e7\u00e3o do primeiro <em>workflow <\/em>para come\u00e7ar.&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXe2X-9daRRO9G5oD30dtUdp-tzFwkOD-yhgJwEqaybmP2bDzSh6rNwP7ZQ_YcXJlRwrb0RvnfKGk7OoylS9sCZdTIE5lS43Hi3MdsVrvxjw8UoFE30YcLQAyONQD6Tb3s7vrVKwIqtUbdExTKLtvjit8s2O?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:484px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Substitua o c\u00f3digo predefinido por este:<\/p>\n\n\n\n<div class=\"wp-block-group has-secondary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted\">main:<br>  params: [wikiResults]<br>  steps:<br>  - initializeUppercaseResults:<br>      assign:<br>        - uppercaseResults: []<br>  - convertToUppercase:<br>      for:<br>        value: wikiItem<br>        in: ${wikiResults.wiki}<br>        steps:<br>          - appendToUppercaseResults:<br>              assign:<br>                - uppercaseResults: ${list.concat(uppercaseResults, text.to_upper(wikiItem))}<br>  - returnOutput:<br>      return: ${uppercaseResults}<\/pre>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Este c\u00f3digo converte uma lista de cadeias de caracteres em mai\u00fasculas. Implemente o <em>workflow <\/em>e tente execut\u00e1-lo sem enviar um <em>input<\/em>. A execu\u00e7\u00e3o vai falhar porque, no c\u00f3digo, usamos o dicion\u00e1rio de <em>input <\/em>dentro do ciclo <em>for <\/em>e neste caso est\u00e1 vazio. No entanto, dever\u00e1 funcionar com o seguinte <em>input<\/em>:&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group has-secondary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted\">{<br>  \"wiki\": [<br>    \"Europe\",<br>    \"European Union\",<br>    \"European Parliament\",<br>    \"European Commission\",<br>    \"European colonization of the Americas\",<br>    \"European emission standards\",<br>    \"European People's Party Group\",<br>    \"European Cup and UEFA Champions League records and statistics\",<br>    \"European Convention on Human Rights\",<br>    \"European debt crisis\"<br>  ]<br>}<\/pre>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado deve ser o seguinte:<br><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXfB6TBaEyQ4bhOT0MlkCdGkEec2jdU405R1I_x28zwIIWyexH6HgZ-9rEJ7HHV9ctkH-Ia72REUF-YEz9S4ZHucxfJOdlni3Ct44MsjiU8RLY1H5ZntFZYxme1KTivoeZUl8Nb2ObqkZvznN06iNwxMiJoG?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:487px;height:auto\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Orquestrador do Workflow<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Com ambos os <em>workflows <\/em>implementados e testados, podemos agora criar um <em>workflow <\/em>para acionar automaticamente o <em>workflow <\/em>2 ap\u00f3s a conclus\u00e3o bem sucedida do <em>workflow <\/em>1. Para isso, vamos precisar do ID e da localiza\u00e7\u00e3o de ambos os <em>workflows<\/em>. Crie um novo <em>workflow <\/em>com o nome <strong>\u201corquestrador-workflow\u201d<\/strong> (a descri\u00e7\u00e3o \u00e9 opcional). Escolha uma regi\u00e3o com baixo teor de carbono e a mesma <em>service account<\/em> utilizada para os <em>workflows <\/em>anteriores.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXdFV-V-790EY6KdZkRACxNSdUJ_8eoglD5YYiOTy46cGTmn4Ju-ZXNFBKtmpywaTpoOqZWnuof17tj2u2LP_y3B9HbnBmWZWcfjoAN6hcp6SBrM4voU1ZALIkIGnalTPyBXzUzlqTpf91wtJXz7Kd54nq6E?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:471px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Neste exemplo, uma vez que precisamos de passar o <em>output <\/em>do <em>workflow <\/em>1 para o <em>workflow <\/em>2, o c\u00f3digo \u00e9 um pouco mais complexo do que um simples ciclo <em>for<\/em>. Caso a partilha de dados n\u00e3o seja necess\u00e1ria entre os diferentes <em>workflows<\/em>, no final, \u00e9 fornecido um c\u00f3digo do <strong>orquestrador de <em>workflow <\/em>simplificado<\/strong>.<strong>&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adicione o seguinte c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-group has-secondary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted\">main:<br> params: [args]<br> steps:<br>    - init: <br>        assign:<br>        - project_id: ${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}<br>        - firstWorkflowId: \"sample-workflow-1\"<br>        - secondWorkflowId: \"sample-workflow-2\"<br>        - location: \"europe-west1\"<br><br>    - launch_first_workflow_execution:<br>        call: http.post<br>        args:<br>            auth:<br>                type: OAuth2<br>            url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/projects\/\"+project_id+\"\/locations\/\"+location+\"\/workflows\/\"+firstWorkflowId+\"\/executions&gt;\"}'<br>        result: firstWorkflowResult<br>        <br>    - set_first_execution_id:<br>        assign:<br>          - execution_id: ${firstWorkflowResult.body.name}<br><br>    - exponential_backoff_retries_for_first_workflow:<br>        try:<br>          steps: <br>            - get_first_execution_state:<br>                call: http.get<br>                args:<br>                    auth:<br>                        type: OAuth2<br>                    url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/&gt;\"+execution_id}'<br>                result: firstWorkflowState<br><br>            - set_first_execution_state:<br>                assign:<br>                - execution_state: ${firstWorkflowState.body.state}<br><br>            - log_state_first_workflow:<br>                call: sys.log<br>                args:<br>                    text: '${firstWorkflowId +\" state: \"+ execution_state}'<br>                    severity: INFO<br><br>            - induce_backoff_retry_if_first_state_not_done:<br>                switch:<br>                  - condition: ${execution_state != \"SUCCEEDED\"}<br>                    raise: ${execution_state}<br>            <br>        retry:<br>          predicate: ${execution_state_predicate}<br>          max_retries: 2<br>          backoff:<br>            initial_delay: 4<br>            max_delay: 45<br>            multiplier: 2<br><br>    - get_first_workflow_output:<br>        call: http.get<br>        args:<br>            auth:<br>                type: OAuth2<br>            url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/&gt;\"+execution_id}'<br>        result: firstWorkflowOutput<br><br>    - log_first_output:<br>        call: sys.log<br>        args:<br>            text: '${firstWorkflowOutput.body.result}'<br>            severity: INFO<br><br>    - launch_second_workflow_execution:<br>        call: http.post<br>        args:<br>            auth:<br>                type: OAuth2<br>            url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/projects\/\"+project_id+\"\/locations\/\"+location+\"\/workflows\/\"+secondWorkflowId+\"\/executions&gt;\"}'<br>            body: <br>                argument: '${firstWorkflowOutput.body.result}'<br>        result: secondWorkflowResult<br><br>    - set_second_execution_id:<br>        assign:<br>          - execution_id: ${secondWorkflowResult.body.name}<br><br>    - exponential_backoff_retries_for_second_workflow:<br>        try:<br>          steps: <br>            - get_second_execution_state:<br>                call: http.get<br>                args:<br>                    auth:<br>                        type: OAuth2<br>                    url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/&gt;\"+execution_id}'<br>                result: secondWorkflowState<br><br>            - set_second_execution_state:<br>                assign:<br>                - execution_state: ${secondWorkflowState.body.state}<br><br>            - log_state_second_workflow:<br>                call: sys.log<br>                args:<br>                    text: '${secondWorkflowId +\" state: \"+ execution_state}'<br>                    severity: INFO<br><br>            - induce_backoff_retry_if_second_state_not_done:<br>                switch:<br>                  - condition: ${execution_state != \"SUCCEEDED\"}<br>                    raise: ${execution_state}<br>            <br>        retry:<br>          predicate: ${execution_state_predicate}<br>          max_retries: 2<br>          backoff:<br>            initial_delay: 4<br>            max_delay: 45<br>            multiplier: 2<br><br>    - get_second_workflow_output:<br>        call: http.get<br>        args:<br>            auth:<br>                type: OAuth2<br>            url: '${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/&gt;\"+execution_id}'<br>        result: secondWorkflowOutput<br><br>    - log_second_output:<br>        call: sys.log<br>        args:<br>            text: '${secondWorkflowOutput.body.result}'<br>            severity: INFO<br><br>    - returnSuccess:<br>        return: \"All pipelines finished with success! Check logs for more details.\"<br><br>execution_state_predicate:  # Subworkflow to check if execution is complete<br> params: [execution_state]  <br> steps:<br>    - init:<br>        assign:<br>            - failureStates: [\"FAILED\",\"CANCELLED\"] <br>    - condition_to_retry:<br>        switch:<br>          - condition: ${execution_state in failureStates}<br>            return: False # Stop Workflow <br>          - condition: ${execution_state != \"SUCCEEDED\"}<br>            return: True # Continue waiting<br>    - otherwise:<br>        return: False # Stop Workflow<br><\/pre>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dever\u00e1 ver um resultado semelhante ao seguinte:<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXeawiZ-jkvcMRT4I9vXCNoc0PvFw-XEtqtZgjXR2RJJZpgdRgXseikWsCKzoM5KtTOCXWGe3UYH7Xwt5quaWCvD3ag_JhhFfvePffcL_Xye5RhXyRAX_Nb-Rrekb53wyC0UkbDXaUOy2P65WVj8MmizA-p1?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:487px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Abrindo o separador de <em>logs<\/em> podemos ver o conjunto de caracteres transformados.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXeDTKy1bT8hblIwRMrwU8O70Q9firC1L8ApPmfd6y-fPfHrB4VvzUijcr4dYv4v7TZgGXUwvQTY0ZaKXElTw4b1StnN5tkJp8fpZ1ZQsrZcEGIFGZLX7uGVE8peOeNbaIJYR0CJqpBM6vgPkAaLH0i8ZTw?key=FI9Axj0mWKGe2iiNsZPZTA\" alt=\"\" style=\"width:496px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O processo \u00e9 simples: definir vari\u00e1veis, lan\u00e7ar o primeiro <em>workflow <\/em>e monitorizar o seu estado com tentativas de retrocesso exponenciais. Isto \u00e9 r\u00e1pido para <em>workflows <\/em>simples (1 a 2 minutos), mas os mais complexos podem necessitar de tempos de repeti\u00e7\u00e3o mais longos (4 a 5 minutos). Isto destaca o tratamento de depend\u00eancias, onde o segundo <em>workflow <\/em>depende do <em>output<\/em> do primeiro.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloud Workflows simplificam a constru\u00e7\u00e3o de <em>pipelines <\/em>inteligentes, destacando-se na gest\u00e3o de depend\u00eancias para orquestra\u00e7\u00f5es complexas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>B\u00f3nus: Orquestrador simplificado<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 um orquestrador de <em>workflow <\/em>mais simples para casos em que a partilha de vari\u00e1veis n\u00e3o \u00e9 necess\u00e1ria, apenas o rastreio de depend\u00eancias.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group has-secondary-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted\">main:<br>  params: [args]<br>  steps:<br>    - init:<br>        assign:<br>          - project_id: ${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}<br>          - workflowIds: [\"sample-workflow-1\", \"sample-workflow-2\"]<br>          - location: \"europe-west1\"<br>          - failureStates: [\"FAILED\",\"CANCELLED\"] <br><br>    - executeWorkflows:<br>        for:<br>          value: workflowId<br>          in: ${workflowIds}<br>          steps:<br>            - launchWorkflow:<br>                call: http.post<br>                args:<br>                  auth:<br>                    type: OAuth2<br>                  url: ${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/projects\/&gt;\" + project_id + \"\/locations\/\" + location + \"\/workflows\/\" + workflowId + \"\/executions\"}<br>                result: executionResult<br>            - trackExecution:<br>                assign:<br>                  - execution_id: ${executionResult.body.name}<br>            - waitForCompletion:<br>                try: <br>                  steps:<br>                    - getExecutionState:<br>                        call: http.get<br>                        args:<br>                          auth:<br>                            type: OAuth2<br>                          url: ${\"&lt;https:\/\/workflowexecutions.googleapis.com\/v1\/&gt;\" + execution_id}<br>                        result: executionState<br>                    - set_second_execution_state:<br>                        assign:<br>                          - execution_state: ${executionState.body.state}<br>                    - logState:<br>                        call: sys.log<br>                        args:<br>                          text: ${workflowId + \" state -&gt; \" + execution_state}<br>                          severity: INFO<br>                    - checkCompletion:<br>                        switch:<br>                          - condition: ${execution_state != \"SUCCEEDED\"}<br>                            raise: ${execution_state} # Retry if not in a failure state and not yet succeeded.<br>                retry:<br>                  predicate: ${execution_state_predicate}<br>                  max_retries: 2<br>                  backoff:<br>                    initial_delay: 4<br>                    max_delay: 45<br>                    multiplier: 2<br><br>    - returnSuccess:<br>        return: \"All pipelines finished with success! Check logs for more details.\"<br><br>execution_state_predicate:  # Subworkflow to check if execution is complete<br> params: [execution_state]  <br> steps:<br>    - init:<br>        assign:<br>            - failureStates: [\"FAILED\",\"CANCELLED\"] <br>    - condition_to_retry:<br>        switch:<br>          - condition: ${execution_state in failureStates}<br>            return: False # Stop Workflow <br>          - condition: ${execution_state != \"SUCCEEDED\"}<br>            return: True # Continue waiting<br><br>    - otherwise:<br>        return: False # Stop Workflow<\/pre>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Esta estrutura \u00e9 semelhante ao exemplo anterior, mas utiliza um ciclo <em>for<\/em> para adicionar facilmente mais <em>workflows <\/em>\u00e0 lista de <em>workflows<\/em>. Sinta-se \u00e0 vontade para experimentar, mas repare que este orquestrador simplificado n\u00e3o \u00e9 compat\u00edvel com os <em>workflows <\/em>anteriores devido \u00e0 sua depend\u00eancia de partilha de dados, uma caracter\u00edstica que n\u00e3o est\u00e1 inclu\u00edda aqui.&nbsp;<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Esta publica\u00e7\u00e3o descreve estrat\u00e9gias para uma orquestra\u00e7\u00e3o simplificada da Cloud Workflows. Utilizando o Google Cloud APIs,&nbsp; \u00e9 poss\u00edvel criar <em>pipelines <\/em>robustos para gerir <em>workflows <\/em>mais complexos. Os exemplos de c\u00f3digo fornecidos servem como ponto de partida para os seus pr\u00f3prios projetos. Lembre-se, dividir os <em>workloads <\/em>em v\u00e1rios <em>workflows <\/em>optimiza os custos e aumenta a flexibilidade.&nbsp; Embora o orquestrador acrescente etapas, os benef\u00edcios de uma <em>pipeline <\/em>mais inteligente superam o pequeno aumento no tempo de execu\u00e7\u00e3o.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descubra como gerir depend\u00eancias com Cloud Workflows utilizando o Google Cloud APIs e sensores inteligentes Introdu\u00e7\u00e3o Gerir as depend\u00eancias entre v\u00e1rios workflows \u00e9 um desafio comum em pipelines de dados complexos. Esta publica\u00e7\u00e3o demonstra como utilizar a Cloud Workflows e o Google Cloud APIs para orquestrar processos complexos, destacando os benef\u00edcios de dividir workloads em [&hellip;]<\/p>\n","protected":false},"featured_media":0,"template":"","categories":[],"tags":[],"industry":[],"class_list":["post-628555","expert-view","type-expert-view","status-publish","hentry"],"acf":[],"cards":"\n\t<div class=\"single-post-card\">\n\n\t\t\n\n\t\t\n\t\t<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-43282307 wp-block-group-is-layout-flex\">\n\t<p style=\"font-style:normal;font-weight:700\" class=\"has-link-color wp-elements-1 wp-block-lp-post-type has-text-color has-primary-color has-small-font-size\">Expert View<\/p>\n\n\t\t\n\t\t<h3 style=\"font-style:normal;font-weight:400\" class=\"wp-block-post-title has-base-font-size\"><a href=\"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/\" target=\"_self\" >Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias<\/a><\/h3><\/div>\n\t\t\n\t<\/div>\n\n","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias | Devoteam<\/title>\n<meta name=\"description\" content=\"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias\" \/>\n<meta property=\"og:description\" content=\"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/\" \/>\n<meta property=\"og:site_name\" content=\"Devoteam\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-04T10:59:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/06\/GettyImages-184316397.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/\",\"url\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/\",\"name\":\"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias | Devoteam\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lh7-qw.googleusercontent.com\\\/docsz\\\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA\",\"datePublished\":\"2025-06-04T10:56:43+00:00\",\"dateModified\":\"2025-06-04T10:59:38+00:00\",\"description\":\"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/#primaryimage\",\"url\":\"https:\\\/\\\/lh7-qw.googleusercontent.com\\\/docsz\\\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA\",\"contentUrl\":\"https:\\\/\\\/lh7-qw.googleusercontent.com\\\/docsz\\\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Expert View\",\"item\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/expert-view\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/\",\"name\":\"Devoteam\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devoteam.info\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias | Devoteam","description":"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/","og_locale":"pt_PT","og_type":"article","og_title":"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias","og_description":"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.","og_url":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/","og_site_name":"Devoteam","article_modified_time":"2025-06-04T10:59:38+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/06\/GettyImages-184316397.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Tempo estimado de leitura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/","url":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/","name":"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias | Devoteam","isPartOf":{"@id":"https:\/\/devoteam.info\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/#primaryimage"},"image":{"@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/#primaryimage"},"thumbnailUrl":"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA","datePublished":"2025-06-04T10:56:43+00:00","dateModified":"2025-06-04T10:59:38+00:00","description":"Aprenda a gerir depend\u00eancias em pipelines de dados complexos com Cloud Workflows e Google Cloud APIs.","breadcrumb":{"@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/#primaryimage","url":"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA","contentUrl":"https:\/\/lh7-qw.googleusercontent.com\/docsz\/AD_4nXedlJyXfJnHSBelHXPzKocQw2W_6thHlQ80MB-qNtHluevmjE0tDJcTw66cASDpnJkMifC4NuU9h89Wu7htTRrBtm07i6lJlySNmF6KKfZyPI7yXqB8c9sr6XPvKFGBLsbKW4yL--TWF6Syzu-iQQSD1Oy6?key=FI9Axj0mWKGe2iiNsZPZTA"},{"@type":"BreadcrumbList","@id":"https:\/\/devoteam.info\/pt\/expert-view\/pipelines-inteligentes-com-cloud-workflows-como-gerir-dependencias\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devoteam.info\/pt\/"},{"@type":"ListItem","position":2,"name":"Expert View","item":"https:\/\/devoteam.info\/pt\/expert-view\/"},{"@type":"ListItem","position":3,"name":"Pipelines Inteligentes com Cloud Workflows: Como Gerir Depend\u00eancias"}]},{"@type":"WebSite","@id":"https:\/\/devoteam.info\/pt\/#website","url":"https:\/\/devoteam.info\/pt\/","name":"Devoteam","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devoteam.info\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"vasco.aboim.pereira","author_link":"https:\/\/devoteam.info\/pt\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Descubra como gerir depend\u00eancias com Cloud Workflows utilizando o Google Cloud APIs e sensores inteligentes Introdu\u00e7\u00e3o Gerir as depend\u00eancias entre v\u00e1rios workflows \u00e9 um desafio comum em pipelines de dados complexos. Esta publica\u00e7\u00e3o demonstra como utilizar a Cloud Workflows e o Google Cloud APIs para orquestrar processos complexos, destacando os benef\u00edcios de dividir workloads em&hellip;","_links":{"self":[{"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/expert-view\/628555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/expert-view"}],"about":[{"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/types\/expert-view"}],"version-history":[{"count":0,"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/expert-view\/628555\/revisions"}],"wp:attachment":[{"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/media?parent=628555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/categories?post=628555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/tags?post=628555"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/devoteam.info\/pt\/wp-json\/wp\/v2\/industry?post=628555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}