{{tag>Brouillon Gitlab CI API Ansible}} # Notes Gitlab-ci pipeline - API Voir : * https://docs.gitlab.com/api/pipelines/ * https://docs.gitlab.com/security/tokens/#security-considerations ## Exemple 1 - avec Access Token ou Personnal Access tokens Avec Access Token (associé au projet) * Aller dans le projet - puis : Settings / Access tokens * Attention : par défaut les Access Tokens ont une date d'expiration Avec Personnal Access tokens (associé au compte utilisateur) * Profile / Edit profile / Access Token / Personal Access Tokens * Attention : par défaut les Personal Access Tokens ont une date d'expiration Launch pipeline with API call - with Private / Personal access tokens ~~~bash curl --request POST \ --header "PRIVATE-TOKEN: saltxx-8888888888" \ --header "Content-Type: application/json" \ --data '{ "ref": "master", "variables": [ {"key": "VAR1", "value": "plop"}, {"key": "VAR2", "value": "plop"}, {"key": "VAR3", "value": "plop"}, {"key": "VAR4", "value": ""} ] }' \ --url "${CI_API_V4_URL}/projects/100/pipeline" ~~~ Voir https://docs.gitlab.com/api/rest/ ### Notes CI_API_V4_URL est une variable magique dont la valeur est de la forme : `http://gitlab.acme.local/api/v4` Dans notre cas la variable `ref` correspond au nom de la branche ## Exemple 2 - Avec Trigger Tokens Voir : * https://medium.com/@alla.shamis/automating-gitlab-ci-cd-using-api-triggers-and-passing-variables-like-a-pro-e864310765d8 Voir aussi : * https://docs.gitlab.com/ci/pipelines/downstream_pipelines/#multi-project-pipelines * https://blog.stephane-robert.info/docs/pipeline-cicd/gitlab/industrialisation/multi-projet/ Aller dans le projet, puis Settings/ CI/CD / Pipeline trigger tokens Trigger pipeline with the API / Pass CI/CD variables in the API call ~~~bash curl --request POST \ --form token=glptt-99999999999999 \ --form ref=master \ --form "variables[VAR1]=plop" \ --form "variables[VAR2]=plop" \ --form "variables[VAR3]=plop" \ --form "variables[VAR4]=plop" \ "${CI_API_V4_URL}/projects/100/trigger/pipeline" ~~~ Avec Ansible `.gitlab-ci.yml` ~~~yaml launch: tags: # - gitlab-runner-sh-001 - gitlab-runner-docker-001 image: registry.acme.local/repository/local-docker/ansible-builder:0.0.4 stage: build script: ansible-playbook play-launch-ci.yml -e url="${CI_API_V4_URL}" -e token="${TRIGGER_TOKEN}" ~~~ `play-launch-ci.yml` ~~~yaml #! /usr/bin/env ansible-playbook --- - name: Launch CI gather_facts: false hosts: localhost vars: branch: "{{ lookup('env', 'BRANCH') }}" line: "{{ lookup('env', 'LINE') }}" kind: "{{ lookup('env', 'KIND') }}" tasks: - name: Assert check environment vars are correctly defined ansible.builtin.assert: that: - url is defined and url != '' - token is defined and token != '' - branch is defined and branch != '' - line is defined and line != '' - kind is defined and kind != '' msg: "Env var must be defined" - name: Call API # no_log: true register: reg_uri until: reg_uri.status == 201 retries: 3 delay: 5 # Every 5 seconds ansible.builtin.uri: url: "{{ url }}/projects/100/trigger/pipeline" # validate_certs: false status_code: 201 follow_redirects: none method: POST body_format: json headers: Content-Type: "application/json" body: | { "ref": "main", "token": "{{ token }}", "variables": { "BRANCH": "{{ branch }}", "KIND": "{{ kind }}", "LINE": "{{ line }}" } } ~~~ Voir https://docs.gitlab.com/ci/triggers/ ### Autres ~~~yaml 000-colo-switch:prod: stage: deploy variables: PROJECT: "projectname" rules: # whether to include the job in the pipeline - if: $CI_PIPELINE_SOURCE == "trigger" when: always - when: never ~~~ Source: https://forum.gitlab.com/t/triggering-a-specific-job-of-the-pipeline-via-api/42397/2