首页 > 解决方案 > AWS s3 cp 无法从 gitlab 构建中找到文件?

问题描述

我正在开发一个 Gitlab CI 项目,我必须将 APK 推送到我们的 aws S3 存储桶,因为我已经在存储库的项目设置中指定了环境变量中的键,现在这是我的gitlab-ci.yml文件:

stages:
  - build
  - deploy

variables:
  AWS_DEFAULT_REGION: us-east-2 # The region of our S3 bucket
  BUCKET_NAME: abc.bycket.info         # bucket name
  FILE_NAME: ConfuRefac.apk

assembleDebug:
  stage: build
  script:
    - export ANDROID_HOME=/home/bitnami/android-sdk-linux
    - export ANDROID_NDK_HOME=/opt/android-ndk
    - export PATH=$PATH:/home/bitnami/android-sdk-linux/platform-tools/
    - export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
    - export PATH=/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin:$PATH
    - chmod +x ./gradlew
    - ./gradlew assembleDebug
    - cd app/build/outputs/apk/debug
    - mv app-debug.apk ${FILE_NAME}
  artifacts:
    paths:
      - app/build/outputs/apk/debug/${FILE_NAME}

deploys3:
  image: "python:latest"  # We use python because there is a well-working AWS Sdk
  stage: deploy
  dependencies:
    - assembleDebug
  script:
    - pip install awscli
    - cd app/build/outputs/apk/debug/
    - ls && pwd
    - aws s3 cp ${FILE_NAME} s3://${BUCKET_NAME}/${FILE_NAME} --recursive

ls因此,当部署阶段开始启动时,即使您可以清楚地看到该文件确实存在,它也找不到该文件。

错误

Collecting futures<4.0.0,>=2.2.0; python_version == "2.7" (from s3transfer<0.4.0,>=0.3.0->awscli)
       Using cached https://files.pythonhosted.org/packages/d8/a6/f46ae3f1da0cd4361c344888f59ec2f5785e69c872e175a748ef6071cdb5/futures-3.3.0-py2-none-any.whl
     Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore==1.16.13->awscli)
       Using cached https://files.pythonhosted.org/packages/65/eb/1f97cb97bfc2390a276969c6fae16075da282f5058082d4cb10c6c5c1dba/six-1.14.0-py2.py3-none-any.whl
     Installing collected packages: urllib3, docutils, jmespath, six, python-dateutil, botocore, pyasn1, rsa, futures, s3transfer, PyYAML, colorama, awscli
     Successfully installed PyYAML-5.3.1 awscli-1.18.63 botocore-1.16.13 colorama-0.4.3 docutils-0.15.2 futures-3.3.0 jmespath-0.10.0 pyasn1-0.4.8 python-dateutil-2.8.1 rsa-3.4.2 s3transfer-0.3.3 six-1.14.0 urllib3-1.25.9
     You are using pip version 8.1.1, however version 20.1.1 is available.
     You should consider upgrading via the 'pip install --upgrade pip' command.
     $ cd ${PWD}/app/build/outputs/apk/debug/
     $ ls && pwd
     ConfuRefac.apk
     /home/gitlab-runner/builds/CeGhSYCJ/0/root/confu-android/app/build/outputs/apk/debug
     $ aws s3 cp ${PWD}/${FILE_NAME} s3://${BUCKET_NAME}/${FILE_NAME} --recursive
     warning: Skipping file /home/gitlab-runner/builds/CeGhSYCJ/0/root/confu-android/app/build/outputs/apk/debug/ConfuRefac.apk/. File does not exist.

    Running after_script
    00:00
    Uploading artifacts for failed job
    00:01
     ERROR: Job failed: exit status 1

标签: amazon-web-servicesamazon-s3continuous-integrationgitlabdevops

解决方案


正如我在评论中指出的那样,问题是由于--recursive将 ${FILE_NAME} 视为目录而不是文件而引起的。

这当然是有道理的,因为不能递归地复制单个文件。


推荐阅读