Skip to content

Publish Legend Images #466

Publish Legend Images

Publish Legend Images #466

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 }}"