--- ## # Prepare base of variables to send ## - name: prepare variables to sent set_fact: params: { 'token': "{{ config.trigger_token }}", 'ref': "{{ config.branch }}", 'variables[source_job_name]': "{{ step }}", 'variables[pod]': "{{ inventory_hostname }}", 'variables[jumphost]': "{{ jumphost }}", } ## # Prepare the artifacts to get ## - name: add bin artifacts param when: artifacts_bin is defined set_fact: params: "{{ params|combine({'variables[artifacts_bin]': artifacts_bin }) }}" - name: add src artifacts param when: artifacts_src is defined set_fact: params: "{{ params|combine({'variables[artifacts_src]': artifacts_src }) }}" - name: ensure artifacts.zip is not present file: path: "{{ playbook_dir }}/artifacts.zip" state: absent - name: set healthchecks base url set_fact: base_url: "{{ gitlab.healthchecks_url }}/ping/{{ healthchecks_id }}" when: healthchecks_id is defined ## # Run the step ## - name: Run step block: ## # add step parameters in the parameters to send ## - name: Add step parameters set_fact: params: "{{ params|combine({key: value}) }}" vars: key: "variables[{{ item.key }}]" value: "{{ item.value }}" with_dict: "{{ config.parameters }}" when: config.parameters is defined and config.parameters != None ## # add NOVAULT_LIST parameter in the parameters to send ## - name: Add NOVAULT_LIST parameter set_fact: params: "{{ params|combine({key: value}) }}" vars: key: "variables[NOVAULT_LIST]" value: "{{ config.novault |join(\"\n\") }}" when: config.novault is defined ## # Trigger the pipeline ## - name: "Trigger a new pipeline for step {{ step }}" uri: url: "{{ config.api }}/trigger/pipeline" method: POST status_code: 201 body_format: raw body: "{{ params| urlencode }}" headers: Content-Type: "application/x-www-form-urlencoded" register: trigger_out - name: set pipeline url set_fact: pipeline_url: "{{ config.url }}/pipelines/{{ trigger_out.json.id }}" api_pipeline_url: "{{ config.api }}/pipelines/{{ trigger_out.json.id }}" - name: Echo running pipeline link debug: msg: "{{ msg.split('\n') }}" vars: msg: | ****************************************************************** * Pipeline triggered for step '{{ step }}' * {{ pipeline_url }} ****************************************************************** - name: set grafana start point include_tasks: grafana_start.yml when: grafana is defined - name: "Wait for pipeline result {{ step }}" uri: url: "{{ config.api }}/pipelines/{{ trigger_out.json.id }}" method: GET status_code: 200 return_content: 'yes' headers: PRIVATE-TOKEN: "{{ config.api_token|default(gitlab.private_token, 'true') }}" register: pipeline_out retries: "{{ config.timeout }}" delay: "{{ gitlab.pipeline.delay }}" until: (((pipeline_out.json |default({'status':'unknown'})).status |default('unknown')) not in ['created', 'waiting_for_resource', 'preparing', 'pending', 'running', 'unknown']) or ( pipeline_out.status == 401 ) - name: Exit -1 fail: when: pipeline_out.json.status not in ['success'] ## # When finished, recover an artifact if requested ## - name: pull artifacts_src when: config.pull_artifacts is defined and config.pull_artifacts != None block: - name: "Get job id for the artifact to get" uri: url: >- {{ config.api }}/pipelines/{{ trigger_out.json.id }}/jobs?scope[]=success method: GET headers: PRIVATE-TOKEN: "{{ config.api_token|default(gitlab.private_token, 'true') }}" register: pipeline_success_jobs - name: download job artifact uri: url: "{{ config.api }}/jobs/{{ job_id[0] }}/artifacts" headers: PRIVATE-TOKEN: "{{ config.api_token|default(gitlab.private_token, 'true') }}" dest: "{{ playbook_dir }}/artifacts.zip" vars: job_id: >- {{ pipeline_success_jobs.json |json_query( '[?name==`'+ config.pull_artifacts +'`].id') }} - name: remove actual artifacts file: path: "{{ item }}" state: absent when: item[-1] == '/' with_items: "{{ vars[lookup( 'env', 'CI_JOB_NAME')].artifacts.paths }}" - name: create artifacts folders file: path: "{{ item }}" state: directory recurse: true mode: 0775 when: item[-1] == '/' with_items: "{{ vars[lookup( 'env', 'CI_JOB_NAME')].artifacts.paths }}" - name: unarchive artifacts unarchive: src: "{{ playbook_dir }}/artifacts.zip" dest: "{{ playbook_dir }}" remote_src: "yes" - name: trigger OK healthchecks uri: url: "{{ base_url }}" when: healthchecks_id is defined ignore_errors: true - name: update grafana stop point include_tasks: grafana_stop.yml vars: result: "{{ pipeline_out.json.status }}" text: "{{ step }} succeeded" when: grafana is defined and grafana_events is defined ## # If something failed, print the jobs that failed ## rescue: - name: print last pipeline result for forensic debug: var: pipeline_out verbosity: 3 - name: update grafana stop point include_tasks: grafana_stop.yml vars: result: "{{ pipeline_out.json.status }}" text: "{{ step }} failed" when: grafana is defined and grafana_events is defined - name: trigger Failed healthcheck uri: url: "{{ base_url }}/fail" when: healthchecks_id is defined - name: "Show last pipeline_out value" debug: msg: "{{ pipeline_out.json | default('No pipeline out') }}" verbosity: 3 - name: "RESCUE - Get jobs list that failed" uri: url: "{{ config.api }}/pipelines/{{ trigger_out.json.id }}/jobs/" method: GET status_code: 200 return_content: 'yes' headers: PRIVATE-TOKEN: "{{ config.api_token|default(gitlab.private_token, 'true') }}" register: jobs_list - name: RESCUE - filter failed jobs set_fact: failed_jobs: "{{ failed_jobs | default({}) | combine({ item.id: {'stage': item.stage, 'name': item.name, 'status': item.status, 'duration': item.duration, 'url': url }})}}" vars: url: "{{ config.url }}/-/jobs/{{ item.id }}" when: item.status not in ['success', 'skipped'] with_items: "{{ jobs_list.json }}" - name: RESCUE - run failed ! when: true fail: msg: "{{ msg.split('\n') }}" vars: msg: | ****************************************************************** * Oh ! NO !!! Pipeling of the project failed !!! * ----------------------- * Step: {{ step }} * Project: {{ config.project }} * Status: {{ pipeline_out.json.status }} * Pipeline: '{{ pipeline_url }}' * API pipeline url: '{{ api_pipeline_url }}' * Failed jobs: {% for job_id, job_status in failed_jobs.items() -%} * - id: {{ job_id }} * name: {{ job_status.stage }}/{{ job_status.name }} * status: {{ job_status.status }} * duration: {{ job_status.duration }} * link: {{ job_status.url }} {% endfor %} ******************************************************************