From 35df0be3a0d690e55d064635d2518adc03db292e Mon Sep 17 00:00:00 2001 From: Kristian Klausen <kristian@klausen.dk> Date: Wed, 3 Feb 2021 11:47:08 +0100 Subject: [PATCH] Add new role which sync arch-boxes images to the repos Fix #272 --- playbooks/gemini.archlinux.org.yml | 1 + .../files/arch-boxes-sync.service | 6 ++++ .../arch_boxes_sync/files/arch-boxes-sync.sh | 34 +++++++++++++++++++ .../files/arch-boxes-sync.timer | 10 ++++++ roles/arch_boxes_sync/tasks/main.yml | 17 ++++++++++ 5 files changed, 68 insertions(+) create mode 100644 roles/arch_boxes_sync/files/arch-boxes-sync.service create mode 100755 roles/arch_boxes_sync/files/arch-boxes-sync.sh create mode 100644 roles/arch_boxes_sync/files/arch-boxes-sync.timer create mode 100644 roles/arch_boxes_sync/tasks/main.yml diff --git a/playbooks/gemini.archlinux.org.yml b/playbooks/gemini.archlinux.org.yml index db2ebfc4f..f34939346 100644 --- a/playbooks/gemini.archlinux.org.yml +++ b/playbooks/gemini.archlinux.org.yml @@ -18,6 +18,7 @@ - { role: nginx } - { role: archusers } - { role: dbscripts, repos_domain: "repos.archlinux.org", repos_rsync_domain: "rsync.archlinux.org", svntogit_repos: "/srv/svntogit/repos", postgres_ssl: 'on', tags: ['archusers'] } + - { role: arch_boxes_sync } - { role: archweb, archweb_site: false, archweb_services: true, archweb_mirrorcheck_locations: [5, 6] } - { role: sources, sources_domain: "sources.archlinux.org", sources_dir: "/srv/sources" } - { role: archive } diff --git a/roles/arch_boxes_sync/files/arch-boxes-sync.service b/roles/arch_boxes_sync/files/arch-boxes-sync.service new file mode 100644 index 000000000..cff90390d --- /dev/null +++ b/roles/arch_boxes_sync/files/arch-boxes-sync.service @@ -0,0 +1,6 @@ +[Unit] +Description=Sync arch-boxes releases + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/arch-boxes-sync diff --git a/roles/arch_boxes_sync/files/arch-boxes-sync.sh b/roles/arch_boxes_sync/files/arch-boxes-sync.sh new file mode 100755 index 000000000..902a56aed --- /dev/null +++ b/roles/arch_boxes_sync/files/arch-boxes-sync.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -o nounset -o errexit -o pipefail +# https://docs.gitlab.com/ee/api/README.html#namespaced-path-encoding +readonly PROJECT_ID="archlinux%2Farch-boxes" +readonly JOB_NAME="build:secure" +readonly ARCH_BOXES_PATH="/srv/ftp/images" +readonly MAX_RELEASES="6" # 3 months + +RELEASES="$(curl --silent --show-error --fail "https://gitlab.archlinux.org/api/v4/projects/${PROJECT_ID}/releases")" +LATEST_RELEASE_TAG="$(jq -r .[0].tag_name <<< "${RELEASES}")" + +if [[ -d ${ARCH_BOXES_PATH}/${LATEST_RELEASE_TAG} ]]; then + echo "Nothing to do" + exit +fi +echo "Adding release: ${LATEST_RELEASE_TAG}" + +readonly TMPDIR="$(mktemp --directory --tmpdir="/var/tmp")" +trap "rm -rf \"${TMPDIR}\"" EXIT +cd "${TMPDIR}" + +curl --silent --show-error --fail --output "output.zip" "https://gitlab.archlinux.org/api/v4/projects/${PROJECT_ID}/jobs/artifacts/${LATEST_RELEASE_TAG}/download?job=${JOB_NAME}" +mkdir "${LATEST_RELEASE_TAG}" +unzip output.zip +# People should download the vagrant images from Vagrant Cloud +rm output/*.box{,.*} +mv output/* "${LATEST_RELEASE_TAG}" + +mv "${LATEST_RELEASE_TAG}" "${ARCH_BOXES_PATH}/" +ln -sf "${LATEST_RELEASE_TAG}" "${ARCH_BOXES_PATH}/latest" + +echo "Removing old releases" +cd "${ARCH_BOXES_PATH}" +comm --output-delimiter="" -3 <({ ls | grep -v latest | sort -r | head -n "${MAX_RELEASES}"; echo latest; } | sort) <(ls | sort) | xargs --no-run-if-empty rm -rvf diff --git a/roles/arch_boxes_sync/files/arch-boxes-sync.timer b/roles/arch_boxes_sync/files/arch-boxes-sync.timer new file mode 100644 index 000000000..dec9d8d83 --- /dev/null +++ b/roles/arch_boxes_sync/files/arch-boxes-sync.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Sync arch-boxes releases hourly + +[Timer] +OnCalendar=hourly +RandomizedDelaySec=1h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/roles/arch_boxes_sync/tasks/main.yml b/roles/arch_boxes_sync/tasks/main.yml new file mode 100644 index 000000000..0f2eacc1a --- /dev/null +++ b/roles/arch_boxes_sync/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install arch-boxes-sync.sh script dependencies + pacman: name=curl,jq,unzip state=present + +- name: install arch-boxes-sync.sh script + copy: src=arch-boxes-sync.sh dest=/usr/local/bin/ owner=root group=root mode=0755 + +- name: install arch-boxes-sync.{service,timer} + copy: src={{ item }} dest=/etc/systemd/system/{{ item }} owner=root group=root mode=0644 + loop: + - arch-boxes-sync.service + - arch-boxes-sync.timer + notify: + - daemon reload + +- name: start and enable arch-boxes-sync.timer + systemd: name=arch-boxes-sync.timer enabled=yes daemon_reload=yes state=started -- GitLab