diff --git a/.travis.yml b/.travis.yml index f0c67e2..b366956 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,29 @@ +language: cpp +compiler: clang +sudo: require +dist: xenial +cache: + ccache: true + directories: + - $HOME/.ccache + - $HOME/.cache/apt + #- $HOME/.cache/mpv-build -matrix: - include: - - env: PLATFORM='linux64' - os: linux - dist: xenial - compiler: clang - language: cpp - sudo: require - cache: - ccache: true - directories: - - $HOME/.ccache - - $HOME/.cache/apt - before_install: - - mkdir -p $HOME/.cache/apt/partial - - sudo rm -rf /var/cache/apt/archives - - sudo ln -s $HOME/.cache/apt /var/cache/apt/archives - - sudo add-apt-repository ppa:beineri/opt-qt-5.11.1-xenial -y - - sudo apt-get update - install: - - sudo apt-get -y install libjack0 libjack-dev nasm ccache qt511-meta-minimal qt511quickcontrols qt511quickcontrols2 qt511imageformats qt511svg libgl1-mesa-dev checkinstall - - sudo apt-get build-dep libmpv1 - - source /opt/qt*/bin/qt*-env.sh - script: - - bash scripts/build-mpv.sh - - bash scripts/makeappimage.sh +before_install: + - mkdir -p $HOME/.cache/apt/partial + - sudo rm -rf /var/cache/apt/archives + - sudo ln -s $HOME/.cache/apt /var/cache/apt/archives + - sudo add-apt-repository ppa:beineri/opt-qt-5.11.1-xenial -y + - sudo apt-get update + +install: + - sudo apt-get -y install libxpm-dev libcurl3 libcurl4-openssl-dev automake libtool desktop-file-utils libjack0 libjack-dev nasm ccache qt511-meta-minimal qt511quickcontrols qt511quickcontrols2 qt511imageformats qt511svg libgl1-mesa-dev checkinstall + - sudo apt-get build-dep libmpv1 + - source /opt/qt*/bin/qt*-env.sh + +script: + - bash scripts/build-mpv.sh + - bash scripts/makeappimage.sh after_success: - bash scripts/upload.sh diff --git a/scripts/ci-linux64.sh b/scripts/ci-linux64.sh deleted file mode 100644 index 1b7d4c2..0000000 --- a/scripts/ci-linux64.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -ex - -mkdir -p $HOME/.cache/apt/partial -sudo rm -rf /var/cache/apt/archives -sudo ln -s $HOME/.cache/apt /var/cache/apt/archives -sudo add-apt-repository ppa:beineri/opt-qt-5.11.1-xenial -y -sudo apt-get update - -sudo apt-get -y install libxpm-dev libcurl3 libcurl4-openssl-dev automake libtool desktop-file-utils libjack0 libjack-dev nasm ccache qt511-meta-minimal qt511quickcontrols qt511quickcontrols2 qt511imageformats qt511svg libgl1-mesa-dev checkinstall -sudo apt-get build-dep libmpv1 -source /opt/qt*/bin/qt*-env.sh - -bash scripts/build-mpv.sh -bash scripts/makeappimage.sh - -bash scripts/upload.sh \ No newline at end of file diff --git a/scripts/upload.sh b/scripts/upload.sh index 9a873cd..18df126 100755 --- a/scripts/upload.sh +++ b/scripts/upload.sh @@ -4,7 +4,6 @@ set -e export TEXT=`git log -1 --pretty=%B` export UPLOADTOOL_BODY="$TEXT\nTravis CI build log: https://travis-ci.com/$TRAVIS_REPO_SLUG/builds/$TRAVIS_BUILD_ID/" -curl --upload-file KittehPlayer*.AppImage https://transfer.sh/KittehPlayer-git.$(git rev-parse --short HEAD)-x86_64.AppImage wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh -bash upload.sh KittehPlayer*.AppImage* +bash upload.sh KittehPlayer*.AppImage* KittehPlayer*.exe echo "Done!" \ No newline at end of file diff --git a/upload.sh b/upload.sh new file mode 100644 index 0000000..a728eff --- /dev/null +++ b/upload.sh @@ -0,0 +1,258 @@ +#!/bin/bash + +set +x # Do not leak information + +# Exit immediately if one of the files given as arguments is not there +# because we don't want to delete the existing release if we don't have +# the new files that should be uploaded +for file in "$@" +do + if [ ! -e "$file" ] + then echo "$file is missing, giving up." >&2; exit 1 + fi +done + +if [ $# -eq 0 ]; then + echo "No artifacts to use for release, giving up." + exit 0 +fi + +if command -v sha256sum >/dev/null 2>&1 ; then + shatool="sha256sum" +elif command -v shasum >/dev/null 2>&1 ; then + shatool="shasum -a 256" # macOS fallback +else + echo "Neither sha256sum nor shasum is available, cannot check hashes" +fi + +# The calling script (usually .travis.yml) can set a suffix to be used for +# the tag and release name. This way it is possible to have a release for +# the output of the CI/CD pipeline (marked as 'continuous') and also test +# builds for other branches. +# If this build was triggered by a tag, call the result a Release +if [ ! -z "$UPLOADTOOL_SUFFIX" ] ; then + if [ "$UPLOADTOOL_SUFFIX" = "$TRAVIS_TAG" ] ; then + RELEASE_NAME="$TRAVIS_TAG" + RELEASE_TITLE="Release build ($TRAVIS_TAG)" + is_prerelease="false" + else + RELEASE_NAME="continuous-$UPLOADTOOL_SUFFIX" + RELEASE_TITLE="Continuous build ($UPLOADTOOL_SUFFIX)" + is_prerelease="true" + fi +else + if [ "$TRAVIS_TAG" != "" ]; then + RELEASE_NAME="$TRAVIS_TAG" + RELEASE_TITLE="Release build ($TRAVIS_TAG)" + is_prerelease="false" + else + RELEASE_NAME="continuous" # Do not use "latest" as it is reserved by GitHub + RELEASE_TITLE="Continuous build" + is_prerelease="true" + fi +fi + +if [ "$ARTIFACTORY_BASE_URL" != "" ]; then + echo "ARTIFACTORY_BASE_URL set, trying to upload to artifactory" + + if [ "$ARTIFACTORY_API_KEY" == "" ]; then + echo "Please set ARTIFACTORY_API_KEY" + exit 1 + fi + + files="$@" + + # artifactory doesn't support any kind of "artifact description", so we're uploading a text file containing the + # relevant details along with the other artifacts + tempdir=$(mktemp -d) + info_file="$tempdir"/build-info.txt + echo "Travis CI build log: https://travis-ci.org/$TRAVIS_REPO_SLUG/builds/$TRAVIS_BUILD_ID/" > "$info_file" + files+=("$info_file") + + set +x + + for file in ${files[@]}; do + url="${ARTIFACTORY_BASE_URL}/travis-${TRAVIS_BUILD_NUMBER}/"$(basename "$file") + md5sum=$(md5sum "$file" | cut -d' ' -f1) + sha1sum=$(sha1sum "$file" | cut -d' ' -f1) + sha256sum=$(sha256sum "$file" | cut -d' ' -f1) + echo "Uploading $file to $url" + hashsums=(-H "X-Checksum-Md5:$md5sum") + hashsums+=(-H "X-Checksum-Sha1:$sha1sum") + hashsums+=(-H "X-Checksum-Sha256:$sha256sum") + if ! curl -H 'X-JFrog-Art-Api:'"$ARTIFACTORY_API_KEY" "${hashsums[@]}" -T "$file" "$url"; then + echo "Failed to upload file, exiting" + rm -r "$tempdir" + exit 1 + fi + echo + echo "MD5 checksum: $md5sum" + echo "SHA1 checksum: $sha1sum" + echo "SHA256 checksum: $sha256sum" + done + rm -r "$tempdir" +fi + +if [ "$TRAVIS_EVENT_TYPE" == "pull_request" ] ; then + echo "Release uploading disabled for pull requests" + if [ "$ARTIFACTORY_BASE_URL" != "" ]; then + echo "Releases have already been uploaded to Artifactory, exiting" + exit 0 + else + echo "Release uploading disabled for pull requests, uploading to transfer.sh instead" + rm -f ./uploaded-to + for FILE in "$@" ; do + BASENAME="$(basename "${FILE}")" + curl --upload-file $FILE "https://transfer.sh/$BASENAME" > ./one-upload + echo "$(cat ./one-upload)" # this way we get a newline + echo -n "$(cat ./one-upload)\\n" >> ./uploaded-to # this way we get a \n but no newline + done + fi +# review_url="https://api.github.com/repos/${TRAVIS_REPO_SLUG}/pulls/${TRAVIS_PULL_REQUEST}/reviews" +# if [ -z $UPLOADTOOL_PR_BODY ] ; then +# body="Travis CI has created build artifacts for this PR here:" +# else +# body="$UPLOADTOOL_PR_BODY" +# fi +# body="$body\n$(cat ./uploaded-to)\nThe link(s) will expire 14 days from now." +# review_comment=$(curl -X POST \ +# --header "Authorization: token ${GITHUB_TOKEN}" \ +# --data '{"commit_id": "'"$TRAVIS_COMMIT"'","body": "'"$body"'","event": "COMMENT"}' \ +# $review_url) +# if echo $review_comment | grep -q "Bad credentials" 2>/dev/null ; then +# echo '"Bad credentials" response for --data {"commit_id": "'"$TRAVIS_COMMIT"'","body": "'"$body"'","event": "COMMENT"}' +# fi + $shatool "$@" + exit 0 +fi + +if [ ! -z "$TRAVIS_REPO_SLUG" ] ; then + # We are running on Travis CI + echo "Running on Travis CI" + echo "TRAVIS_COMMIT: $TRAVIS_COMMIT" + REPO_SLUG="$TRAVIS_REPO_SLUG" + if [ -z "$GITHUB_TOKEN" ] ; then + echo "\$GITHUB_TOKEN missing, please set it in the Travis CI settings of this project" + echo "You can get one from https://github.com/settings/tokens" + exit 1 + fi +else + # We are not running on Travis CI + echo "Not running on Travis CI" + if [ -z "$REPO_SLUG" ] ; then + read -r -p "Repo Slug (GitHub and Travis CI username/reponame): " REPO_SLUG + fi + if [ -z "$GITHUB_TOKEN" ] ; then + read -r -s -p "Token (https://github.com/settings/tokens): " GITHUB_TOKEN + fi +fi + +tag_url="https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME" +tag_infos=$(curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" "${tag_url}") +echo "tag_infos: $tag_infos" +tag_sha=$(echo "$tag_infos" | grep '"sha":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) +echo "tag_sha: $tag_sha" + +release_url="https://api.github.com/repos/$REPO_SLUG/releases/tags/$RELEASE_NAME" +echo "Getting the release ID..." +echo "release_url: $release_url" +release_infos=$(curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" "${release_url}") +echo "release_infos: $release_infos" +release_id=$(echo "$release_infos" | grep "\"id\":" | head -n 1 | tr -s " " | cut -f 3 -d" " | cut -f 1 -d ",") +echo "release ID: $release_id" +upload_url=$(echo "$release_infos" | grep '"upload_url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) +echo "upload_url: $upload_url" +release_url=$(echo "$release_infos" | grep '"url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) +echo "release_url: $release_url" +target_commit_sha=$(echo "$release_infos" | grep '"target_commitish":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) +echo "target_commit_sha: $target_commit_sha" + +if [ "$TRAVIS_COMMIT" != "$target_commit_sha" ] ; then + + echo "TRAVIS_COMMIT != target_commit_sha, hence deleting $RELEASE_NAME..." + + if [ ! -z "$release_id" ]; then + delete_url="https://api.github.com/repos/$REPO_SLUG/releases/$release_id" + echo "Delete the release..." + echo "delete_url: $delete_url" + curl -XDELETE \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + "${delete_url}" + fi + + # echo "Checking if release with the same name is still there..." + # echo "release_url: $release_url" + # curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" \ + # "$release_url" + + if [ "$is_prerelease" = "true" ] ; then + # if this is a continuous build tag, then delete the old tag + # in preparation for the new release + echo "Delete the tag..." + delete_url="https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME" + echo "delete_url: $delete_url" + curl -XDELETE \ + --header "Authorization: token ${GITHUB_TOKEN}" \ + "${delete_url}" + fi + + echo "Create release..." + + if [ -z "$TRAVIS_BRANCH" ] ; then + TRAVIS_BRANCH="master" + fi + + if [ ! -z "$TRAVIS_JOB_ID" ] ; then + if [ -z "${UPLOADTOOL_BODY+x}" ] ; then + # TODO: The host could be travis-ci.org (legacy open source) or travis-ci.com (subscription or latest open source). + BODY="Travis CI build log: https://travis-ci.org/$REPO_SLUG/builds/$TRAVIS_BUILD_ID/" + else + BODY="$UPLOADTOOL_BODY" + fi + else + BODY="$UPLOADTOOL_BODY" + fi + + release_infos=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \ + --data '{"tag_name": "'"$RELEASE_NAME"'","target_commitish": "'"$TRAVIS_COMMIT"'","name": "'"$RELEASE_TITLE"'","body": "'"$BODY"'","draft": false,"prerelease": '$is_prerelease'}' "https://api.github.com/repos/$REPO_SLUG/releases") + + echo "$release_infos" + + unset upload_url + upload_url=$(echo "$release_infos" | grep '"upload_url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) + echo "upload_url: $upload_url" + + unset release_url + release_url=$(echo "$release_infos" | grep '"url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1) + echo "release_url: $release_url" + +fi # if [ "$TRAVIS_COMMIT" != "$tag_sha" ] + +if [ -z "$release_url" ] ; then + echo "Cannot figure out the release URL for $RELEASE_NAME" + exit 1 +fi + +echo "Upload binaries to the release..." + +for FILE in "$@" ; do + FULLNAME="${FILE}" + BASENAME="$(basename "${FILE}")" + curl -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github.manifold-preview" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @$FULLNAME \ + "$upload_url?name=$BASENAME" + echo "" +done + +$shatool "$@" + +if [ "$TRAVIS_COMMIT" != "$tag_sha" ] ; then + echo "Publish the release..." + + release_infos=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \ + --data '{"draft": false}' "$release_url") + + echo "$release_infos" +fi # if [ "$TRAVIS_COMMIT" != "$tag_sha" ]