name: Docker Build and Publish on: push: branches: - main - github-actions jobs: build-and-push: runs-on: ubuntu-latest outputs: EXISTS: ${{ steps.check-version.outputs.EXISTS }} VERSION: ${{ steps.package-version.outputs.VERSION }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "20" - name: Get version from package.json id: package-version run: echo "VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Check if version exists id: check-version run: | if docker pull dohsimpson/habittrove:v${{ steps.package-version.outputs.VERSION }} 2>/dev/null; then echo "EXISTS=true" >> $GITHUB_OUTPUT else echo "EXISTS=false" >> $GITHUB_OUTPUT fi - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and push Docker images uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: | ${{ steps.check-version.outputs.EXISTS == 'false' && format('dohsimpson/habittrove:v{0}', steps.package-version.outputs.VERSION) || '' }} ${{ steps.check-version.outputs.EXISTS == 'false' && 'dohsimpson/habittrove:latest' || '' }} dohsimpson/habittrove:dev deploy-demo: runs-on: ubuntu-latest needs: build-and-push # demo tracks the latest tag if: needs.build-and-push.outputs.EXISTS == 'false' steps: - uses: actions/checkout@v4 - uses: actions-hub/kubectl@master env: KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }} with: args: rollout restart -n ${{ secrets.KUBE_NAMESPACE }} deploy/${{ secrets.KUBE_DEPLOYMENT }} create-release: runs-on: ubuntu-latest needs: build-and-push if: needs.build-and-push.outputs.EXISTS == 'false' permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Create GitHub release env: GH_TOKEN: ${{ secrets.GH_TOKEN }} VERSION: ${{ needs.build-and-push.outputs.VERSION }} run: | # Extract release notes from CHANGELOG.md notes=$(awk -v version="$VERSION" ' $0 ~ "## Version " version {flag=1;next} $0 ~ "## Version " && flag {exit} flag' CHANGELOG.md) gh release create "v$VERSION" \ --repo="$GITHUB_REPOSITORY" \ --title="v$VERSION" \ --notes="$notes"