diff --git a/.github/workflows/container-all-prod-providers.yml b/.github/workflows/container-all-prod-providers.yml deleted file mode 100644 index b9e1032..0000000 --- a/.github/workflows/container-all-prod-providers.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -name: Container with all prod providers -on: - workflow_dispatch: - inputs: - tag: - description: 'Tag in semver format' - required: true - -jobs: - container_prod_all_providers: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 # Checking out the repo - - name: Build and Publish Docker image - uses: VaultVulp/gp-docker-action@1.2.0 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - image-name: vmpooler - build-context: ./docker/prod-all-providers/ - dockerfile: ./docker/prod-all-providers/Dockerfile - image-tag: ${{ github.event.inputs.tag }}-prod-all-providers - - name: Generate Release Body - env: - RELEASE_BODY_FILE: "${{ github.event.inputs.tag }}-prod-all-providers-release-body.md" - run: | - echo "## Components" > ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "This release includes the following:" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "### Source image" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "- $(grep ^FROM ./docker/prod-all-providers/Dockerfile |cut -d ' ' -f2) + OS updates" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "### Gems" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "$(grep -e 'vmpooler ([0-9]' docker/prod-all-providers/Gemfile.lock | xargs -L1 echo -)" >> ${RELEASE_BODY_FILE} - echo "$(grep -e 'vmpooler-provider-.* ([0-9]' docker/prod-all-providers/Gemfile.lock | xargs -L1 echo -)" >> ${RELEASE_BODY_FILE} - - name: Tag Release - uses: ncipollo/release-action@v1 - with: - tag: ${{ github.event.inputs.tag }}-prod-all-providers - token: ${{ secrets.GITHUB_TOKEN }} - draft: false - prerelease: false - bodyFile: ${{ github.event.inputs.tag }}-prod-all-providers-release-body.md - generateReleaseNotes: true \ No newline at end of file diff --git a/.github/workflows/release-helm-charts.yml b/.github/workflows/release-helm-charts.yml deleted file mode 100644 index e909cc6..0000000 --- a/.github/workflows/release-helm-charts.yml +++ /dev/null @@ -1,68 +0,0 @@ ---- -name: Release Helm charts -on: - workflow_dispatch: - inputs: - tag: - description: 'Tag in semver format' - required: true - type: string - -jobs: - container_prod_all_providers: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 # ct list-changed below needs this - - uses: azure/setup-helm@v1 - - uses: actions/setup-python@v2 - with: - python-version: 3.7 - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.1.0 - - name: Run chart-testing (list-changed) - id: list-changed - run: | - changed=$(ct list-changed --chart-dirs helm-charts --target-branch main) - if [[ -n "$changed" ]]; then - echo "::set-output name=changed::true" - fi - - name: Run chart-testing (lint) - run: ct lint --chart-dirs helm-charts --all --validate-maintainers=false --chart-repos bitnami=https://charts.bitnami.com/bitnami - - name: Package charts - run: | - set -e - cd docs/ - helm package ../helm-charts/* - helm repo index --url https://puppetlabs.github.io/vmpooler-deployment/ . - - uses: EndBug/add-and-commit@v9 # You can change this to use a specific version. - with: - add: docs - message: release helm-chart version ${{ github.event.inputs.tag }} - - name: Generate Release Body - env: - RELEASE_BODY_FILE: "${{ github.event.inputs.tag }}-prod-all-providers-release-body.md" - run: | - echo "#Components" > ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "This release includes the following:" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "##Source image" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "- $(grep ^FROM ./docker/prod-all-providers/Dockerfile |cut -d ' ' -f2) + OS updates" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "##Gems" >> ${RELEASE_BODY_FILE} - echo "" >> ${RELEASE_BODY_FILE} - echo "$(grep -e 'vmpooler ([0-9]' docker/prod-all-providers/Gemfile.lock | xargs -L1 echo -)" >> ${RELEASE_BODY_FILE} - echo "$(grep -e 'vmpooler-provider-.* ([0-9]' docker/prod-all-providers/Gemfile.lock | xargs -L1 echo -)" >> ${RELEASE_BODY_FILE} - echo "${RELEASE_BODY_FILE}" - - name: Tag Release - uses: ncipollo/release-action@v1 - with: - tag: ${{ github.event.inputs.tag }}-prod-all-providers - token: ${{ secrets.GITHUB_TOKEN }} - draft: false - prerelease: false - bodyFile: ${{ github.event.inputs.tag }}-prod-all-providers-release-body.md - generateReleaseNotes: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..cf4d035 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,161 @@ +name: Docker and Helm Release + +on: + workflow_dispatch: + +permissions: + contents: write + issues: read + pull-requests: read + packages: write + +jobs: + release: + name: Validate Docs, Tag, and Docker Push & Helm Push + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_TOKEN }} + + - name: Get New Chart Version + id: nv + run: | + version=$(yq .version helm-charts/vmpooler/Chart.yaml) + appVersion=$(yq .appVersion helm-charts/vmpooler/Chart.yaml) + echo "version=$version" >> $GITHUB_OUTPUT + echo "appVersion=$appVersion" >> $GITHUB_OUTPUT + echo "Found version $version from helm-charts/vmpooler/Chart.yaml" + echo "Found appVersion $appVersion from helm-charts/vmpooler/Chart.yaml" + + - name: Get Current Chart Version + uses: actions/github-script@v6 + id: cv + with: + script: | + const { data: response } = await github.rest.repos.getLatestRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + }) + console.log(`The latest release is ${response.tag_name}`) + return response.tag_name + result-encoding: string + + - name: Get Current Docker Tag + uses: actions/github-script@v6 + id: dv + with: + script: | + // concat to build "vmpooler-deployment%2Fvmpooler" + const packageName = [context.repo.repo, 'vmpooler'].join('/'); + + const shouldRunDockerBuild = async () => { + let runDockerBuild = true; + // Iterate through all pages of list of package versions + for await (const response of github.paginate.iterator( + github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg, + { + package_type: 'container', + package_name: packageName, + org: context.repo.owner, + } + )) { + // Loop through each version, destructure down to the tags array and search for existing tag + for (const data of response.data) { + const { metadata: { container: { tags }}} = data; + console.log('List of docker tags:', tags); + if (tags.includes("${{ steps.nv.outputs.appVersion }}")) { + // Existing tag found, return false so that docker build does not run + console.log('Found existing tag for', "${{ steps.nv.outputs.appVersion }}"); + runDockerBuild = false; + break; + }; + }; + }; + return runDockerBuild; + }; + + const returnValue = await shouldRunDockerBuild(); + console.log('return:', returnValue); + return returnValue; + + - name: Generate Changelog + uses: docker://githubchangeloggenerator/github-changelog-generator:1.16.2 + with: + args: >- + --future-release ${{ steps.nv.outputs.version }} + env: + CHANGELOG_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate Changelog + run : | + set -e + if [[ -n $(git status --porcelain) ]]; then + echo "Here is the current git status:" + git status + echo + echo "The following changes were detected:" + git --no-pager diff + echo "Uncommitted PRs found in the changelog. Please submit a release prep PR of changes after running 'docker run -it --rm -e CHANGELOG_GITHUB_TOKEN -v "\$\(pwd\)":/usr/local/src/your-app githubchangeloggenerator/github-changelog-generator:1.16.2 github_changelog_generator --future-release ${{ steps.nv.outputs.version }}'" + exit 1 + fi + + - name: Generate Release Notes + uses: docker://githubchangeloggenerator/github-changelog-generator:1.16.2 + with: + args: >- + --since-tag ${{ steps.cv.outputs.result }} + --future-release ${{ steps.nv.outputs.version }} + --output release-notes.md + env: + CHANGELOG_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Tag Release + uses: ncipollo/release-action@v1 + with: + tag: ${{ steps.nv.outputs.version }} + token: ${{ secrets.GITHUB_TOKEN }} + bodyfile: release-notes.md + draft: false + prerelease: false + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Docker + if: ${{ steps.dv.outputs.result == 'true' }} + uses: docker/build-push-action@v3 + with: + push: true + tags: | + ghcr.io/${{ github.repository }}:${{ steps.nv.outputs.appVersion }} + ghcr.io/${{ github.repository }}:latest + + - uses: azure/setup-helm@v3 + + - uses: actions/setup-python@v4 + with: + python-version: 3.9 + + - name: Package Helm charts + run: | + set -e + cd docs/ + helm package ../helm-charts/* + helm repo index --url https://puppetlabs.github.io/vmpooler-deployment/ . + + - name: Git Commit and Push Helm Charts + run: | + git config user.name "puppetlabs-jenkins" + git config user.email "team-quality-engineering@puppet.com" + git --no-pager diff CHANGELOG.md + git add CHANGELOG.md + git commit -m "release helm-chart version ${{ steps.nv.outputs.version }}" + git push diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..374e8f8 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: Helm Test + +on: pull_request + +jobs: + test: + name: Test Helm Chart + if: contains(github.event.pull_request.labels.*.name, 'documentation') != true + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.ref }} + clean: true + fetch-depth: 0 + + - uses: azure/setup-helm@v3 + + - uses: actions/setup-python@v4 + with: + python-version: 3.9 + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2 + + - name: Run chart-testing (lint) + run: ct lint --chart-dirs helm-charts --all --validate-maintainers=false --chart-repos bitnami=https://charts.bitnami.com/bitnami