В продолжение к заметке Инструкция: как быстро настроить 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. Сбрасываю пароль:

Если пароль был сохранён ранее для входа в 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 и клонирую его к себе:
$ 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

gitlab-runner
Установка:
$ brew install gitlab-runner $ brew services start gitlab-runner
Добавляю теги 'ci, cd':

И получаю токен:

Выполняю регистрацию:
$ 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.
