Skip to content

AST CLI Release

AST CLI Release #982

Workflow file for this run

name: AST CLI Release
on:
workflow_call:
inputs:
tag:
description: "Next release tag"
required: true
type: string
dev:
description: "Is dev build"
required: false
default: true
type: boolean
secrets:
AC_PASSWORD:
required: true
AC_USER:
required: true
APPLE_DEVELOPER_CERTIFICATE_P12_BASE64:
required: true
APPLE_DEVELOPER_CERTIFICATE_PASSWORD:
required: true
AWS_ASSUME_ROLE_ARN:
required: true
AWS_ASSUME_ROLE_REGION:
required: true
COSIGN_PASSWORD:
required: true
COSIGN_PRIVATE_KEY:
required: true
COSIGN_PUBLIC_KEY:
required: true
DOCKER_PASSWORD:
required: true
DOCKER_USERNAME:
required: true
PERSONAL_ACCESS_TOKEN:
required: true
S3_BUCKET_NAME:
required: true
S3_BUCKET_REGION:
required: true
SIGNING_HSM_CREDS:
required: true
SIGNING_REMOTE_SSH_HOST:
required: true
SIGNING_REMOTE_SSH_PRIVATE_KEY:
required: true
SIGNING_REMOTE_SSH_USER:
required: true
workflow_dispatch:
inputs:
tag:
description: "Next release tag"
required: true
type: string
dev:
description: "Is dev build"
required: false
default: true
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ inputs.tag }}
cancel-in-progress: false
permissions: {}
jobs:
build:
name: Build, Sign & Publish Release
runs-on: cx-public-macos-15-x64
permissions:
id-token: write # required for AWS OIDC federation via configure-aws-credentials (HSM signing)
contents: write # required for `gh release create`/`gh release delete` to manage GitHub Releases
env:
AC_PASSWORD: ${{ secrets.AC_PASSWORD }}
AC_USER: ${{ secrets.AC_USER }}
APPLE_DEVELOPER_CERTIFICATE_P12_BASE64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }}
APPLE_DEVELOPER_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }}
COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
COSIGN_PUBLIC_KEY: ${{ secrets.COSIGN_PUBLIC_KEY }}
steps:
- name: Install Harden Runner
uses: checkmarx/harden-runner-action@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
use-policy-store: true
api-key: ${{ secrets.STEP_SECURITY_API_KEY }}
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v6
with:
fetch-depth: 0
persist-credentials: false
- name: Install Go
uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 #v4
with:
go-version-file: go.mod
- name: Import Code-Signing Certificates
uses: Apple-Actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 #v1
with:
# The certificates in a PKCS12 file encoded as a base64 string
p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }}
# The password used to import the PKCS12 file.
p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }}
- name: Updating and upgrading brew to a specific version
run: |
brew --version
cd $(brew --repo)
git fetch --tags
git checkout 4.4.15
export HOMEBREW_NO_AUTO_UPDATE=1
brew --version
- name: Install gon
run: |
brew install Bearer/tap/gon
# New: detect architecture and expose as step output
- name: Detect runner architecture
id: arch
run: |
echo "arch=$(uname -m)" >> $GITHUB_OUTPUT
- name: Setup Docker on macOS
if: inputs.dev == false
uses: douglascamata/setup-docker-macos-action@5643cfd7e434881308f89f2f3ae8852da11df909
- name: Test docker
if: inputs.dev == false
run: |
docker version
docker info
- name: Login to Docker Hub
if: inputs.dev == false
uses: step-security/docker-login-action@870af644803bf9f204aed474adbad2958fec048b # v4.1.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Install Cosign
if: inputs.dev == false
uses: step-security/cosign-installer@8c02650536457a1c912424ab6cb9734aa3eceb56 # v4.1.1
- name: Configure AWS Credentials
if: inputs.dev == false
uses: aws-actions/configure-aws-credentials@5fd3084fc36e372ff1fff382a39b10d03659f355 #v2
with:
role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }}
aws-region: ${{ secrets.AWS_ASSUME_ROLE_REGION }}
- name: Tag
env:
TAG: ${{ inputs.tag }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
echo "$TAG"
echo "NEXT_VERSION=$TAG" >> "$GITHUB_ENV"
tag="$TAG"
message="${TAG}: PR #${PR_NUMBER} ${PR_TITLE}"
git config user.name "${GITHUB_ACTOR}"
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
git tag -a "${tag}" -m "${message}"
# tag stays local — pushed at the end of the job, after the release is fully built
- name: Build GoReleaser Args
env:
DEV: ${{ inputs.dev }}
run: |
args='release --clean --debug --timeout 90m'
if [ "$DEV" = true ]; then
args=${args}' --config=".goreleaser-dev.yml"'
fi
echo "GR_ARGS=${args}" >> "$GITHUB_ENV"
- name: Echo GoReleaser Args
run: echo "$GR_ARGS"
- name: Run GoReleaser
uses: step-security/goreleaser-action@1472c46ac6e641f2b929f1a893354288b3a6b6b6 # v7.2.1
with:
version: v1.18.2
args: ${{ env.GR_ARGS }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GO_BOT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
S3_BUCKET_REGION: ${{ secrets.S3_BUCKET_REGION }}
SIGNING_REMOTE_SSH_USER: ${{ secrets.SIGNING_REMOTE_SSH_USER }}
SIGNING_REMOTE_SSH_HOST: ${{ secrets.SIGNING_REMOTE_SSH_HOST }}
SIGNING_REMOTE_SSH_PRIVATE_KEY: ${{ secrets.SIGNING_REMOTE_SSH_PRIVATE_KEY }}
SIGNING_HSM_CREDS: ${{ secrets.SIGNING_HSM_CREDS }}
- name: Sign Docker Image with Cosign
if: inputs.dev == false
env:
TAG: ${{ inputs.tag }}
run: |
cosign sign --yes --key env://COSIGN_PRIVATE_KEY "checkmarx/ast-cli:${TAG}"
#- name: Verify Docker image signature
# if: inputs.dev == false
# run: |
# echo "${{ secrets.COSIGN_PUBLIC_KEY }}" > cosign.pub
# cosign verify --key cosign.pub checkmarx/ast-cli:${{ inputs.tag }}
# env:
# COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
- name: Create GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ inputs.tag }}
RELEASE_SHA: ${{ github.sha }}
DEV: ${{ inputs.dev }}
run: |
set -euo pipefail
shopt -s failglob
common=(
"$TAG"
dist/*.tar.gz dist/*.zip dist/*checksums*
--target "$RELEASE_SHA"
--title "Checkmarx One CLI ${TAG}"
--generate-notes
--draft
)
if [ "$DEV" = "true" ]; then
gh release create "${common[@]}" --prerelease
else
gh release create "${common[@]}"
fi
- name: Cleanup draft release on failure
if: failure()
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ inputs.tag }}
run: gh release delete "$TAG" --cleanup-tag --yes || true
#notify:
# name: Update Teams & JIRA About New Release
# if: inputs.dev == false && 1 == 0
# needs: build
# uses: Checkmarx/plugins-release-workflow/.github/workflows/release-notify.yml@main
# with:
# product_name: CLI
# release_version: ${{ inputs.tag }}
# cli_release_version: ""
# release_author: "Sypher Team"
# release_url: https://github.com/Checkmarx/ast-cli/releases/tag/${{ inputs.tag }}
# jira_product_name: ASTCLI
# secrets: inherit
# dispatch_auto_release:
# name: Update Plugins With new Cli Version
# if: inputs.dev == false && 1 == 0
# #needs: notify
# permissions:
# contents: read # dispatch-workflow.yml itself declares `permissions: contents: read`
# uses: Checkmarx/plugins-release-workflow/.github/workflows/dispatch-workflow.yml@d0ad5e1c4cf1edacf4d91c250c2b7a4a5478baab # main
# with:
# cli_version: ${{ inputs.tag }}
# # dispatch-workflow.yml is a trusted first-party Checkmarx org workflow, not a fork/third-party target.
# secrets: inherit # zizmor: ignore[secrets-inherit]