Инструкция: как поднять GitLab CI/CD на GoLang-проекте

от автора

В продолжение к заметке Инструкция: как быстро настроить GitLab CI/CD на Flutter-проекте.

Больше спасибо автору, всё получилось относительно легко. Я усложнил задачу: поднял GitLab локально на Хакинтоше, прикрутил executor = "docker" вместо "shell". И началось веселье.

Docker Desktop

Не повторяйте мою ошибку: сначала сохраните данные, если есть наработки в Docker-образах. Установливаю с официального сайта, через скачанный Docker.dmg v4.25.2:

$ docker -v Docker version 24.0.6, build ed223bc $ docker-compose version Docker Compose version v2.23.0-desktop.1 

Локальная установка GitLab в Docker

# docker-compose.yml version: '3' services:   web:     image: 'gitlab/gitlab-ce:latest'     restart: always     hostname: 'localhost'     environment:       GITLAB_OMNIBUS_CONFIG: |         external_url 'http://localhost'     ports:       - '80:80'       # - '443:443'       - '22:22'     volumes:       - '~/.gitlab/config:/etc/gitlab'       - '~/.gitlab/logs:/var/log/gitlab'       - '~/.gitlab/data:/var/opt/gitlab' 
$ docker-compose up -d 

Пошуршит пару минут, потом доступен по адресу http://localhost. Сбрасываю пароль:

Docker Desktop

Docker Desktop

Если пароль был сохранён ранее для входа в git через VSCode, тоже можно сбросить:

$ git credential-osxkeychain erase host=localhost protocol=http 

DOCKER_AUTH_CONFIG

Проверяю доступ к аккаунту в docker.io:

$ docker logout $ docker login Login Succeeded 

Генерирую хэш:

$ printf "my_username:my_password" | openssl base64 -A # Example output to copy bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ= 

Добавляю хэш в конфиг:

$ nano ~/.docker/config.json 
{   "auths": {     "docker.io": {       "auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="     }   },   "credsStore": "desktop",   "currentContext": "desktop-linux",   "plugins": {     "-x-cli-hints": {       "enabled": "true"     }   } } 

Прописываю DOCKER_AUTH_CONFIG:

{   "auths": {     "docker.io": {       "auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="     }   } } 
GitLab > Settings > CI/CD > Variables» title=»GitLab > Settings > CI/CD > Variables» width=»1484″ height=»1076″ data-src=»https://habrastorage.org/getpro/habr/upload_files/829/74d/35d/82974d35d97a039bbcd4acb11ae2e5b2.png»/></p>
<div><figcaption>GitLab > Settings > CI/CD > Variables</figcaption></div>
</figure>
<h3>Рыба проекта</h3>
<p>Создаю новый проект в интерфейсе GitLab и клонирую его к себе:</p>
<pre><code class=$ git clone http://localhost/root/my-project.git $ cd my-project

Пора добавить божественный main.go:

$ go mod init my-project $ nano main.go 
package main  import ( "log" "time" )  func main() { for { time.Sleep(time.Second) log.Println("OK") } } 

Мне нужен Dockerfile для локальной сборки:

$ nano Dockerfile
FROM golang:onbuild AS build WORKDIR /build COPY . . RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o ./app  FROM ubuntu:20.04 AS ubuntu RUN apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -y upx RUN apt-get clean && \     rm -rf /var/lib/apt/lists/* COPY --from=build /build/app /build/app RUN upx /build/app  FROM scratch COPY --from=ubuntu /build/app /build/app  ENTRYPOINT ["/build/app"] 

Вся эта суета, чтобы получить образ (image) на 577KB:

  • ubuntu применяет волшебный upx;

  • scratch тоже сокращает итоговый размер.

И для порядка:

$ nano .dockerignore 
.git 

Вишенка на торте:

$ nano docker-compose.yml
version: '3' name: 'my-project' services:   app:     build: .

Пробую запустить в докере:

$ docker-compose up -d --build 
Docker Desktop

Docker Desktop

gitlab-runner

Установка:

$ brew install gitlab-runner $ brew services start gitlab-runner 

Добавляю теги ‘ci, cd’:

GitLab > Settings > CI/CD > Runners > New Project Runner» title=»GitLab > Settings > CI/CD > Runners > New Project Runner» width=»1384″ height=»1390″ data-src=»https://habrastorage.org/getpro/habr/upload_files/691/cfa/f4d/691cfaf4dbb58bb3c24706a1c68ee8aa.png»/></p>
<div><figcaption>GitLab > Settings > CI/CD > Runners > New Project Runner</figcaption></div>
</figure>
<p>И получаю токен:</p>
<figure class=GitLab > Settings > CI/CD > Runners > New Project Runner > Create Runner» title=»GitLab > Settings > CI/CD > Runners > New Project Runner > Create Runner» width=»1490″ height=»904″ data-src=»https://habrastorage.org/getpro/habr/upload_files/019/e25/873/019e258739c3117afd333de02eefd1a7.png»/></p>
<div><figcaption>GitLab > Settings > CI/CD > Runners > New Project Runner > Create Runner</figcaption></div>
</figure>
<p>Выполняю регистрацию:</p>
<pre><code class=$ gitlab-runner register \ --url "http://localhost" \ --description "via docker" \ --docker-image "alpine" \ --executor "docker" \ --docker-privileged \ --docker-volumes "/certs/client" \ --docker-network-mode host \ --docker-helper-image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-e0218c92"

Открываю на редактирование config.toml:

$ nano ~/.gitlab-runner/config.toml 

Удаляю значение для ключа image:

[[runners]]   name = "via docker"   # ...   [runners.docker]     image = ""     # ... 

.gitlab-ci.yml

$ nano .gitlab-ci.yml 

Я: Как перевести Dockerfile в формат .gitlab-ci.yml?

FROM golang:onbuild AS build WORKDIR /build COPY . . RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o ./app 

ChatGPT:

stages:   - build  variables:   GOARCH: amd64   GOOS: linux   CGO_ENABLED: 0  build:   stage: build   image: golang:onbuild   script:     - go build -o ./app   artifacts:     paths:       - ./app 

Добавляю от себя:

  tags:     - cd  workflow:   rules:     - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'       when: always 

Всё, можно коммитить. Прямо ветку main, как мы любим. Потом делаю новую ветку с каким-либо изменением и оформляю «merge request».

Запущенный job выполнен успешно, можно скачать результат:

UPD: решил вопросы с запуском gitlab-runner и отказался от Docker Desktop 4.26.0.


ссылка на оригинал статьи https://habr.com/ru/articles/780172/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *