start gh actions workflows #44
This file contains hidden or 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: WG-Easy PR Validation - build, release, install | |
on: | |
pull_request: | |
branches: [main] | |
paths: | |
- 'applications/wg-easy/**' | |
- '.github/workflows/wg-easy-pr-validation.yaml' | |
workflow_dispatch: | |
inputs: | |
test_mode: | |
description: 'Run in test mode' | |
required: false | |
default: 'true' | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
env: | |
APP_DIR: applications/wg-easy | |
REPLICATED_API_TOKEN: ${{ secrets.WG_EASY_REPLICATED_API_TOKEN }} | |
REPLICATED_APP: ${{ secrets.WG_EASY_REPLICATED_APP }} | |
HELM_VERSION: "3.17.3" | |
KUBECTL_VERSION: "v1.30.0" | |
jobs: | |
setup: | |
runs-on: ubuntu-22.04 | |
outputs: | |
branch-name: ${{ steps.vars.outputs.branch-name }} | |
channel-name: ${{ steps.vars.outputs.channel-name }} | |
steps: | |
- name: Set branch and channel variables | |
id: vars | |
run: | | |
# Branch name preserves original case for resource naming (clusters, customers) | |
BRANCH_NAME="${{ github.head_ref || github.ref_name }}" | |
# Channel name is normalized to lowercase with hyphens for Replicated channels | |
CHANNEL_NAME=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | tr '/' '-') | |
echo "branch-name=$BRANCH_NAME" >> $GITHUB_OUTPUT | |
echo "channel-name=$CHANNEL_NAME" >> $GITHUB_OUTPUT | |
echo "Branch: $BRANCH_NAME, Channel: $CHANNEL_NAME" | |
build-and-release: | |
runs-on: ubuntu-22.04 | |
needs: setup | |
defaults: | |
run: | |
working-directory: ${{ env.APP_DIR }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Cache Helm dependencies | |
uses: actions/cache@v4 | |
with: | |
path: | | |
applications/wg-easy/charts/*/charts | |
applications/wg-easy/Chart.lock | |
key: helm-deps-${{ hashFiles('applications/wg-easy/charts/*/Chart.yaml') }} | |
- name: Setup tools | |
uses: ./.github/actions/setup-tools | |
with: | |
helm-version: ${{ env.HELM_VERSION }} | |
kubectl-version: ${{ env.KUBECTL_VERSION }} | |
install-kubectl: 'true' | |
install-preflight: 'true' | |
install-helmfile: 'true' | |
- name: Update dependencies | |
run: task dependencies-update | |
timeout-minutes: 10 | |
- name: Prepare release | |
run: task release-prepare | |
timeout-minutes: 10 | |
- name: Verify release directory contents | |
run: | | |
echo "Checking release directory contents:" | |
ls -la release/ | |
echo "Verifying required files exist:" | |
test -f release/application.yaml | |
test -f release/config.yaml | |
test -f release/cluster.yaml | |
find release/ -name "*.tgz" | wc -l | grep -v "^0$" | |
- name: Upload release artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wg-easy-release-${{ github.run_number }} | |
path: ${{ env.APP_DIR }}/release/ | |
retention-days: 7 | |
- name: Create channel for branch | |
run: task channel-create RELEASE_CHANNEL="${{ needs.setup.outputs.channel-name }}" | |
timeout-minutes: 5 | |
- name: Create release | |
run: task release-create RELEASE_CHANNEL="${{ needs.setup.outputs.channel-name }}" | |
timeout-minutes: 15 | |
lint-and-validate: | |
runs-on: ubuntu-22.04 | |
needs: setup | |
defaults: | |
run: | |
working-directory: ${{ env.APP_DIR }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Cache Helm dependencies | |
uses: actions/cache@v4 | |
with: | |
path: | | |
applications/wg-easy/charts/*/charts | |
applications/wg-easy/Chart.lock | |
key: helm-deps-${{ hashFiles('applications/wg-easy/charts/*/Chart.yaml') }} | |
- name: Setup tools | |
uses: ./.github/actions/setup-tools | |
with: | |
helm-version: ${{ env.HELM_VERSION }} | |
- name: Update dependencies | |
run: task dependencies-update | |
- name: Lint Helm charts | |
run: | | |
for chart_dir in $(find charts/ -maxdepth 2 -name "Chart.yaml" | \ | |
xargs dirname); do | |
echo "Linting chart: $chart_dir" | |
helm lint "$chart_dir" | |
done | |
- name: Template Helm charts | |
run: | | |
for chart_dir in $(find charts/ -maxdepth 2 -name "Chart.yaml" | \ | |
xargs dirname); do | |
echo "Templating chart: $chart_dir" | |
helm template test-release "$chart_dir" --dry-run | |
done | |
- name: Validate Taskfile syntax | |
run: task --list-all | |
- name: Validate helmfile template | |
uses: helmfile/[email protected] | |
if: hashFiles('helmfile.yaml.gotmpl') != '' | |
with: | |
helmfile-args: build | |
helmfile-workdirectory: ${{ env.APP_DIR }} | |
env: | |
REPLICATED_APP: "test-app" | |
CHANNEL: ${{ needs.setup.outputs.channel-name }} | |
REPLICATED_LICENSE_ID: "test-license" | |
TF_EXPOSED_URL: "test.example.com" | |
create-customer-and-cluster: | |
runs-on: ubuntu-22.04 | |
needs: [setup, build-and-release] | |
defaults: | |
run: | |
working-directory: ${{ env.APP_DIR }} | |
outputs: | |
customer-email: ${{ steps.customer.outputs.customer-email }} | |
skip-customer-registry: ${{ steps.prereqs.outputs.skip-customer-registry }} | |
cluster-name: ${{ needs.setup.outputs.channel-name }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Check prerequisites | |
id: prereqs | |
run: | | |
echo "Prerequisites check complete" | |
echo "skip-customer-registry=false" >> $GITHUB_OUTPUT | |
- name: Setup tools | |
uses: ./.github/actions/setup-tools | |
- name: Create customer | |
id: customer | |
run: | | |
# Create customer and derive email from branch name | |
CUSTOMER_NAME="${{ needs.setup.outputs.channel-name }}" | |
task customer-create CUSTOMER_NAME="$CUSTOMER_NAME" RELEASE_CHANNEL="${{ needs.setup.outputs.channel-name }}" | |
# Derive customer email from customer name (branch name) | |
CUSTOMER_EMAIL="${CUSTOMER_NAME}@example.com" | |
echo "customer-email=$CUSTOMER_EMAIL" >> $GITHUB_OUTPUT | |
echo "Customer email: $CUSTOMER_EMAIL" | |
timeout-minutes: 5 | |
- name: Create cluster with retry | |
uses: nick-fields/[email protected] | |
with: | |
timeout_minutes: 20 | |
retry_wait_seconds: 30 | |
max_attempts: 3 | |
command: | | |
cd ${{ env.APP_DIR }} | |
task cluster-create CLUSTER_NAME="${{ needs.setup.outputs.channel-name }}" | |
helm-install-test: | |
runs-on: ubuntu-22.04 | |
needs: [setup, create-customer-and-cluster] | |
defaults: | |
run: | |
working-directory: ${{ env.APP_DIR }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Setup tools | |
uses: ./.github/actions/setup-tools | |
with: | |
helm-version: ${{ env.HELM_VERSION }} | |
install-helmfile: 'true' | |
- name: Update dependencies | |
run: task dependencies-update | |
- name: Get customer license ID | |
id: license | |
run: | | |
LICENSE_ID=$(task utils:get-customer-license CUSTOMER_NAME="${{ needs.setup.outputs.channel-name }}" --silent | tail -1) | |
echo "customer-license=$LICENSE_ID" >> $GITHUB_OUTPUT | |
echo "::add-mask::$LICENSE_ID" | |
- name: Helm registry login | |
run: | | |
helm registry login registry.replicated.com --username "${{ steps.license.outputs.customer-license }}" --password "${{ steps.license.outputs.customer-license }}" | |
timeout-minutes: 5 | |
- name: Helm install | |
run: task helm-install | |
timeout-minutes: 20 | |
env: | |
CHANNEL: ${{ needs.setup.outputs.channel-name }} | |
REPLICATED_LICENSE_ID: ${{ steps.license.outputs.customer-license }} | |
HELM_ENV: replicated | |
CLUSTER_NAME: ${{ needs.setup.outputs.channel-name }} | |
- name: Upload debug logs | |
if: failure() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: debug-logs-${{ github.run_number }} | |
path: | | |
/tmp/*.log | |
~/.replicated/ | |