В этой статье я покажу, как использовать свои исследовательские навыки, чтобы отследить редакцию проекта, которая может быть неочевидной. Это довольно тонко и требует некоторой догадки, но это выполнимо! Я прохожу через свой мыслительный процесс в надежде, что вы узнаете, как произвести впечатление на свою команду.

Немного предыстории

Есть приложение с открытым исходным кодом, над которым я работаю, и оно использует Circleci на GitHub как часть конвейера развертывания.

Как вы можете себе представить, я очень устал видеть, как все мои тесты проходят, нажимаю на репозиторий, а затем возвращаюсь через 5 часов и вижу брызги красных крестиков в окне отчета.

Итак, я решил, что мне следует запустить Circleci локально, чтобы увидеть результат намного быстрее.

После борьбы с docker-ce и circleci, чтобы договориться друг с другом, я наконец был готов запустить тесты Circleci:

circleci local execute — config=.circleci/config.yml

Сначала я увидел красивые отладочные сообщения. Тогда меня поразило это:

Error: 
Unexpected environment preparation error: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385: applying cgroup configuration for process caused: cannot enter cgroupv2 "/sys/fs/cgroup/docker/95c4df9fcd7e965b1c487cd85409b14be6343e7beff7febfd4a8a63fd8f2b5a6/5401d12dce6fca42cd5c75ef342bfec4187ed3a545401040ca7d843696be5459" with domain controllers -- it is in an invalid state: unknown

Покопавшись в Интернете, я нашел эту тему ​​для пользователей Mac, занимающихся этой ошибкой. Я на линуксе. Но не бойтесь — проблема, вероятно, довольно похожа.

Начиная с проблемы, связанной с Mac

Решение, казалось, состояло в том, чтобы отредактировать файл ~/.circleci/build_agent_settings.json, пока — то есть — не было обнаружено, что файл build_agent_settings.json игнорируется в более поздних версиях.

К счастью, автор последнего комментария упомянул коммит, в котором произошло изменение (🙏🏼‍, wrigby). К сожалению (опять же), это для Mac.

Если вы нажмете на упомянутый URL, вам будет представлена ​​эта страница:

Отслеживание необходимой версии

Поскольку я установил Circleci-cli альтернативным методом, это означает, что мне просто нужно загрузить старую версию https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh, заменив master нужным мне хэшем.

Я признаю, что страница не дает четкого ответа, что это за хэш, потому что git — это нелинейная система контроля версий.

Однако, если мы посмотрим вверх на страницу, мы увидим дату фиксации ( March 21st ), а также родительскийSHA. Это может быть или не быть тем, на чем исходный коммиттер кода основывал эту версию. Получение «достаточно близкой» даты (более ранней) для пересмотра кода теоретически оставит меня в хорошем состоянии.

Нашел это!

Если мы откроем родительский коммит, мы увидим этот коммит:

Круто, похоже, это было совершено в феврале, а «ребенок» — в марте. Это означает, что для ревизии 263902a Circleci все еще должен поддерживать необходимый файл json.

Еще не совсем там

Итак, я побежал

curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/263902a/install.sh | sudo bash

Но я получил следующий вывод:

Starting installation. 
Installing CircleCI CLI v0.1.18980 
Installing to /usr/local/bin 
/usr/local/bin/circleci

Обратите внимание на номер версии. Это то же самое, что я получил при первоначальной попытке установки.

Это имеет смысл

Почему?

  1. Ревизия, которую я искал, была изменением в файле local/local.go, а не в файле install.sh.
  2. Если бы авторы Circleci хотели, чтобы install.sh соответствовало каждому точному хешу, им пришлось бы постоянно обновлять файл install.sh, чтобы он соответствовал каждому отдельному хешу.
  3. Вместо этого должен был быть способ для install.sh разрешить указывать конкретный номер версии.

Время осмотра!

Итак, давайте загрузим и проверим файл install.sh, чтобы увидеть, можем ли мы взломать наш способ указать версию.

Собственно, документация прямо в шапке:

#!/usr/bin/env bash 
 
# Install the CircleCI CLI tool. 
# https://github.com/CircleCI-Public/circleci-cli 
# 
# Dependencies: curl, cut 
# 
# The version to install and the binary location can be passed in via VERSION and DESTDIR respectively. 
#

Сомневаюсь, что под version они подразумевают «гашиш». Но давайте попробуем, если он работает (обратите внимание, что флаг -E передается в sudo, чтобы гарантировать сохранение переменных среды).

> curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | VERSION=263902a sudo -E bash 
Starting installation. 
Installing CircleCI CLI v263902a 
 
gzip: stdin: not in gzip format 
tar: Child returned status 1 
tar: Error is not recoverable: exiting now 
An error occured installing the tool. 
The contents of the directory /tmp/tmp.gmB5GGdcYZ have been left in place to help to debug the issue.

Не совсем буррито. 🌯

Поиск версии, соответствующей ревизии

К сожалению, у GitHub нет хорошего способа найти ревизии, соответствующие хэшу (потому что вы действительно не можете сделать это с помощью git). Так что мне пришлось самому заняться детективной работой.

Я перешел на вкладку Код в репозитории и прокрутил вниз до Релизы:

Теперь мне просто нужно было найти релиз раньше 21 марта 2022 года, а лучше 22 февраля. На приведенном ниже снимке экрана показана вкладка «Теги», а не вкладка «Релизы».

После достаточного количества прокрутки я нашел его!

Я выделил оба на тот случай, если v0.1.16947 не сработает.

Установка с тегом версии

Запустим снова!

> curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | VERSION=0.1.16947 sudo -E bash
 
Starting installation. 
Installing CircleCI CLI v0.1.16947 
Installing to /usr/local/bin 
/usr/local/bin/circleci

Ура! Он установлен!

Но только для проверки…

> circleci version 
0.1.16947+263902a (release)

И бинго было его имя, о!

Запуск CircleCI с 🤞🏼‍ рабочей версией

Давайте посмотрим, что мы получаем сейчас:

circleci local execute --config=.circleci/config.yml
Docker image digest: sha256:008ba7f4223f1e26c11df9575283491b620074fa96da6961e0dcde47fb757014
Unable to find image 'circleci/picard@sha256:008ba7f4223f1e26c11df9575283491b620074fa96da6961e0dcde47fb757014' locally
docker.io/circleci/picard@sha256:008ba7f4223f1e26c11df9575283491b620074fa96da6961e0dcde47fb757014: Pulling from circleci/picard
59bf1c3509f3: Pull complete 
94a8924a7179: Pull complete 
22415b118b62: Pull complete 
e6fd8578fffa: Pull complete 
89de3541b16e: Pull complete 
2885720b32f2: Pull complete 
30c572036827: Pull complete 
Digest: sha256:008ba7f4223f1e26c11df9575283491b620074fa96da6961e0dcde47fb757014
Status: Downloaded newer image for circleci/picard@sha256:008ba7f4223f1e26c11df9575283491b620074fa96da6961e0dcde47fb757014
====>> Spin up environment
Build-agent version  ()
System information:
 Server Version: 20.10.14
 Storage Driver: overlay2
  Backing Filesystem: extfs
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Kernel Version: 5.10.104-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
Starting container mattermost/mattermost-build-server:20220415_golang-1.18.1
Warning: No authentication provided, using CircleCI credentials for pulls from Docker Hub.
  image is cached as mattermost/mattermost-build-server:20220415_golang-1.18.1, but refreshing...
20220415_golang-1.18.1: Pulling from mattermost/mattermost-build-server
Digest: sha256:25691aa05eb308683316042474c86f046d2f6e10c272d613d41afb6e7fec5560
Status: Image is up to date for mattermost/mattermost-build-server:20220415_golang-1.18.1
mattermost/mattermost-build-server:20220415_golang-1.18.1:
  using image mattermost/mattermost-build-server@sha256:25691aa05eb308683316042474c86f046d2f6e10c272d613d41afb6e7fec5560
  pull stats: Image was already available so the image was not pulled
  time to create container: 79ms
Creating Docker containers in parallel 
Time to upload agent and config: 6.761834652s
Time to start containers: 746.019013ms
====>> Preparing environment variables
Using build environment variables:
  BASH_ENV=/tmp/.bash_env-localbuild-1656177548
  CI=true
  CIRCLECI=true
  CIRCLE_BRANCH=
  CIRCLE_BUILD_NUM=
  CIRCLE_JOB=build
  CIRCLE_NODE_INDEX=0
  CIRCLE_NODE_TOTAL=1
  CIRCLE_REPOSITORY_URL=
  CIRCLE_SHA1=
  CIRCLE_SHELL_ENV=/tmp/.bash_env-localbuild-1656177548
  CIRCLE_WORKING_DIRECTORY=~/mattermost
The redacted variables listed above will be masked in run step output.====>> Attaching Workspace (skipped)
Warning: skipping this step: Missing workflow workspace identifiers, this step must be run in the context of a workflow
====>> cd mattermost-server
make config-reset
make build-cmd BUILD_NUMBER='${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}'
make package BUILD_NUMBER='${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}'
#!/bin/bash -eo pipefail
cd mattermost-server
make config-reset
make build-cmd BUILD_NUMBER='${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}'
make package BUILD_NUMBER='${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}'
/bin/bash: line 1: cd: mattermost-server: No such file or directory
Error: 
Exited with code exit status 1
Step failed
====>> Uploading artifacts
Uploading /root/mattermost/mattermost-server/dist/mattermost-team-linux-amd64.tar.gz to ~/mattermost/mattermost-server/dist/mattermost-team-linux-amd64.tar.gz
  No artifact files found at /root/mattermost/mattermost-server/dist/mattermost-team-linux-amd64.tar.gz
Total size uploaded: 0 B
====>> Uploading artifacts
Uploading /root/mattermost/mattermost-server/dist/mattermost-team-osx-amd64.tar.gz to ~/mattermost/mattermost-server/dist/mattermost-team-osx-amd64.tar.gz
  No artifact files found at /root/mattermost/mattermost-server/dist/mattermost-team-osx-amd64.tar.gz
Total size uploaded: 0 B
====>> Uploading artifacts
Uploading /root/mattermost/mattermost-server/dist/mattermost-team-linux-arm64.tar.gz to ~/mattermost/mattermost-server/dist/mattermost-team-linux-arm64.tar.gz
  No artifact files found at /root/mattermost/mattermost-server/dist/mattermost-team-linux-arm64.tar.gz
Total size uploaded: 0 B
====>> Uploading artifacts
Uploading /root/mattermost/mattermost-server/dist/mattermost-team-osx-arm64.tar.gz to ~/mattermost/mattermost-server/dist/mattermost-team-osx-arm64.tar.gz
  No artifact files found at /root/mattermost/mattermost-server/dist/mattermost-team-osx-arm64.tar.gz
Total size uploaded: 0 B
====>> Uploading artifacts
Uploading /root/mattermost/mattermost-server/dist/mattermost-team-windows-amd64.zip to ~/mattermost/mattermost-server/dist/mattermost-team-windows-amd64.zip
  No artifact files found at /root/mattermost/mattermost-server/dist/mattermost-team-windows-amd64.zip
Total size uploaded: 0 B
Error: runner failed (exited with 101)
Task failed
Error: task failed

Да, это не удалось, но, как видите, это отличная новость! Мы преодолели неудачу Circleci.

👐🏼‍ Вернись!

Если вы нашли решение для чего-то, не просто сидите на нем. Разместите его в общедоступном месте, чтобы другие могли извлечь из него пользу.

Я подозреваю, что я, вероятно, не единственный разработчик, занимающийся этой проблемой. Поэтому я добавляю комментарий с подробным описанием шагов по решению проблемы для Linux.

Если вам понравилась эта статья…

Если вам понравилась эта статья, поделитесь ею с кем-нибудь, кто, по вашему мнению, получит от нее пользу.

И если вашей команде нужен разработчик — будь то стартап, малый бизнес или крупная корпорация, зайдите на https://damngood.tech, чтобы назначить бесплатную часовую консультацию.