В этой статье я покажу, как использовать свои исследовательские навыки, чтобы отследить редакцию проекта, которая может быть неочевидной. Это довольно тонко и требует некоторой догадки, но это выполнимо! Я прохожу через свой мыслительный процесс в надежде, что вы узнаете, как произвести впечатление на свою команду.
Немного предыстории
Есть приложение с открытым исходным кодом, над которым я работаю, и оно использует 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
Обратите внимание на номер версии. Это то же самое, что я получил при первоначальной попытке установки.
Это имеет смысл
Почему?
- Ревизия, которую я искал, была изменением в файле
local/local.go
, а не в файлеinstall.sh
. - Если бы авторы Circleci хотели, чтобы
install.sh
соответствовало каждому точному хешу, им пришлось бы постоянно обновлять файлinstall.sh
, чтобы он соответствовал каждому отдельному хешу. - Вместо этого должен был быть способ для
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, чтобы назначить бесплатную часовую консультацию.