Архив метки: gitlab

Gitlab API — создание, обновление файла на PHP

Ранее я писал как можно через curl в Linux выполнить запрос в Linux на создание файла или его обновление в репозитории Gitlab через его API. Ниже показано как это сделать через Curl, но уже в PHP.

Получить информацию по репозиторию:

<?php
$headers = ['PRIVATE-TOKEN: 123ABC'];

$url = 'https://main-git.ru/api/v4/projects/Dima/%2Fdima-tools';

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                        
curl_setopt($curl, CURLOPT_URL, $url);

$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

Создать файл в репозитории:


<?php

$json_array = array("branch" => "master", "author_email" => "dima@example.com", "author_name" => "Firstname Lastname", "content" => "some content", "commit_message" => "create a new file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

Обновить файл в репозитории, при этом наполнить его содержимым из другого файла (create json array from file in php):


<?php

//читаем файл в строку, в файле должны быть переводы строк "\n" если хотите, чтобы в  //Gitlab была не одна строка без переносов
$hosts = file_get_contents('./file/hosts.txt');

$json_array = array("branch" => "master", "author_email" => "dima@russia.ru", "author_name" => "Red Dima", "content" => $hosts, "commit_message" => "update file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.msk.ru/api/v4/projects/1/repository/files/ansible%2Fhosts';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

Gitlab — создать файл и обновить через API

Логика работы такая:

  • создаем файл в репозитории с нужным описанием
  • обновляем этот файл

Нужно создать создать ключ, заходим в пользовательские настройки, Access Tokens — пишем название, ставим нужны права и сохраняем, запомнив ключ.

Для начала нужно знать id проекта, его можно увидеть или в web-версии или выполнить запрос:

curl -GET -H 'Content-Type: application/json' --insecure --header 'PRIVATE-TOKEN: 123ABC' 'https://main-git.ru/api/v4/projects/Dima%2Fdima-tools'

В ответ придет Json, который будет будет содержать первый атрибут с именем id и номеров вашего проекта.

В Gitlab файл можно закачать как для использования в issue или merge request(в ответ придет markdown с ссылкой на файл для вставки). Запрос должен должен быть вот такой:

curl -i -k -H "PRIVATE-TOKEN: 123ABC" "https://main-git.ru/api/v4/projects/1/uploads" -X POST -F 'file=@testapi.txt'

В ответ придет вот такой ответ:
{"alt":"testapi.txt","url":"/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt","full_path":"/Dima/dima-tools/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt","markdown":"[testapi.txt](/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt)"}

Отсюда вот этот кусок :


[testapi.txt](/uploads/1937f448b5468d4a76a50fdb40029829/testapi.txt)

Его можно вставлять как markdown.

Второй вариант - это когда нам необходимо создать или обновить файл в нашем репозитории. Сначала создаем директорию app  и файл c именем main.c внутри нашего репозитория:

curl --insecure --request POST --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname", "content": "some content", "commit_message": "create a new file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

В ответ получаем Json:

{"file_path":"app/main.c","branch":"master"}

Далее если мы хотим обновить этот файл выполняем запрос:
curl --insecure --request PUT --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content new", "commit_message": "update file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

curl --insecure --request PUT --header 'PRIVATE-TOKEN: 123ABC' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content new", "commit_message": "update file"}' "https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain%2Ec"

В ответ придет Json, что обновление произведено. Если вы попытаетесь закачать уже существующий с таким именем файл - будет выдано сообщение, что такой файл уже существует и повторно не будет закачано. 

Таким образом можно использовать эту возможность даже в Bash напрямую из под Linux, не используя при этом общепринятые языки программирования. Можно переделать его, например, в PHP через Curl.

Gitlab и fullchain сертификат для работы Runner

Если у вас Gitlab работает на субдомене, то для работы gitlab runners и вообще для работы https рекомендуется ставить сертификат, содержащий полную цепочку от вашего субдомена до корневого домена.

У нас имеется:

  1. .crt файл, содержащий открытую публичную часть нашего сертификата субдомена
  2. .key файл, содержащий приватный ключ субдомена
  3. .pem файл, содержащий публичную часть корневого сертификата домена

Закрытый ключь домена — your_domain_name.key
Первичный сертификат — your_domain_name.crt
Промежуточный сертификат — DigiCertCA.crt
Корневой сертификат — TrustedRoot.crt

.pem должен выглядеть примерно так:

Создание .pem файла с закрытым ключем для всей цепочки:

Make sure to include the beginning and end tags on each certificate. The result should look like this:

——BEGIN RSA PRIVATE KEY——
(your_domain_name.key)
——END RSA PRIVATE KEY——
——BEGIN CERTIFICATE——
(your_domain_name.crt)
——END CERTIFICATE——
——BEGIN CERTIFICATE——
(DigiCertCA.crt)
——END CERTIFICATE——
——BEGIN CERTIFICATE——
(TrustedRoot.crt)
——END CERTIFICATE——

Получается что наш .pem будет состоять из нескольких частей.

Дальше нам нужно из .pem сгенерировать приватный ключ:

openssl rsa -in fullchain.pem -out fullchain_private.key

Далее копируем наш получившийся fullchain_private.key в директорию /etc/gitlab/ssl/ и переименовываем его чтобы не запутаться в your_domain_name.key

Из файла .pem убираем приватный ключь и копируем его в директорию /etc/gitlab/ssl/ c именем your_domain_name.pem

Далее в конфиг файл добавляем строки (или меняем):

nginx[‘ssl_certificate’] = «/etc/gitlab/ssl/your_domain_name.pem»

nginx[‘ssl_certificate_key’] = «/etc/gitlab/ssl/your_domain_name.key»

Переконфигурируем Gitlab:

sudo gitlab-ctl reconfigure


Проверяем что все добавилось:

sudo openssl s_client -connect  your_domain_name:443 -showcerts /dev/null