build-and-publish-release.yml 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. name: Build and Publish Release
  2. on:
  3. push:
  4. tags:
  5. - 'v[0-9]+.[0-9]+.[0-9]+'
  6. workflow_dispatch:
  7. inputs:
  8. release_version:
  9. description: "Version of the release"
  10. required: true
  11. permissions: {}
  12. concurrency:
  13. group: build-opencost
  14. cancel-in-progress: true
  15. env:
  16. # Use docker.io for Docker Hub if empty
  17. REGISTRY: ghcr.io
  18. jobs:
  19. build-and-publish-opencost:
  20. runs-on: ubuntu-latest
  21. permissions:
  22. contents: read
  23. packages: write
  24. id-token: write
  25. steps:
  26. - name: Get Version From Tag
  27. id: tag
  28. if: ${{ github.event_name }} == 'push'
  29. run: |
  30. echo "TRIGGERED_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
  31. - name: Determine Version Number
  32. id: version_number
  33. env:
  34. RELEASE_VERSION: ${{ inputs.release_version }}
  35. run: |
  36. if [ -z "${TRIGGERED_TAG}" ];
  37. then
  38. version=$RELEASE_VERSION
  39. else
  40. version=$TRIGGERED_TAG
  41. fi
  42. if [[ ${version:0:1} == "v" ]];
  43. then
  44. echo "RELEASE_VERSION=${version:1}" >> $GITHUB_OUTPUT
  45. else
  46. echo "RELEASE_VERSION=$version" >> $GITHUB_OUTPUT
  47. fi
  48. - name: Show Input Values
  49. env:
  50. RELEASE_VERSION: ${{ inputs.release_version }}
  51. run: |
  52. echo "release version: $RELEASE_VERSION"
  53. - name: Make Branch Name
  54. id: branch
  55. env:
  56. RELEASE_VERSION: ${{ steps.version_number.outputs.RELEASE_VERSION }}
  57. run: |
  58. echo "BRANCH_NAME=v${RELEASE_VERSION%.*}" >> $GITHUB_OUTPUT
  59. - name: Checkout Repo
  60. uses: actions/checkout@v6.0.2
  61. with:
  62. ref: '${{ steps.branch.outputs.BRANCH_NAME }}'
  63. - name: Set SHA
  64. id: sha
  65. run: |
  66. echo "OC_SHORTHASH=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
  67. - name: Set OpenCost Image Tags
  68. id: tags
  69. env:
  70. REPO_OWNER: ${{ github.repository_owner }}
  71. RELEASE_VERSION: ${{ steps.version_number.outputs.RELEASE_VERSION }}
  72. OC_SHORTHASH: ${{ steps.sha.outputs.OC_SHORTHASH }}
  73. run: |
  74. echo "IMAGE_TAG=ghcr.io/$REPO_OWNER/opencost:$OC_SHORTHASH" >> $GITHUB_OUTPUT
  75. echo "IMAGE_TAG_LATEST=ghcr.io/$REPO_OWNER/opencost:latest" >> $GITHUB_OUTPUT
  76. echo "IMAGE_TAG_VERSION=ghcr.io/$REPO_OWNER/opencost:$RELEASE_VERSION" >> $GITHUB_OUTPUT
  77. - name: Build and publish container
  78. uses: ./.github/actions/build-container
  79. with:
  80. actor: ${{ github.actor }}
  81. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  82. image_tag: ${{ steps.tags.outputs.IMAGE_TAG }}
  83. release_version: ${{ steps.version_number.outputs.RELEASE_VERSION }}
  84. - name: Log into registry ${{ env.REGISTRY }}
  85. uses: docker/login-action@v4
  86. with:
  87. registry: ${{ env.REGISTRY }}
  88. username: ${{ github.actor }}
  89. password: ${{ secrets.GITHUB_TOKEN }}
  90. - name: Install crane
  91. uses: imjasonh/setup-crane@v0.5
  92. - name: Copy tags
  93. env:
  94. IMAGE_TAG: ${{ steps.tags.outputs.IMAGE_TAG }}
  95. IMAGE_TAG_LATEST: ${{ steps.tags.outputs.IMAGE_TAG_LATEST }}
  96. IMAGE_TAG_VERSION: ${{ steps.tags.outputs.IMAGE_TAG_VERSION }}
  97. run: |
  98. crane copy "$IMAGE_TAG" "$IMAGE_TAG_LATEST"
  99. crane copy "$IMAGE_TAG" "$IMAGE_TAG_VERSION"
  100. - name: Sign image and attest SLSA provenance
  101. # Only sign tag-triggered releases; workflow_dispatch runs produce a
  102. # non-tag GITHUB_REF, so the Fulcio certificate identity would not
  103. # match the `refs/tags/vX.Y.Z` pattern documented in SECURITY.md.
  104. if: github.event_name == 'push'
  105. uses: ./.github/actions/sign-image
  106. with:
  107. image: ${{ steps.tags.outputs.IMAGE_TAG_VERSION }}
  108. workflow-path: .github/workflows/build-and-publish-release.yml
  109. run-started-at: ${{ github.run_started_at }}