2022-12-23 23:09:14 -05:00
name : Publish Images
2022-12-23 20:26:05 -05:00
on :
push :
branches :
- main
2023-12-22 07:22:15 -05:00
# Don't grant any access by default
permissions : {}
2022-12-23 20:26:05 -05:00
jobs :
test :
name : Build and Test
2023-04-26 11:44:32 -04:00
runs-on : ubuntu-latest
2023-01-03 19:40:56 -05:00
concurrency :
2023-01-05 09:49:21 -05:00
group : ${{ github.workflow }}-main-${{ matrix.images.target }}
cancel-in-progress : true
2022-12-23 20:26:05 -05:00
permissions :
contents : read
deployments : write
issues : write
packages : write
strategy :
fail-fast : false
matrix :
images :
2023-12-20 11:45:35 -05:00
- prefix : slim-
2022-12-23 20:26:05 -05:00
target : slim
2023-12-20 11:45:35 -05:00
- prefix : ""
2023-10-20 19:08:40 -04:00
target : standard
2022-12-23 20:26:05 -05:00
timeout-minutes : 60
2023-10-19 17:03:14 -04:00
env :
CONTAINER_IMAGE_ID : "ghcr.io/super-linter/super-linter:${{ matrix.images.prefix }}latest"
CONTAINER_IMAGE_TARGET : "${{ matrix.images.target }}"
2022-12-23 20:26:05 -05:00
steps :
2023-12-07 09:18:47 -05:00
- name : Checkout Code
uses : actions/checkout@v4
- name : Set build metadata
run : |
if [[ ${{ github.event_name }} == 'push' ]] || [[ ${{ github.event_name }} == 'merge_group' ]]; then
BUILD_REVISION=${{ github.sha }}
BUILD_VERSION=${{ github.sha }}
elif [[ ${{ github.event_name }} == 'pull_request' ]]; then
BUILD_REVISION=${{ github.event.pull_request.head.sha }}
BUILD_VERSION=${{ github.event.pull_request.head.sha }}
else
echo "[ERROR] Event not supported when setting build revision and build version"
exit 1
fi
if [ -z "${BUILD_REVISION}" ]; then
echo "[ERROR] BUILD_REVISION is empty"
exit 1
fi
if [ -z "${BUILD_VERSION}" ]; then
echo "[ERROR] BUILD_VERSION is empty"
exit 1
fi
{
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
echo "BUILD_REVISION=${BUILD_REVISION}"
echo "BUILD_VERSION=${BUILD_VERSION}"
} >> "${GITHUB_ENV}"
2023-10-19 03:20:15 -04:00
- name : Free Disk space
shell : bash
run : |
sudo rm -rf /usr/local/lib/android
sudo rm -rf /usr/share/dotnet
2023-12-07 09:18:47 -05:00
- name : Set up Docker Buildx
uses : docker/setup-buildx-action@v3
2022-12-23 20:26:05 -05:00
2023-10-19 03:20:15 -04:00
- name : Build Image
uses : docker/build-push-action@v5
with :
context : .
file : ./Dockerfile
build-args : |
BUILD_DATE=${{ env.BUILD_DATE }}
2023-12-07 09:18:47 -05:00
BUILD_REVISION=${{ env.BUILD_REVISION }}
BUILD_VERSION=${{ env.BUILD_VERSION }}
2023-12-20 10:39:19 -05:00
cache-from : type=registry,ref=${{ env.CONTAINER_IMAGE_ID }}-buildcache
2023-10-19 03:20:15 -04:00
load : true
push : false
secrets : |
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
tags : |
2023-10-19 17:03:14 -04:00
${{ env.CONTAINER_IMAGE_ID }}
2023-10-19 03:20:15 -04:00
target : "${{ matrix.images.target }}"
- name : Run Test Suite
2023-10-19 17:03:14 -04:00
run : make test
2023-10-19 03:20:15 -04:00
2022-12-23 20:26:05 -05:00
- name : Login to GHCR
2023-09-21 02:56:49 -04:00
uses : docker/login-action@v3.0.0
2022-12-23 20:26:05 -05:00
with :
registry : ghcr.io
username : ${{ github.actor }}
password : ${{ secrets.GITHUB_TOKEN }}
2023-12-20 11:45:35 -05:00
- name : Start deployment
2023-01-23 08:00:45 -05:00
uses : bobheadxi/deployments@v1.4.0
2022-12-23 20:26:05 -05:00
id : deployment
with :
step : start
token : ${{ secrets.GITHUB_TOKEN }}
2023-12-20 11:45:35 -05:00
env : Production
2022-12-23 20:26:05 -05:00
- name : Build and Push Image
2023-09-18 15:01:58 -04:00
uses : docker/build-push-action@v5
2022-12-23 20:26:05 -05:00
with :
context : .
file : ./Dockerfile
build-args : |
BUILD_DATE=${{ env.BUILD_DATE }}
2023-12-07 09:18:47 -05:00
BUILD_REVISION=${{ env.BUILD_REVISION }}
BUILD_VERSION=${{ env.BUILD_VERSION }}
2023-12-20 10:39:19 -05:00
cache-from : type=registry,ref=${{ env.CONTAINER_IMAGE_ID }}-buildcache
2023-12-20 09:55:53 -05:00
cache-to : type=registry,ref=${{ env.CONTAINER_IMAGE_ID }}-buildcache,mode=max
2022-12-23 20:26:05 -05:00
load : false
push : true
2023-01-04 22:43:51 -05:00
secrets : |
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
2022-12-23 20:26:05 -05:00
tags : |
2023-10-19 17:03:14 -04:00
${{ env.CONTAINER_IMAGE_ID }}
2022-12-23 20:26:05 -05:00
target : "${{ matrix.images.target }}"
2023-12-20 11:45:35 -05:00
- name : Update deployment
2023-01-23 08:00:45 -05:00
uses : bobheadxi/deployments@v1.4.0
2023-12-19 05:10:53 -05:00
# We depend on the 'deployment' step outputs, so we can't run this step
# if the 'deployment' step didn't run. This can happen if any step
# before the 'deployment' step fails. That's why 'always()' is not
# suitable here.
if : steps.deployment.conclusion != 'cancelled' && steps.deployment.conclusion != 'skipped'
2023-12-20 08:58:25 -05:00
with :
step : finish
token : ${{ secrets.GITHUB_TOKEN }}
status : ${{ job.status }}
deployment_id : ${{ steps.deployment.outputs.deployment_id }}
env : ${{ steps.deployment.outputs.env }}
env_url : https://github.com/super-linter/super-linter
- name : Create Issue on Failure
uses : actions/github-script@v7
if : failure()
with :
github-token : ${{secrets.GITHUB_TOKEN}}
script : |
const create = await github.rest.issues.create({
owner : context.repo.owner,
repo : context.repo.repo,
title : "Failed to deploy to production" ,
body : "Automation has failed us!\nMore information can be found at:\n - ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" ,
assignees : [
"zkoppert" , "Hanse00" , "ferrarimarco"
]
})
release :
name : Release
needs :
- test
runs-on : ubuntu-latest
concurrency :
2023-12-20 09:55:53 -05:00
group : ${{ github.workflow }}-main-release
2023-12-20 08:58:25 -05:00
cancel-in-progress : true
permissions :
contents : write
deployments : write
issues : write
packages : write
pull-requests : write
timeout-minutes : 60
steps :
- uses : google-github-actions/release-please-action@v4
id : release
with :
config-file : .github/release-please/release-please-config.json
manifest-file : .github/release-please/.release-please-manifest.json
token : ${{ secrets.GITHUB_TOKEN }}
2023-12-20 09:55:53 -05:00
- name : Start deployment
2023-12-20 08:58:25 -05:00
if : steps.release.outputs.release_created
uses : bobheadxi/deployments@v1.4.0
id : deployment
with :
step : start
token : ${{ secrets.GITHUB_TOKEN }}
2023-12-20 11:45:35 -05:00
env : Release
2023-12-20 08:58:25 -05:00
- name : Configure release metedata
2023-12-20 09:55:53 -05:00
if : steps.release.outputs.release_created
2023-12-20 08:58:25 -05:00
# shellcheck disable=SC2062
run : |
RELEASE_VERSION="${{ steps.release.outputs.tag_name }}"
if [ -z "${RELEASE_VERSION}" ]; then
echo "Error RELEASE_VERSION is empty. Exiting..."
exit 1
fi
if ! echo "${RELEASE_VERSION}" | grep -E -o "v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+"; then
echo "Error: RELEASE_VERSION doesn't look like a semantic version: ${RELEASE_VERSION}"
exit 2
fi
SEMVER_MAJOR_VERSION=v${{ steps.release.outputs.major }}
{
echo "RELEASE_VERSION=${RELEASE_VERSION}"
echo "SEMVER_MAJOR_VERSION=${SEMVER_MAJOR_VERSION}"
} >> "${GITHUB_ENV}"
- name : Login to GHCR
if : steps.release.outputs.release_created
uses : docker/login-action@v3.0.0
with :
registry : ghcr.io
username : ${{ github.actor }}
password : ${{ secrets.GITHUB_TOKEN }}
# We don't rebuild the image to avoid that the latest tag and the release tags don't point to the very same container image.
# Instead, we pull the latest image and tag it.
- name : Retag and Push Images
if : steps.release.outputs.release_created
uses : akhilerm/tag-push-action@v2.1.0
with :
2023-12-20 09:55:53 -05:00
src : ghcr.io/super-linter/super-linter:latest
dst : |
ghcr.io/super-linter/super-linter:${{ env.SEMVER_MAJOR_VERSION }}
ghcr.io/super-linter/super-linter:${{ env.RELEASE_VERSION }}
- name : Retag and Push Images slim
if : steps.release.outputs.release_created
uses : akhilerm/tag-push-action@v2.1.0
with :
src : ghcr.io/super-linter/super-linter:slim-latest
2023-12-20 08:58:25 -05:00
dst : |
2023-12-20 09:55:53 -05:00
ghcr.io/super-linter/super-linter:slim-${{ env.SEMVER_MAJOR_VERSION }}
ghcr.io/super-linter/super-linter:slim-${{ env.RELEASE_VERSION }}
2023-12-20 08:58:25 -05:00
# No need to tag major.minor.patch because that tag is automatically created when creating the release
- name : Tag major, minor, and latest versions
if : steps.release.outputs.release_created
run : |
git tag --annotate --force ${{ env.SEMVER_MAJOR_VERSION }} -m "Release ${{ env.SEMVER_MAJOR_VERSION }}"
git tag --annotate --force latest -m "Release latest (${{ env.RELEASE_VERSION }})"
git push --force origin ${{ env.SEMVER_MAJOR_VERSION }}
git push --force origin latest
2023-12-20 09:55:53 -05:00
- name : Update deployment
2023-12-20 08:58:25 -05:00
uses : bobheadxi/deployments@v1.4.0
# We depend on the 'deployment' step outputs, so we can't run this step
# if the 'deployment' step didn't run. This can happen if any step
# before the 'deployment' step fails. That's why 'always()' is not
# suitable here.
if : steps.deployment.conclusion != 'cancelled' && steps.deployment.conclusion != 'skipped'
2022-12-23 20:26:05 -05:00
with :
step : finish
token : ${{ secrets.GITHUB_TOKEN }}
status : ${{ job.status }}
deployment_id : ${{ steps.deployment.outputs.deployment_id }}
env : ${{ steps.deployment.outputs.env }}
2023-05-25 19:59:32 -04:00
env_url : https://github.com/super-linter/super-linter
2022-12-23 20:26:05 -05:00
- name : Create Issue on Failure
2023-11-22 12:16:57 -05:00
uses : actions/github-script@v7
2023-01-03 19:40:56 -05:00
if : failure()
2022-12-23 20:26:05 -05:00
with :
github-token : ${{secrets.GITHUB_TOKEN}}
script : |
const create = await github.rest.issues.create({
owner : context.repo.owner,
repo : context.repo.repo,
title : "Failed to deploy to production" ,
2023-05-15 15:36:24 -04:00
body : "Automation has failed us!\nMore information can be found at:\n - ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" ,
2022-12-23 20:26:05 -05:00
assignees : [
2023-12-15 05:59:36 -05:00
"zkoppert" , "Hanse00" , "ferrarimarco"
2022-12-23 20:26:05 -05:00
]
})