Publish Legend Images #507
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Publish Legend Images | |
on: | |
workflow_dispatch: | |
schedule: | |
# Runs everyday at 00:00. (see https://crontab.guru) | |
- cron: "0 0 * * *" | |
jobs: | |
publish-images: | |
name: Publish Legend Images | |
runs-on: ubuntu-20.04 | |
env: | |
CHARMCRAFT_AUTH: "${{ secrets.CHARMHUB_TOKEN }}" | |
GH_TOKEN: "${{ secrets.GH_TOKEN }}" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
ref: edge | |
fetch-depth: 0 | |
- name: Checkout the FINOS Legend repo | |
uses: actions/checkout@v3 | |
with: | |
repository: finos/legend | |
path: legend | |
- name: Install Docker | |
uses: docker-practice/actions-setup-docker@master | |
- name: Install Dependencies | |
run: | | |
sudo snap install jq | |
sudo snap install charmcraft --classic | |
- name: Upload Docker images to Charmhub | |
run: | | |
set -x | |
release_charm_with_image(){ | |
charm_name="$1" | |
charm_resource="$2" | |
img_name="$3" | |
release_version="$4" | |
release_short=$(echo "${release_version}" | cut -d- -f1-2) | |
release_file="${GITHUB_WORKSPACE}/legend/releases/${release_version}/manifest.json" | |
# Getting the release version. | |
img_version=$(cat "${release_file}" | jq --raw-output ".core.\"${img_name}\"") | |
# Pulling the image. | |
image="${img_name}:${img_version}" | |
docker pull "${image}" | |
# Get the image SHA. charmcraft expects it without the sha:256 prefix, so we need to cut it. | |
image_sha=$(docker inspect --format '{{ .Id }}' ${image} | cut -d: -f2) | |
# Upload image to Charmhub. CHARMCRAFT_AUTH should be loaded in the environment, and | |
# it should have sufficient permissions to push the resource. | |
charmcraft upload-resource --quiet "${charm_name}" "${charm_resource}" --image=${image_sha} | |
# Get the last revision number and image revision number and release. | |
charm_rev=$(charmcraft revisions "${charm_name}" | awk 'FNR == 2 {print $1}') | |
img_rev=$(charmcraft resource-revisions "${charm_name}" "${charm_resource}" | awk 'FNR == 2 {print $1}') | |
charmcraft release "${charm_name}" --revision=${charm_rev} --channel="${release_short}/edge" --resource="${charm_resource}:${img_rev}" | |
# Also release it as the latest. | |
charmcraft release "${charm_name}" --revision=${charm_rev} --channel=edge --resource="${charm_resource}:${img_rev}" | |
} | |
# Filtering out releases older than 2022-04-01. | |
# Keep the latest release from the same month. | |
for release in $(ls -r $GITHUB_WORKSPACE/legend/releases/ | gawk '{ if ($1 > "2022-04-01") { print } }' | uniq -w 7 | sort) | |
do | |
echo "Treating ${release}..." | |
# If the current release was already published, skip. | |
if git show-ref --verify --quiet "refs/remotes/origin/release-${release}" | |
then | |
echo "Release ${release} already exists. Skipping." | |
continue | |
fi | |
release_charm_with_image finos-legend-studio-k8s studio-image finos/legend-studio "${release}" | |
release_charm_with_image finos-legend-engine-k8s engine-image finos/legend-engine-server "${release}" | |
release_charm_with_image finos-legend-sdlc-k8s sdlc-image finos/legend-sdlc-server "${release}" | |
# Dispatch the create-release.yaml workflow, which will create the release branch, | |
# create a commit that will make bundle.yaml point towards this release, and publish | |
# the bundle into Charmhub. | |
gh workflow run create_release.yaml -f release="${release}" | |
# Wait until the branch is created | |
branch_url_code=$(curl -s -o /dev/null -w "%{http_code}" https://github.com/finos/legend-juju-bundle/tree/release-${release}) | |
while [ $branch_url_code -ne 200 ] | |
do | |
branch_url_code=$(curl -s -o /dev/null -w "%{http_code}" https://github.com/finos/legend-juju-bundle/tree/release-${release}) | |
echo Waiting for release-${release} branch to be created | |
echo $branch_url_code | |
sleep 30 | |
done | |
# Create an overlay.yaml file for this release. | |
engine_version=$(cat "${release_file}" | jq --raw-output ".core.\"finos/legend-engine-server\"") | |
sdlc_version=$(cat "${release_file}" | jq --raw-output ".core.\"finos/legend-sdlc-server\"") | |
studio_version=$(cat "${release_file}" | jq --raw-output ".core.\"finos/legend-studio\"") | |
gh workflow run create_overlay.yaml -f release="${release}" \ | |
-f engine-image="finos/legend-engine-server:${engine_version}" \ | |
-f sdlc-image="finos/legend-sdlc-server:${sdlc_version}" \ | |
-f studio-image="finos/legend-studio:${studio_version}" | |
done | |
- name: Send Email on Failure | |
if: failure() && github.event_name == 'schedule' | |
uses: vineetchoudhary/mailgun-action@master | |
with: | |
api-key: ${{ secrets.MAILGUN_API_KEY }} | |
domain: ${{ secrets.MAILGUN_DOMAIN }} | |
to: ${{ secrets.EMAIL_TO }} | |
subject: "${{ github.job }} job of ${{ github.repository }} has failed" | |
body: "${{ github.job }} job in worflow ${{ github.workflow }} of ${{ github.repository }} has failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" | |
- name: Send Mail Action Response | |
run: echo "${{ steps.sendmail.outputs.response }}" |