我试图在我的应用程序中使用私有git repo作为子模块。在本地我可以克隆我的主仓库并正确拉出所有子模块。
我正在使用GitLab.com作为我的托管和跑步者。在GitLab的跑步者中,一个GitHub托管的公共仓库很好,但私人GitLab托管仓库将不会提取最新的代码。我是主项目的所有者以及私有子模块。
我注意到这是在我制作并在我的主项目工作时将更改推送到子模块之后开始的。
当我尝试在GitLab运行器上进行自动构建时,子模块将会拉动,但即使它显示正确的(当前/最新的)Git Ref SHA1,文件也会在很久以前的提交中显示出来。我已经尝试了很多方法来获取私有仓库,并且我已经对我的子模块进行了无关紧要的更改。即便如此,我仍然无法提取最新版本的子模块代码。
我已经尝试使用内置的GitLab runner variables来拉取子模块,我已经设置了before_script来尝试手动拉动。
我还确保更新我的本地子模块并将更改提交到我的主仓库。
这是使用GitLab runner变量
variables:
GIT_SUBMODULE_STRATEGY: recursive
这是脚本之前的一个示例,我尝试了这个,有没有设置GIT_SUBMODULE_STRATEGY:没有我尝试过这种删除和添加行试图获取最新代码的许多变体。
- git submodule sync --recursive
- git submodule update --force --recursive --remote
- git submodule foreach git pull
- git submodule status
- git submodule foreach git log -1
预期:GitLab runner应该在子模块的分支上提取最新的提交。
实际:GitLab拉取子模块,但是即使显示的提交是最新的,在某个提交后代码也不会显示。
在上周试图解决这个问题之后,我今天找到了一个解决方案。我发现this question帮助了我的最终解决方案。
这是我的gitlab-ci.yml
stages:
- deployGAE
deploy_production:
image: google/cloud-sdk:alpine
stage: deployGAE
# variables:
# GIT_SUBMODULE_STRATEGY: recursive
environment:
name: Production
only:
- master
before_script:
- git submodule update --init --remote --merge
- git submodule status
- git submodule foreach git log -1
script:
# Set GCloud service account key
- echo $SERVICE_ACCOUNT > /tmp/$CI_PIPELINE_ID.json
# Authenticate to GCloud API
- gcloud auth activate-service-account --key-file /tmp/$CI_PIPELINE_ID.json
# Globally set the GCLoud project for future commands
- gcloud config set project $PROJECT_ID
# Deploy the app to GCloud Build for deployment on App Engine
- gcloud --quiet app deploy app.yaml #--verbosity=info
# Remove versions that are no longer serving traffic
- gcloud --quiet app versions delete $(gcloud app versions list --sort-by '~version' --format 'value(version.id)' --filter="TRAFFIC_SPLIT:0.00")
after_script:
# Remove the GCloud service account key
- rm /tmp/$CI_PIPELINE_ID.json