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