diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7ee1f1..793ad38 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -55,3 +55,14 @@ description_templater: artifacts: paths: - "*.description" + +bot:package_update_notification: + image: alpine:latest + script: bash -e .utilities/package_update_notifier.sh + only: + - schedules + # see https://docs.gitlab.com/ce/ci/yaml/README.html#onlyexcept-advanced for feature updates + # refs: + # - schedules + # variables: + # - $SCHEDULE_ID == $PACKAGE_UPDATE_NOTIFICATION_SCHEDULE_ID \ No newline at end of file diff --git a/.utilities/package_update_notifier.sh b/.utilities/package_update_notifier.sh new file mode 100644 index 0000000..b0bcbef --- /dev/null +++ b/.utilities/package_update_notifier.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Docker Seafile client, help you mount a Seafile library as a volume. +# Copyright (C) 2019-2020, flow.gunso@gmail.com +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +apk add curl jq + +# Load utilities functions. +SCRIPT_DIRECTORY=$(dirname ${BASH_SOURCE[0]}) +source $SCRIPT_DIRECTORY/utilities.sh + +# Restrict the job to the right schedule. +if [[ "$SCHEDULE_ID" != "$PACKAGE_UPDATE_NOTIFICATION_SCHEDULE_ID" ]]; then + exit_with_message_and_code "Schedule ID did not match." 0 +fi + +# Fetch the issue state if the ISSUE_ID variable is set, +# if that state is closed remove the ISSUE_ID variable and continue the job, otherwise exit the job. +if [[ -n "$ISSUE_ID" ]]; then + issue_state="$(curl -H \"PRIVATE-TOKEN: $REPORTER_BOT_ACCESS_TOKEN\" \ + https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/issue/$ISSUE_ID | jq .state)" + if [[ "$issue_state" == "closed" ]]; then + echo "An issue exist, but is closed. Removing ISSUE_ID schedule variable..." + echo 'curl -X DELETE \ + -H "PRIVATE-TOKEN: $REPORTER_BOT_ACCESS_TOKEN" \ + https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipeline_schedules/$SCHEDULE_ID/variables/ISSUES_ID' + else + exit_with_message_and_code "An issue already exists, it is not closed yet." 0 + fi +fi + +# Get the installed and candidate versions of the seafile-cli package from the latest Docker image. +docker pull $CI_REGISTRY_IMAGE:latest +candidate_version=$(docker run --rm --entrypoint="" $CI_REGISTRY_IMAGE:latest \ + bash -c "\ + apt-get -qq update;\ + apt-cache policy seafile-cli | grep 'Candidate:' | awk '{print \$2}'") +installed_version=$(docker run --rm --entrypoint="" $CI_REGISTRY_IMAGE:latest \ + bash -c "\ + apt-get -qq update;\ + apt-cache policy seafile-cli | grep 'Installed:' | awk '{print \$2}'") + +# Create an issue if a new version was released. +if [[ "$installed_version" == "$candidate_version"]; then + exit_with_message_and_code "No new version of the seafile-cli package have been released." 0 +else + echo "A new version of the seafile-cli package have been released. Creating a new issue..." + data=$(jq -n \ + --arg title "seafile-cli v${candidate_version} was released" \ + --arg description "Check for new feature, breaking changes or anything worth updating to update the Docker image." \ + --arg labels "enhancement" \ + '{title: $title, description: $description, labels: [$labels]}') + echo 'curl -X POST \ + -H "PRIVATE-TOKEN: $REPORTER_BOT_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$data" + https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/issues' +fi diff --git a/.utilities/utilities.sh b/.utilities/utilities.sh index b115d67..b09c6bf 100644 --- a/.utilities/utilities.sh +++ b/.utilities/utilities.sh @@ -19,3 +19,8 @@ load_images_artifacts() { docker load --input $CI_PROJECT_NAME.tar } + +exit_with_message_and_code() { + echo $1 + exit $2 +}