Хотя ответ @MattBucci работает, в нем есть оговорка, что вы можете извлекать только определенную ветку, а не конкретную фиксацию, которую использует подмодуль.
Чтобы справиться с этим случаем, что вероятно при использовании подмодулей, необходимо сделать несколько вещей:
1) Создайте ловушку git pre-commit
со следующим содержанием:
#!/bin/bash
# This file is used in post-commit hook
# if .commit exists you know a commit has just taken place but a post-commit hasn't run yet
#
touch .commit
Если он у вас уже есть, вы можете добавить эту строку в начале.
2) Создайте обработчик git post-commit
со следующим контнетом:
#!/bin/bash
DIR=$(git rev-parse --show-toplevel);
if [[ -e $DIR/.commit ]]; then
echo "Generating submodule integrity file"
rm .commit
SUBMODULE_TRACKING_FILE=$DIR/.submodule-hash
MODULE_DIR=module
# Get submodule hash, this will be used by AWS Code Build to pull the correct version.
# AWS Code Build does not support git submodules at the moment
# https://forums.aws.amazon.com/thread.jspa?messageID=764680#764680
git ls-tree $(git symbolic-ref --short HEAD) $MODULE_DIR/ | awk '{ print $3 }' > $SUBMODULE_TRACKING_FILE
git add $SUBMODULE_TRACKING_FILE
git commit --amend -C HEAD --no-verify
fi
exit 0
Эта ловушка помещает текущий хеш фиксации в .submodule-hash
файл, этот файл необходимо передать в систему контроля версий.
3) Перейдите в проект сборки AWS Code.
Developer Tools > CodeBuild > Build projects > YOUR_PROJECT > Edit Environment
Добавьте переменную окружения с именем: GIT_KEY
, и значение будет закодировано в ssh key base 64. (Без разрывов строк, иначе не получится).
Вы можете преобразовать его онлайн или использовать любой инструмент или язык программирования.
4) На buildspec.yml
добавьте сценарий pre_build
.
version: 0.2
phases:
pre_build:
commands:
- bash build/aws-pre-build.sh
...
5) Создайте build/aws-pre-build.sh
со следующим содержанием:
#!/bin/bash
set -e
# Get root path
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
MODULE_HASH=$(cat $DIR/.submodule-hash);
GIT_HOST=bitbucket.org
MODULE_DIR=module
REPO=user/repo.git
if [[ ! -d ~/.ssh ]]; then
mkdir ~/.ssh
fi
if [[ ! -f ~/.ssh/known_hosts ]]; then
touch ~/.ssh/known_hosts
fi
# Base64 decode private key, and save it to ~/.ssh/git
echo "- Adding git private key"
echo $GIT_KEY | base64 -d > ~/.ssh/git
# Add correct permissions to key
chmod 600 ~/.ssh/git
# Add $GIT_HOST to ssh config
echo "- Adding ssh config file"
cat > ~/.ssh/config <<_EOF_
Host $GIT_HOST
User git
IdentityFile ~/.ssh/git
IdentitiesOnly yes
_EOF_
# Check if host is present in known_hosts
echo "- Checking $GIT_HOST in known_hosts"
if ! ssh-keygen -F $GIT_HOST > /dev/null; then
echo "- Adding $GIT_HOST to known hosts"
ssh-keyscan -t rsa $GIT_HOST >> ~/.ssh/known_hosts
fi
# AWS Code build does not send submodules, remove the empty folder
rm -rf $MODULE_DIR
# Clone submodule in the right folder
git clone git@$GIT_HOST:$REPO $MODULE_DIR
# cd to submodule
cd $DIR/$MODULE_DIR
# Checkout the right commit
echo "- Checking out $MODULE_HASH"
git checkout $MODULE_HASH
Дополнительно
Если у вас есть дополнительный шаг перед переходом к AWS Code Build, что-то вроде конвейеров bitbucket или аналогичных, вы можете проверить, соответствует ли фактический хэш подмодуля git хешу из сгенерированного файла: .submodule-hash
.
Если он не совпадает, это означает, что у тех, кто когда-либо нажимал, не было крючка git.
#!/bin/bash
$MODULE_DIR=module
echo "- Checking submodules integrity"
SUBMODULE_TRACKING_FILE=.submodule-hash
# Check submodule hash, this will be used by AWS Code Build to pull the correct version.
# AWS Code Build does not support git submodules at the moment
# https://forums.aws.amazon.com/thread.jspa?messageID=764680#764680
# Git submodule actual hash
SUBMODULE_HASH=$(git ls-tree $(git symbolic-ref --short HEAD) $MODULE_DIR/ | awk '{ print $3 }')
if [[ ! -e $SUBMODULE_TRACKING_FILE ]]; then
echo "ERROR: $SUBMODULE_TRACKING_FILE file not found."
submoduleError
exit 1
fi
# Custom submodule hash - The is used by AWS Code Build
SUBMODULE_TRACKING_FILE_HASH=$(cat $SUBMODULE_TRACKING_FILE)
if [[ "$SUBMODULE_TRACKING_FILE_HASH" != "$SUBMODULE_HASH" ]]; then
echo "ERROR: $SUBMODULE_TRACKING_FILE file content does not match submodule hash: $SUBMODULE_HASH"
echo -e "\tYou should have pre-commit && post-commit hook enabled or update $SUBMODULE_TRACKING_FILE manually:"
echo -e "\tcmd: git ls-tree $(git symbolic-ref --short HEAD) $MODULE_DIR/ | awk '{ print \$3 }' > $SUBMODULE_TRACKING_FILE"
exit 1
fi
ПРИМЕЧАНИЕ. Вы также можете создать этот файл в конвейере перед сборкой кода AWS, создать фиксацию, пометить его и отправить, чтобы запустить конвейер сборки кода AWS.
git ls-tree $(git symbolic-ref --short HEAD) module/ | awk '{ print \$3 }' > .submodule-hash
person
Marcos Casagrande
schedule
24.01.2019