В продолжение к заметке Инструкция: как быстро настроить 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
GitLab > Settings > CI/CD > Variables

Рыба проекта

Создаю новый проект в интерфейсе 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
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
GitLab > Settings > CI/CD > Runners > New Project Runner

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

GitLab > Settings > CI/CD > Runners > New Project Runner > Create Runner
GitLab > Settings > CI/CD > Runners > New Project Runner > Create Runner

Выполняю регистрацию:

$ 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.

Комментарии (0)