move go pattern to other languages #1
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: Common Build and Deploy to Prod | ||
on: | ||
workflow_call: | ||
inputs: | ||
needs_build: | ||
description: 'Whether to build or not' | ||
required: true | ||
type: boolean | ||
default: false | ||
needs_export: | ||
required: false | ||
type: boolean | ||
default: false | ||
install_command: | ||
description: 'Command to run to install dependencies' | ||
type: string | ||
required: false | ||
cloud_deploy: | ||
required: true | ||
type: boolean | ||
default: false | ||
skip_deploy: | ||
required: false | ||
type: boolean | ||
default: false | ||
env: | ||
required: false | ||
type: string | ||
default: quai-prod | ||
build_command: | ||
description: 'Command to run to build' | ||
type: string | ||
required: false | ||
needs_docker: | ||
required: false | ||
type: boolean | ||
default: false | ||
include_chart: | ||
required: false | ||
type: boolean | ||
default: false | ||
name_override: | ||
required: false | ||
type: string | ||
gcp_project_id: | ||
required: false | ||
type: string | ||
token_secret_name: | ||
required: false | ||
type: string | ||
update_version: | ||
required: false | ||
type: boolean | ||
default: true | ||
secrets: | ||
GH_PAT: | ||
description: 'needed for github login' | ||
required: true | ||
DOCKER: | ||
description: 'needed for registry login' | ||
required: false | ||
KUBE_CONFIG: | ||
description: 'needed for kube setup' | ||
required: false | ||
BUILD_ARGS: | ||
description: 'needed for build args' | ||
required: false | ||
DOCKER_BUILD_ARGS: | ||
description: 'needed for docker build args' | ||
required: false | ||
GPG_PRIVATE_KEY: | ||
description: 'needed for gpg signing' | ||
required: false | ||
GPG_KEY_ID: | ||
description: 'needed for gpg signing' | ||
required: false | ||
GH_GCP_TOKEN: | ||
description: 'needed for gcp login' | ||
required: false | ||
jobs: | ||
detect-language: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
language: ${{ env.detected-language }} | ||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: Detect Language | ||
id: set-language | ||
run: | | ||
if [[ -f "package.json" && ! -f "tsconfig.json" ]]; then | ||
echo "detected-language=javascript" >> $GITHUB_ENV | ||
echo "detected-language=javascript" | ||
elif [[ -f "tsconfig.json" ]]; then | ||
echo "detected-language=typescript" >> $GITHUB_ENV | ||
elif [[ -f "go.mod" ]]; then | ||
echo "detected-language=go" >> $GITHUB_ENV | ||
elif [[ -f "mix.exs" ]]; then | ||
echo "detected-language=elixir" >> $GITHUB_ENV | ||
else | ||
echo "detected-language=unknown" >> $GITHUB_ENV | ||
fi | ||
echo "testing" | ||
createProdTagJS: | ||
needs: detect-language | ||
runs-on: ubuntu-latest | ||
if: needs.detect-language.outputs.language == 'javascript' | ||
steps: | ||
- uses: actions/checkout@v3 | ||
with: | ||
ssh-key: ${{ secrets.GH_PAT }} | ||
- name: Import GPG Key | ||
if: ${{ inputs.update_version }} | ||
env: | ||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | ||
GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} | ||
run: | | ||
echo "$GPG_PRIVATE_KEY" | gpg --import | ||
git config --global user.signingkey $GPG_KEY_ID | ||
- name: Set Repo Name | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
echo "REPO_NAME=$repo_name" >> $GITHUB_ENV | ||
- name: Set Repo Name in Camel Case | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
camel_case_name=$(echo $repo_name | awk -F- '{for(i=2; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2); }1' OFS="") | ||
echo "CAMEL_CASE_REPO_NAME=$camel_case_name" >> $GITHUB_ENV | ||
- name: Install Volta | ||
run: | | ||
curl -sSLf https://get.volta.sh | bash | ||
echo "$HOME/.volta/bin" >> $GITHUB_PATH | ||
- name: Log Node and Npm Versions | ||
run: | | ||
echo node version $(node -v) | ||
echo npm version $(npm -v) | ||
- name: install semver globally | ||
if: ${{ inputs.update_version }} | ||
run: npm install -g semver | ||
- name: Update Version | ||
if: ${{ inputs.update_version }} | ||
run: | | ||
jq --arg new_version "v$(semver -i patch $(jq -r '.version' package.json | sed 's/^v//'))" '.version = $new_version' package.json > temp.json && mv temp.json package.json | ||
NEW_VERSION = $(jq -r '.version' package.json) | ||
echo "VERSION=$NEW_VERSION" >> $GITHUB_ENV | ||
- name: Update Chart.yaml version | ||
run: yq eval -i ".appVersion=\"${{ env.VERSION }}\"" ./helm/Chart.yaml | ||
- name: Update values.yaml version | ||
run: yq eval -i ".${{ env.CAMEL_CASE_REPO_NAME }}.image.version=\"${{ env.VERSION }}\"" ./helm/values.yaml | ||
- uses: stefanzweifel/git-auto-commit-action@v4 | ||
with: | ||
commit_message: "Prod Release ${{ env.VERSION }}" | ||
branch: ${{ github.ref }} | ||
createProdTagTS: | ||
needs: detect-language | ||
runs-on: ubuntu-latest | ||
if: needs.detect-language.outputs.language == 'typescript' | ||
steps: | ||
- uses: actions/checkout@v3 | ||
with: | ||
ssh-key: ${{ secrets.GH_PAT }} | ||
- name: Import GPG Key | ||
if: ${{ inputs.update_version }} | ||
env: | ||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | ||
GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} | ||
run: | | ||
echo "$GPG_PRIVATE_KEY" | gpg --import | ||
git config --global user.signingkey $GPG_KEY_ID | ||
- name: Set Repo Name | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
echo "REPO_NAME=$repo_name" >> $GITHUB_ENV | ||
- name: Set Repo Name in Camel Case | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
camel_case_name=$(echo $repo_name | awk -F- '{for(i=2; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2); }1' OFS="") | ||
echo "CAMEL_CASE_REPO_NAME=$camel_case_name" >> $GITHUB_ENV | ||
- name: Install Volta | ||
run: | | ||
curl -sSLf https://get.volta.sh | bash | ||
echo "$HOME/.volta/bin" >> $GITHUB_PATH | ||
- name: Log Node and Npm Versions | ||
run: | | ||
echo node version $(node -v) | ||
echo npm version $(npm -v) | ||
- name: install semver globally | ||
if: ${{ inputs.update_version }} | ||
run: npm install -g semver | ||
- name: Update Version | ||
if: ${{ inputs.update_version }} | ||
run: | | ||
jq --arg new_version "v$(semver -i patch $(jq -r '.version' package.json | sed 's/^v//'))" '.version = $new_version' package.json > temp.json && mv temp.json package.json | ||
NEW_VERSION = $(jq -r '.version' package.json) | ||
echo "VERSION=$NEW_VERSION" >> $GITHUB_ENV | ||
- name: Update Chart.yaml version | ||
run: yq eval -i ".appVersion=\"${{ env.VERSION }}\"" ./helm/Chart.yaml | ||
- name: Update values.yaml version | ||
run: yq eval -i ".${{ env.CAMEL_CASE_REPO_NAME }}.image.version=\"${{ env.VERSION }}\"" ./helm/values.yaml | ||
- uses: stefanzweifel/git-auto-commit-action@v4 | ||
with: | ||
commit_message: "Prod Release ${{ env.VERSION }}" | ||
branch: ${{ github.ref }} | ||
createProdTagGo: | ||
needs: detect-language | ||
runs-on: ubuntu-latest | ||
if: needs.detect-language.outputs.language == 'go' | ||
steps: | ||
- uses: actions/checkout@v3 | ||
with: | ||
ssh-key: ${{ secrets.GH_PAT }} | ||
# - name: Import GPG Key | ||
# env: | ||
# GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | ||
# GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} | ||
# run: | | ||
# echo "$GPG_PRIVATE_KEY" | gpg --import | ||
# git config --global user.signingkey $GPG_KEY_ID | ||
# git config --global commit.gpgsign true | ||
- name: Set Repo Name | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
echo "REPO_NAME=$repo_name" >> $GITHUB_ENV | ||
- name: Set Repo Name in Camel Case | ||
run: | | ||
repo_name=$(basename ${{ github.repository }}) | ||
if [ -n "${{ inputs.name_override }}" ]; then | ||
repo_name=${{ inputs.name_override }} | ||
fi | ||
camel_case_name=$(echo $repo_name | awk -F- '{for(i=2; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2); }1' OFS="") | ||
echo "CAMEL_CASE_REPO_NAME=$camel_case_name" >> $GITHUB_ENV | ||
- name: Set up Node.js | ||
uses: actions/setup-node@v2 | ||
with: | ||
node-version: '20' # This will install the latest stable Node.js version | ||
- name: Log Node and Npm Versions | ||
run: | | ||
echo node version $(node -v) | ||
echo npm version $(npm -v) | ||
- name: install semver globally | ||
run: npm install -g semver | ||
- name: Update Version | ||
run: | | ||
echo "v$(semver -i patch $(sed 's/^v//' VERSION))" > VERSION | ||
echo "VERSION=$(cat VERSION)" >> $GITHUB_ENV | ||
- name: Update Chart.yaml version | ||
if: ${{ inputs.include_chart }} | ||
run: yq eval -i ".appVersion=\"${{ env.VERSION }}\"" ./helm/Chart.yaml | ||
- name: Update values.yaml version | ||
if: ${{ inputs.include_chart }} | ||
run: yq eval -i ".${{ env.CAMEL_CASE_REPO_NAME }}.image.version=\"${{ env.VERSION }}\"" ./helm/values.yaml | ||
- uses: stefanzweifel/git-auto-commit-action@v4 | ||
with: | ||
commit_message: "Prod Release ${{ env.VERSION }}" | ||
branch: ${{ github.ref }} | ||
buildDeployProdJS: | ||
needs: [createProdTagJS] | ||
uses: ./.github/workflows/build-deploy-js.yml | ||
secrets: | ||
DOCKER: ${{ secrets.DOCKER }} | ||
GH_PAT: ${{ secrets.GH_PAT }} | ||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }} | ||
DOCKER_BUILD_ARGS: ${{ secrets.DOCKER_BUILD_ARGS }} | ||
BUILD_ARGS: ${{ secrets.BUILD_ARGS }} | ||
GH_GCP_TOKEN: ${{ secrets.GH_GCP_TOKEN }} | ||
with: | ||
env: ${{ inputs.env }} | ||
update_version_command: npm version prepatch --preid=rc --no-git-tag-version | ||
rails: '[[ ! "$VERSION" =~ "rc" ]] && [[ ! "$VERSION" =~ "pre" ]]' | ||
update_version: {{ inputs.update_version }}} | ||
cloud_deploy: ${{ inputs.cloud_deploy }} | ||
needs_build: ${{ inputs.needs_build }} | ||
needs_export: ${{ inputs.needs_export }} | ||
install_command: ${{ inputs.install_command }} | ||
skip_deploy: ${{ inputs.skip_deploy }} | ||
name_override: ${{ inputs.name_override }} | ||
gcp_project_id: ${{ inputs.gcp_project_id }} | ||
token_secret_name: ${{ inputs.token_secret_name }} | ||
buildDeployProdTS: | ||
needs: [createProdTagTS] | ||
uses: ./.github/workflows/build-deploy-ts.yml | ||
secrets: | ||
DOCKER: ${{ secrets.DOCKER }} | ||
GH_PAT: ${{ secrets.GH_PAT }} | ||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }} | ||
DOCKER_BUILD_ARGS: ${{ secrets.DOCKER_BUILD_ARGS }} | ||
BUILD_ARGS: ${{ secrets.BUILD_ARGS }} | ||
GH_GCP_TOKEN: ${{ secrets.GH_GCP_TOKEN }} | ||
with: | ||
env: ${{ inputs.env }} | ||
update_version_command: npm version prepatch --preid=rc --no-git-tag-version | ||
rails: '[[ ! "$VERSION" =~ "rc" ]] && [[ ! "$VERSION" =~ "pre" ]]' | ||
update_version: {{ inputs.update_version }}} | ||
cloud_deploy: ${{ inputs.cloud_deploy }} | ||
needs_build: ${{ inputs.needs_build }} | ||
needs_export: ${{ inputs.needs_export }} | ||
install_command: ${{ inputs.install_command }} | ||
skip_deploy: ${{ inputs.skip_deploy }} | ||
name_override: ${{ inputs.name_override }} | ||
gcp_project_id: ${{ inputs.gcp_project_id }} | ||
token_secret_name: ${{ inputs.token_secret_name }} | ||
buildDeployProdGo: | ||
needs: [createProdTagGo] | ||
uses: ./.github/workflows/build-deploy-go.yml | ||
secrets: | ||
DOCKER: ${{ secrets.DOCKER }} | ||
GH_PAT: ${{ secrets.GH_PAT }} | ||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }} | ||
DOCKER_BUILD_ARGS: ${{ secrets.DOCKER_BUILD_ARGS }} | ||
BUILD_ARGS: ${{ secrets.BUILD_ARGS }} | ||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | ||
GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} | ||
GH_GCP_TOKEN: ${{ secrets.GH_GCP_TOKEN }} | ||
with: | ||
env: ${{ inputs.env }} | ||
update_version_command: "echo \"v$(semver -i prepatch $(sed 's/^v//' VERSION) --preid=rc)\" > VERSION" | ||
rails: '[[ ! "$VERSION" =~ "rc" ]] && [[ ! "$VERSION" =~ "pre" ]]' | ||
update_version: true | ||
cloud_deploy: ${{ inputs.cloud_deploy }} | ||
needs_build: ${{ inputs.needs_build }} | ||
install_command: ${{ inputs.install_command }} | ||
skip_deploy: ${{ inputs.skip_deploy }} | ||
build_command: ${{ inputs.build_command }} | ||
needs_docker: ${{ inputs.needs_docker }} | ||
include_chart: ${{ inputs.include_chart }} | ||
name_override: ${{ inputs.name_override }} | ||
gcp_project_id: ${{ inputs.gcp_project_id }} | ||
token_secret_name: ${{ inputs.token_secret_name }} |