From e70eea244e73cd8ce7c27c9498f2f66d061bf8e9 Mon Sep 17 00:00:00 2001 From: Nelly Kiboi Date: Wed, 19 Aug 2020 17:33:40 +0100 Subject: [PATCH] chore(release): release process improvements --- .github/pr_labeler.yml | 6 ++ .../workflows/docker_development_image.yml | 61 +++++++++++++ .github/workflows/docker_production_image.yml | 66 ++++++++++++++ .github/workflows/docker_release.yml | 88 ------------------- .github/workflows/docker_tag_check.yml | 55 ++++++++++++ .github/workflows/pr_labeler.yml | 14 +++ .github/workflows/publish_statics_npm.yml | 60 +++++++++++++ .github/workflows/tagging.yml | 4 +- 8 files changed, 264 insertions(+), 90 deletions(-) create mode 100644 .github/pr_labeler.yml create mode 100644 .github/workflows/docker_development_image.yml create mode 100644 .github/workflows/docker_production_image.yml delete mode 100644 .github/workflows/docker_release.yml create mode 100644 .github/workflows/docker_tag_check.yml create mode 100644 .github/workflows/pr_labeler.yml create mode 100644 .github/workflows/publish_statics_npm.yml diff --git a/.github/pr_labeler.yml b/.github/pr_labeler.yml new file mode 100644 index 000000000..83ab172ad --- /dev/null +++ b/.github/pr_labeler.yml @@ -0,0 +1,6 @@ +feature: ['feature/*', 'feat/*'] +fix: ['fix/*', 'bug/*'] +chore: chore/* +documentation: docs/* +refactor: refactor/* +test: test/* diff --git a/.github/workflows/docker_development_image.yml b/.github/workflows/docker_development_image.yml new file mode 100644 index 000000000..7a3b638e2 --- /dev/null +++ b/.github/workflows/docker_development_image.yml @@ -0,0 +1,61 @@ +name: One App Development Image Build and Push +on: + workflow_dispatch: + inputs: + docker_tag_version: + description: 'Semantic Version' + required: true + repository_dispatch: + types: [one-app-docker-dev-build] +jobs: + one-app-docker-dev-build: + name: One App Development Image Build and Push + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Docker Image Versions + id: set_docker_version + run: | + #Runs when the action is triggered by the dispatch function + if [[ "${{ github.event.inputs.docker_tag_version }}" == "" ]]; then + echo ::set-output name=docker_version::${{ github.event.client_payload.docker_tag_version }} + echo ::set-output name=major_version::${{ github.event.client_payload.major_version }} + echo ::set-output name=minor_version::${{ github.event.client_payload.minor_version }} + else + #Runs when a tag is triggered manually + echo ::set-output name=docker_version::${{ github.event.inputs.docker_tag_version }} + MAJOR="$(echo ${{ github.event.inputs.docker_tag_version}} | cut -d'.' -f1)" + MINOR="$(echo ${{ github.event.inputs.docker_tag_version}} | cut -d'.' -f2)" + echo ::set-output name=major_version::${MAJOR} + echo ::set-output name=minor_version::${MINOR} + fi + - name: Print docker version + run: | + echo "tag: ${{ github.event.inputs.docker_tag_version }}" + - name: Docker login + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username ${{ secrets.DOCKER_USER }} --password-stdin + - name: Build development docker image + run: docker build -t dev . --target=development + - name: Tag Docker Images + run: | + docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.major_version }} + docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.major_version}}.${{ steps.set_docker_version.outputs.minor_version }} + docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.docker_version }} + docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:latest + - name: Push Docker Images + run: | + docker push ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.major_version}} + docker push ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.major_version}}.${{ steps.set_docker_version.outputs.minor_version }} + docker push ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_version.outputs.docker_version}} + docker push ${{ secrets.DOCKER_USER }}/one-app-dev:latest + - name: Publish One App Statics + uses: octokit/request-action@v2.x + id: dispatch_publish_statics_npm + with: + route: POST /repos/:repository/dispatches + repository: ${{ github.repository }} + mediaType: '{"previews": ["everest"]}' + event_type: "publish-statics-npm" + client_payload: '{"docker_tag_version": "${{ steps.set_docker_version.outputs.docker_version }}"}' + env: + GITHUB_TOKEN: ${{ secrets.PA_TOKEN }} diff --git a/.github/workflows/docker_production_image.yml b/.github/workflows/docker_production_image.yml new file mode 100644 index 000000000..f0825382b --- /dev/null +++ b/.github/workflows/docker_production_image.yml @@ -0,0 +1,66 @@ +name: One App Production Image Build and Push +on: + workflow_dispatch: + inputs: + docker_tag_version: + description: 'Semantic Version' + required: true + repository_dispatch: + types: [one-app-docker-prod-build] +jobs: + one-app-docker-prod-build: + name: One App Production Image Build and Push + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Docker login + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username ${{ secrets.DOCKER_USER }} --password-stdin + - name: Build production docker image + run: docker build -t prod . + - name: Extract sem versions + id: get_sem_version + run: | + MAJOR="$(echo ${{ github.event.client_payload.docker_tag_version}} | cut -d'.' -f1)" + MINOR="$(echo ${{ github.event.client_payload.docker_tag_version}} | cut -d'.' -f2)" + PATCH="$(echo ${{ github.event.client_payload.docker_tag_version}} | cut -d'.' -f3)" + echo ::set-output name=major_version::${MAJOR} + echo ::set-output name=minor_version::${MINOR} + - name: Docker Image Versions + id: set_docker_version + run: | + #Runs when the action is triggered by the dispatch function + if [[ "${{ github.event.inputs.docker_tag_version }}" == "" ]]; then + echo ::set-output name=docker_version::${{ github.event.client_payload.docker_tag_version }} + echo ::set-output name=major_version::${{ steps.get_sem_version.outputs.major_version }} + echo ::set-output name=minor_version::${{ steps.get_sem_version.outputs.minor_version }} + else + #Runs when a tag is triggered manually + echo ::set-output name=docker_version::${{ github.event.inputs.docker_tag_version }} + MAJOR="$(echo ${{ github.event.inputs.docker_tag_version}} | cut -d'.' -f1)" + MINOR="$(echo ${{ github.event.inputs.docker_tag_version}} | cut -d'.' -f2)" + echo ::set-output name=major_version::${MAJOR} + echo ::set-output name=minor_version::${MINOR} + fi + - name: Tag Docker Images + run: | + docker tag prod ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.major_version}} + docker tag prod ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.major_version}}.${{steps.set_docker_version.outputs.minor_version}} + docker tag prod ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.docker_version}} + docker tag prod ${{ secrets.DOCKER_USER }}/one-app:latest + - name: Push Docker Images + run: | + docker push ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.major_version}} + docker push ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.major_version}}.${{ steps.set_docker_version.outputs.minor_version}} + docker push ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_version.outputs.docker_version}} + docker push ${{ secrets.DOCKER_USER }}/one-app:latest + - name: Trigger Development Image Publishing + uses: octokit/request-action@v2.x + id: dispatch_one_app_docker_dev_build + with: + route: POST /repos/:repository/dispatches + repository: ${{ github.repository }} + mediaType: '{"previews": ["everest"]}' + event_type: "one-app-docker-dev-build" + client_payload: '{"docker_tag_version": "${{ steps.set_docker_version.outputs.docker_version }}","major_version":"${{ steps.set_docker_version.outputs.major_version}}","minor_version":"${{ steps.set_docker_version.outputs.minor_version}}"}' + env: + GITHUB_TOKEN: ${{ secrets.PA_TOKEN }} diff --git a/.github/workflows/docker_release.yml b/.github/workflows/docker_release.yml deleted file mode 100644 index 9c6a4751d..000000000 --- a/.github/workflows/docker_release.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: One App Docker Release -on: - push: - tags: - - '*' - repository_dispatch: - types: [one-app-docker-release] -jobs: - one-app-docker-release: - name: Build and Deploy to Docker - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - # Setup .npmrc file to publish to npm - - uses: actions/setup-node@v1 - with: - node-version: '12.x' - registry-url: 'https://registry.npmjs.org' - - name: Set env - id: set_tag_version - run: | - #Checks for when a valid tag is manually pushed - if [[ $GITHUB_REF != "" && "${{ github.event.client_payload.tagversion }}" == "" ]]; then - echo ::set-output name=tagversion::$(egrep -o '(v[0-9]+\.[0-9]+\.[0-9]+)(-\S*)?' <<< $GITHUB_REF) - else - #Runs when a tag is triggered automatically - echo ::set-output name=tagversion::${{ github.event.client_payload.tagversion }} - fi - echo $tagversion - - name: Check Tag Version - run: | - if [[ "${{ steps.set_tag_version.outputs.tagversion }}" == "" ]]; then - echo "::error::Incorrect tag provided, please provide a tag with the correct format and try again" - exit 1 - fi - - name: Docker tag version - id: set_docker_tag_version - run: | - tagversion=${{ steps.set_tag_version.outputs.tagversion}} - echo ::set-output name=dockertag::$(sed 's/^v*//' <<< "$tagversion") - - name: Docker tag version - run: echo $get_docker_tag - - name: Docker login - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username ${{ secrets.DOCKER_USER }} --password-stdin - - name: Build production docker image - run: docker build -t prod . - - name: Extract and zip production statics - run: | - docker cp $(docker create prod):opt/one-app/build ./one-app-statics - zip -r one-app-static-assets one-app-statics/build - - name: Publish statics to NPM - run: npm publish ./one-app-statics --access public - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - name: Build development docker image - run: docker build -t dev . --target=development - - name: Tag Docker Images - run: | - docker tag prod ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_tag_version.outputs.dockertag}} - docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_tag_version.outputs.dockertag }} - docker tag prod ${{ secrets.DOCKER_USER }}/one-app:latest - docker tag dev ${{ secrets.DOCKER_USER }}/one-app-dev:latest - - name: Push Docker Images - run: | - docker push ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_docker_tag_version.outputs.dockertag}} - docker push ${{ secrets.DOCKER_USER }}/one-app-dev:${{ steps.set_docker_tag_version.outputs.dockertag}} - docker push ${{ secrets.DOCKER_USER }}/one-app:latest - docker push ${{ secrets.DOCKER_USER }}/one-app-dev:latest - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ steps.set_tag_version.outputs.tagversion }} - release_name: Release ${{ steps.set_tag_version.outputs.tagversion }} - draft: false - prerelease: false - - name: Upload Release Assets - id: upload-release-asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./one-app-static-assets.zip - asset_name: one-app-static-assets.zip - asset_content_type: application/zip diff --git a/.github/workflows/docker_tag_check.yml b/.github/workflows/docker_tag_check.yml new file mode 100644 index 000000000..52ee655eb --- /dev/null +++ b/.github/workflows/docker_tag_check.yml @@ -0,0 +1,55 @@ +name: Docker Tag Version Check +on: + workflow_dispatch: + inputs: + tag_version: + description: 'Semantic Version' + required: true + push: + tags: + - '*' + repository_dispatch: + types: [one-app-docker-tag-check] +jobs: + one-app-docker-tag-check: + name: Docker Tag Version Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set env + id: set_tag_version + run: | + #Checks for when a valid tag is manually pushed + if [[ $GITHUB_REF != "" && "${{ github.event.client_payload.tagversion }}" == "" ]]; + then + echo ::set-output name=tagversion::$(egrep -o '(v[0-9]+\.[0-9]+\.[0-9]+)(-\S*)?' <<< $GITHUB_REF) + else + echo ::set-output name=tagversion::${{ github.event.client_payload.tagversion }} + fi + if [[ "${{ github.event.inputs.tag_version }}" != "" ]] + then + echo ::set-output name=tagversion::${{ github.event.inputs.tag_version }} + fi + echo $tagversion + - name: Check Tag Version + run: | + if [[ "${{ steps.set_tag_version.outputs.tagversion }}" == "" ]]; then + echo "::error::Incorrect tag provided, please provide a tag with the correct format and try again" + exit 1 + fi + - name: Docker tag version + id: set_docker_tag_version + run: | + tagversion=${{ steps.set_tag_version.outputs.tagversion}} + echo ::set-output name=dockertag::$(sed 's/^v*//' <<< "$tagversion") + - name: Trigger Production Image Publishing + uses: octokit/request-action@v2.x + id: dispatch_one-app-docker-prod-build + with: + route: POST /repos/:repository/dispatches + repository: ${{ github.repository }} + mediaType: '{"previews": ["everest"]}' + event_type: "one-app-docker-prod-build" + client_payload: '{"docker_tag_version": "${{ steps.set_docker_tag_version.outputs.dockertag }}"}' + env: + GITHUB_TOKEN: ${{ secrets.PA_TOKEN }} diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml new file mode 100644 index 000000000..828f539fa --- /dev/null +++ b/.github/workflows/pr_labeler.yml @@ -0,0 +1,14 @@ +name: PR Labeler +on: + pull_request: + types: [opened] + +jobs: + pr-labeler: + runs-on: ubuntu-latest + steps: + - uses: TimonVS/pr-labeler-action@v3 + with: + configuration-path: .github/pr_labeler.yml # optional, .github/pr-labeler.yml is the default value + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish_statics_npm.yml b/.github/workflows/publish_statics_npm.yml new file mode 100644 index 000000000..b63f9901b --- /dev/null +++ b/.github/workflows/publish_statics_npm.yml @@ -0,0 +1,60 @@ +name: One App Statics Publish to NPM +on: + workflow_dispatch: + inputs: + tag_version: + description: 'Semantic Version' + required: true + repository_dispatch: + types: [publish-statics-npm] +jobs: + publish-statics-npm: + name: One App Statics Publish to NPM + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + registry-url: 'https://registry.npmjs.org' + - name: Docker login + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username ${{ secrets.DOCKER_USER }} --password-stdin + - name: Tag Version + id: set_tag_version + run: | + if [[ "${{ github.event.inputs.tag_version }}" == "" ]] + then + echo ::set-output name=tagversion::${{ github.event.client_payload.docker_tag_version }} + else + echo ::set-output name=tagversion::${{ github.event.inputs.tag_version }} + fi + - name: Extract and zip production statics + run: | + docker create --name prod ${{ secrets.DOCKER_USER }}/one-app:${{ steps.set_tag_version.outputs.tagversion}} + docker cp prod:opt/one-app/build ./one-app-statics + zip -r one-app-static-assets one-app-statics/build + - name: Publish statics to NPM + run: npm publish ./one-app-statics --access public + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.event.client_payload.docker_tag_version }} + release_name: Release ${{ github.event.client_payload.docker_tag_version }} + draft: false + prerelease: false + - name: Upload Release Assets + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./one-app-static-assets.zip + asset_name: one-app-static-assets.zip + asset_content_type: application/zip diff --git a/.github/workflows/tagging.yml b/.github/workflows/tagging.yml index 59d2dbdba..bac96a4dc 100644 --- a/.github/workflows/tagging.yml +++ b/.github/workflows/tagging.yml @@ -32,12 +32,12 @@ jobs: echo ::set-output name=action_tag::v${tagversion} - name: Trigger Image Publishing uses: octokit/request-action@v2.x - id: dispatch_one-app-docker-release + id: dispatch_one-app-docker-tag-check with: route: POST /repos/:repository/dispatches repository: ${{ github.repository }} mediaType: '{"previews": ["everest"]}' - event_type: "one-app-docker-release" + event_type: "one-app-docker-tag-check" client_payload: '{"tagversion": "${{ steps.set_tag_version.outputs.action_tag }}"}' env: GITHUB_TOKEN: ${{ secrets.PA_TOKEN }}