default:
  image: python:3.7


#cache:
#  directories:
#    - $HOME/venv
#    - $HOME/.cache/pip
#    - $HOME/Library/Caches/pip
#    - $HOME/Library/Caches/Homebrew
#    - $TRAVIS_BUILD_DIR/.tox


stages:
  - test
  - build
  - assets
  - release


.tagged:
  rules:
    - if: '$CI_COMMIT_TAG =~ /^v[0-9\.]+$/'
      when: on_success



test:lint:
  stage: test
  script:
    - make install tools
    - make lint

test:unit:
  stage: test
  script:
    - make install tools
    - HOME=/tmp coverage run -p --source=lbry -m unittest discover -vv tests.unit

test:datanetwork-integration:
  stage: test
  script:
    - pip install tox-travis
    - tox -e datanetwork

test:blockchain-integration:
  stage: test
  script:
    - pip install tox-travis
    - tox -e blockchain

test:other-integration:
  stage: test
  script:
    - apt-get update
    - apt-get install -y --no-install-recommends ffmpeg
    - pip install tox-travis
    - tox -e other

test:json-api:
  stage: test
  script:
    - make install tools
    - HOME=/tmp coverage run -p --source=lbry scripts/generate_json_api.py



.build:
  stage: build
  artifacts:
    expire_in: 1 day
    paths:
      - lbrynet-${OS}.zip
  script:
    - pip install --upgrade 'setuptools<45.0.0'
    - pip install pyinstaller
    - pip install -e .
    - python3.7 docker/set_build.py # must come after lbry is installed because it imports lbry
    - pyinstaller --onefile --name lbrynet lbry/extras/cli.py
    - chmod +x dist/lbrynet
    - zip --junk-paths ${CI_PROJECT_DIR}/lbrynet-${OS}.zip dist/lbrynet  # gitlab expects artifacts to be in $CI_PROJECT_DIR
    - openssl dgst -sha256 ${CI_PROJECT_DIR}/lbrynet-${OS}.zip | egrep -o [0-9a-f]+$ # get sha256 of asset. works on mac and ubuntu
    - dist/lbrynet --version

build:linux:
  extends: .build
  image: ubuntu:18.04  # cant use python3.7 image - binary won't run on ubuntu
  variables:
    OS: linux
  before_script:
    - apt-get update
    - apt-get install -y --no-install-recommends software-properties-common zip curl build-essential
    - add-apt-repository -y ppa:deadsnakes/ppa
    - apt-get install -y --no-install-recommends python3.7-dev python3-setuptools python3-wheel
    - python3.7 <(curl -q https://bootstrap.pypa.io/get-pip.py) # make sure we get pip with python3.7

build:mac:
  extends: .build
  tags: [macos] # makes gitlab use the mac runner
  variables:
    OS: mac
    GIT_DEPTH: 5
    VENV: /tmp/gitlab-lbry-sdk-venv
  before_script:
#    - brew upgrade python || true
    - python3 --version | grep -q '^Python 3\.7\.' # dont upgrade python on every run. just make sure we're on the right Python
#    - pip3 install --user --upgrade pip virtualenv
    - pip3 --version | grep -q '\(python 3\.7\)'
    - virtualenv --python=python3.7 "${VENV}"
    - source "${VENV}/bin/activate"
  after_script:
    - rm -rf "${VENV}"

build:windows:
  extends: .build
  tags: [windows] # makes gitlab use the windows runner
  variables:
    OS: windows
    GIT_DEPTH: 5
  before_script:
    - ./docker/install_choco.ps1
    - choco install -y --x86 python3 7zip checksum
    - python --version # | findstr /B "Python 3\.7\." # dont upgrade python on every run. just make sure we're on the right Python
    - pip --version # | findstr /E '\(python 3\.7\)'
    - pip install virtualenv pywin32
    - virtualenv venv
    - venv/Scripts/activate.ps1
    - pip install pip==19.3.1; $true # $true ignores errors. need this to get the correct coincurve wheel. see commit notes for details.
  after_script:
    - rmdir -Recurse venv
  script:
    - pip install --upgrade 'setuptools<45.0.0'
    - pip install pyinstaller==3.5
    - pip install -e .
    - python docker/set_build.py # must come after lbry is installed because it imports lbry
    - pyinstaller --additional-hooks-dir=scripts/. --icon=icons/lbry256.ico -F -n lbrynet lbry/extras/cli.py
    - 7z a -tzip $env:CI_PROJECT_DIR/lbrynet-${OS}.zip ./dist/lbrynet.exe
    - checksum --type=sha256 --file=$env:CI_PROJECT_DIR/lbrynet-${OS}.zip
    - dist/lbrynet.exe --version



# s3 = upload asset to s3 (build.lbry.io)
.s3:
  stage: assets
  variables:
    GIT_STRATEGY: none
  script:
    - "[ -f lbrynet-${OS}.zip ]" # check that asset exists before trying to upload
    - pip install awscli
    - S3_PATH="daemon/gitlab-build-${CI_PIPELINE_ID}_commit-${CI_COMMIT_SHA:0:7}$( if [ ! -z ${CI_COMMIT_TAG} ]; then echo _tag-${CI_COMMIT_TAG}; else echo _branch-${CI_COMMIT_REF_NAME}; fi )"
    - AWS_ACCESS_KEY_ID=${ARTIFACTS_KEY} AWS_SECRET_ACCESS_KEY=${ARTIFACTS_SECRET} AWS_REGION=${ARTIFACTS_REGION}
      aws s3 cp lbrynet-${OS}.zip s3://${ARTIFACTS_BUCKET}/${S3_PATH}/lbrynet-${OS}.zip

s3:linux:
  extends: .s3
  variables: {OS: linux}
  needs: ["build:linux"]

s3:mac:
  extends: .s3
  variables: {OS: mac}
  needs: ["build:mac"]

s3:windows:
  extends: .s3
  variables: {OS: windows}
  needs: ["build:windows"]



# github = upload assets to github when there's a tagged release
.github:
  extends: .tagged
  stage: assets
  variables:
    GIT_STRATEGY: none
  script:
    - "[ -f lbrynet-${OS}.zip ]" # check that asset exists before trying to upload. githubrelease won't error if its missing
    - pip install githubrelease
    - githubrelease --no-progress --github-token ${GITHUB_CI_USER_ACCESS_TOKEN} asset lbryio/lbry-sdk upload ${CI_COMMIT_TAG} lbrynet-${OS}.zip

github:linux:
  extends: .github
  variables: {OS: linux}
  needs: ["build:linux"]

github:mac:
  extends: .github
  variables: {OS: mac}
  needs: ["build:mac"]

github:windows:
  extends: .github
  variables: {OS: windows}
  needs: ["build:windows"]



publish:
  extends: .tagged
  stage: release
  variables:
    GIT_STRATEGY: none
  script:
    - pip install githubrelease
    - githubrelease --no-progress --github-token ${GITHUB_CI_USER_ACCESS_TOKEN} release lbryio/lbry-sdk publish ${CI_COMMIT_TAG}
    - >
      curl -X POST -H 'Content-type: application/json' --data '{"text":"<!channel> There is a new SDK release: https://github.com/lbryio/lbry-sdk/releases/tag/'"${CI_COMMIT_TAG}"'\n'"$(curl -s "https://api.github.com/repos/lbryio/lbry-sdk/releases/tags/${CI_COMMIT_TAG}" | egrep '\w*\"body\":' | cut -d':' -f 2- | tail -c +3 | head -c -2)"'", "channel":"tech"}' "$(echo ${SLACK_WEBHOOK_URL_BASE64} | base64 -d)"