Skip to content

Commit

Permalink
Closes #27, Closes #34 Mirror bootstrap build and deploy tooling (#35)
Browse files Browse the repository at this point in the history
Co-authored-by: Ryan Dool <[email protected]>
  • Loading branch information
trackleft and RyanDool authored Feb 14, 2024
1 parent 455a0ba commit 03e14b1
Show file tree
Hide file tree
Showing 9 changed files with 2,099 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/cdn-deploy-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
deploy:
name: Build & deploy CDN assets
runs-on: ubuntu-20.04
runs-on: ubuntu-latest

steps:
- name: Checkout
Expand Down
34 changes: 8 additions & 26 deletions .github/workflows/cdn-deploy-release.yml
Original file line number Diff line number Diff line change
@@ -1,45 +1,27 @@
name: Build, tag, & deploy CDN assets for release
name: Deploy CDN assets for release
run-name: Deploy CDN assets to the `${{ github.event.client_payload.version }}` and `latest` buckets
on:
workflow_dispatch:
inputs:
version:
description: The version to tag and release
required: true

repository_dispatch:
types: az_icons_release
jobs:
deploy:
name: Build & deploy CDN assets
runs-on: ubuntu-20.04

name: Deploy CDN assets
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.client_payload.ref }}

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: "v${{ github.event.inputs.version }}"
release_name: "v${{ github.event.inputs.version }}"
draft: false
prerelease: false

- name: Deploy CDN assets to S3 + CloudFront
run: |
aws s3 sync --delete --cache-control max-age=691200 dist/. s3://${{ secrets.AZ_DIGITAL_CDN_BUCKET }}/lib/az-icons/${{ github.event.inputs.version }}/
aws cloudfront create-invalidation --distribution-id ${{ secrets.AZ_DIGITAL_CDN }} --paths /lib/az-icons/${{ github.event.inputs.version }}/*
aws s3 sync --delete --cache-control max-age=691200 dist/. s3://${{ secrets.AZ_DIGITAL_CDN_BUCKET }}/lib/az-icons/${{ github.event.client_payload.version }}/
aws cloudfront create-invalidation --distribution-id ${{ secrets.AZ_DIGITAL_CDN }} --paths /lib/az-icons/${{ github.event.client_payload.version }}/*
- name: Update 'latest' CDN assets to S3 + CloudFront
run: |
aws s3 sync --delete --cache-control max-age=691200 dist/. s3://${{ secrets.AZ_DIGITAL_CDN_BUCKET }}/lib/az-icons/latest/
Expand Down
119 changes: 119 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
name: Create Release
run-name: Create `${{ inputs.version }}` release from `${{ github.ref_name }}` branch
on:
workflow_dispatch:
inputs:
version:
description: The version to tag and release
required: true
jobs:
release:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
token: ${{ secrets.REPO_DISPATCH_TOKEN }}

- name: Set variables for Docker images
run: |
oldhash=${{ hashFiles('Dockerfile', 'package.json', 'package-lock.json', 'scripts/*') }}
registry='ghcr.io'
imageprefix="${registry}/${GITHUB_REPOSITORY}/"
imagename='az-nodejs-ephemeral'
imagestem="${imageprefix}${imagename}:"
echo "AZ_DOCKER_REGISTRY=${registry}" >> ${GITHUB_ENV}
echo "AZ_OLD_HASH=${oldhash}" >> ${GITHUB_ENV}
echo "AZ_IMAGE_STEM=${imagestem}" >> ${GITHUB_ENV}
echo "AZ_ICONS_SOURCE_DIR=/az-icons-src" >> ${GITHUB_ENV}
echo "AZ_ICONS_FROZEN_DIR=/azbuild/az-icons" >> ${GITHUB_ENV}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Docker authentication
run: |
docker login "$AZ_DOCKER_REGISTRY" -u "$GITHUB_ACTOR" -p ${{ secrets.GITHUB_TOKEN }}
- name: Unconditionally rebuild and save the Docker image
run: |
workingtitle=$(docker build -q . )
tempname="old${AZ_OLD_HASH}"
docker run --name "$tempname" "$workingtitle" true
docker cp -a "${tempname}:${AZ_ICONS_FROZEN_DIR}/." .
docker rm "$tempname"
lockhash=${{ hashFiles('Dockerfile', 'package.json', 'package-lock.json', 'scripts/*') }}
ephemeral="${AZ_IMAGE_STEM}${lockhash}"
docker tag "$workingtitle" "$ephemeral"
docker push "$ephemeral"
echo "AZ_EPHEMERAL_IMAGE=${ephemeral}" >> ${GITHUB_ENV}
- name: Build variables
run: |
echo "AZ_VERSION=${{ github.event.inputs.version }}" >> ${GITHUB_ENV}
- name: Update version
run: |
sudo touch config.yml
sudo find . -path "./.git" -prune -o -exec chown 1000:1000 {} \;
sudo chown 1000:1000 .
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
git config --global user.name "${GITHUB_ACTOR}"
docker run --rm -e "AZ_RELEASE_VERSION=${AZ_VERSION}" -v $(pwd):"${AZ_ICONS_SOURCE_DIR}" "$AZ_EPHEMERAL_IMAGE" create-release
git add dist package.json package-lock.json
git commit -m '${{ github.event.inputs.version }}'
git push
echo "RELEASE_SHA=$(git rev-parse HEAD)" >> ${GITHUB_ENV}
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v1
with:
target_commitish: ${{ env.RELEASE_SHA }}
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: "v${{ env.AZ_VERSION }}"
name: "v${{ env.AZ_VERSION }}"
draft: false
prerelease: false
body: |
Release v${{ env.AZ_VERSION }}
- name: Save new SHA to file
run: |
echo "{\"sha\": \"$(git rev-parse HEAD)\"}" > ${{ runner.temp }}/variables.json
- name: Upload variables
uses: actions/upload-artifact@v4
with:
name: variables-json-artifact
path: ${{ runner.temp }}

dispatch:
needs: release
strategy:
matrix:
repo:
- az-digital/az-icons
- az-digital/az-icons-packagist
runs-on: ubuntu-latest
steps:
- name: Download variables
uses: actions/download-artifact@v4
with:
name: variables-json-artifact
path: ${{ runner.temp }}

- name: Update environment variables
run: |
variablesfile=${{ runner.temp }}/variables.json
echo "RELEASE_SHA=$(cat ${variablesfile} | jq -r '.sha' )" >> ${GITHUB_ENV}
echo "BRANCH_NAME=${GITHUB_REF_NAME}" >> ${GITHUB_ENV}
- name: Notify dependencies
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.REPO_DISPATCH_TOKEN }}
repository: ${{ matrix.repo }}
event-type: az_icons_release
client-payload: '{"version": "${{ github.event.inputs.version }}", "ref": "${{ env.RELEASE_SHA }}", "sha": "${{ env.RELEASE_SHA }}", "branch": "${{env.BRANCH_NAME}}"}'
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,3 @@ Thumbs.db
*.flv
*.mov
*.wmv

### NPM ###
package-lock.json
37 changes: 37 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
FROM node:16.17.1-bullseye-slim

ENV LANG C.UTF-8

COPY scripts/copy-npm-config.sh /usr/local/bin/copy-npm-config
COPY scripts/create-release.sh /usr/local/bin/create-release

# Build args don't normally persist as environment variables.
ARG AZ_ICONS_FROZEN_DIR
ENV AZ_ICONS_FROZEN_DIR ${AZ_ICONS_FROZEN_DIR:-/azbuild/az-icons}
ARG AZ_ICONS_SOURCE_DIR
ENV AZ_ICONS_SOURCE_DIR ${AZ_ICONS_SOURCE_DIR:-/az-icons-src}

# Silence warnings from the update-notifier npm package.
ENV NO_UPDATE_NOTIFIER 1

WORKDIR $AZ_ICONS_SOURCE_DIR

# COPY "package.json" "$AZ_ICONS_FROZEN_DIR"/

RUN apt-get update \
&& apt-get install --no-install-recommends -y \
git \
python3 \
python3-pip \
python3-setuptools \
python3-wheel \
rsync \
&& rm -rf /var/lib/apt/lists/* \
&& pip3 install 'awscli~=1.19.41' \
&& cd "${AZ_ICONS_FROZEN_DIR}" \
&& npm config set cache='/tmp/.npm' \
&& chmod 755 /root \
&& chmod 644 /root/.npmrc \
&& npm install -g [email protected] \
&& npm install \
&& find node_modules -name '.DS_Store' -exec rm {} \;
Loading

0 comments on commit 03e14b1

Please sign in to comment.