diff --git a/.github/workflows/image+upload.yaml b/.github/workflows/image+upload.yaml new file mode 100644 index 000000000..14d892f23 --- /dev/null +++ b/.github/workflows/image+upload.yaml @@ -0,0 +1,171 @@ +name: CLI Deploy to Amazon ECR + +on: + push: + branches: + - fix-CI/CD + tags: + - * + workflow_dispatch: + +env: + ecr_url: public.ecr.aws/bisonai/orakl-cli + + +jobs: + + prepare: + name: Prepare + runs-on: ubuntu-latest + + outputs: + tag_date: ${{ steps.hash.outputs.date }} + tag_git_hash: ${{ steps.hash.outputs.git_hash }} + service: ${{ steps.package.extract_tags.service }} + version: ${{ steps.package.extract_tags.version }} + ecr_url: ${{ steps.package.extract_tags.ecr_url }} + + steps: + - name: checkout code + uses: actions/checkout@v2 + + - name: set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: get date and git hash + id: hash + run: | + echo "date=$(date +'%Y%m%d.%H%M')" >> $GITHUB_OUTPUT + echo "git_hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: extract version and service from tag + id: extract_tags + run: | + tag_ref=${GITHUB_REF#refs/tags/} + echo "Tag: $tag_ref" + + # Extract service name and version from the tag (e.g., service_name:v1.2.3) + if [[ $tag_ref =~ ^([a-zA-Z0-9_]+):v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then + service="${BASH_REMATCH[1]}" + version="${BASH_REMATCH[2]}" + echo "Found service: $service" + echo "Found version: $version" + echo "service=$service" >> $GITHUB_OUTPUT + echo "version=$version" >> $GITHUB_OUTPUT + echo "ecr_url=public.ecr.aws/bisonai/orakl-$service" >> $GITHUB_OUTPUT + else + echo "Tag does not match the pattern." + exit 1 + fi + + build: + name: Build + runs-on: ubuntu-latest + needs: prepare + + permissions: + id-token: write + contents: read + + outputs: + img_tag: ${{ steps.img-tag.outputs.img_tag }} + + steps: + - uses: actions/checkout@v3 + + - name: docker build ${{ needs.prepare.outputs.service }} + run: SERVICE_NAME=${{ needs.prepare.outputs.service }} docker compose -f docker-compose.build.yaml build + + - name: configure aws credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-region: us-east-1 + role-to-assume: ${{ secrets.ROLE_ARN }} + + - name: login to amazon ecr + id: login-ecr-public + uses: aws-actions/amazon-ecr-login@v1 + with: + registry-type: public + + - name: publish image to ecr + run: | + docker tag ${{ needs.prepare.outputs.service }} ${{ needs.prepare.outputs.ecr_url }}:latest + docker push ${{ needs.prepare.outputs.ecr_url }}:latest + docker tag ${{ needs.prepare.outputs.ecr_url }}:latest ${{ needs.prepare.outputs.ecr_url }}:${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }} + docker push ${{ needs.prepare.outputs.ecr_url }}:${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }} + + - name: image tag output + id: img-tag + run: echo "img_tag=v${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }}" >> $GITHUB_OUTPUT + + post-slack-image-upload: + name: Slack message for image upload + needs: [prepare, build] + uses: ./.github/workflows/post.slack.yaml + with: + status: "Success" + slack-message: "*${{ needs.prepare.outputs.service }}* ${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }} is uploaded" + secrets: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + if: ${{ success() }} + + image-update: + name: Update image tag + needs: [prepare, build] + uses: ./.github/workflows/update.image-tag.yaml + with: + network: "baobab" + project-name: ${{ needs.prepare.outputs.service }} + version: ${{ needs.prepare.outputs.version }} + image-tag: ${{ needs.build.outputs.img_tag }} + tag_date: ${{ needs.prepare.outputs.tag_date }} + tag_git_hash: ${{ needs.prepare.outputs.tag_git_hash }} + secrets: + PAT: ${{ secrets.PAT }} + + update-package-json-version: + name: Update package.json version + needs: [prepare, build, image-update] + runs-on: ubuntu-latest + steps: + + - name: update package.json version + if: needs.prepare.outputs.version + run: | + version=${{ needs.prepare.outputs.version }} + echo "updating package.json to version $version" + npm version $version --no-git-tag-version + + - name: commit updated package.json + if: needs.prepare.outputs.version + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@github.com' + git add package.json + git commit -m "chore: update package.json version to ${{ needs.prepare.outputs.version }}" + git push origin HEAD:${{ github.ref_name }} + + post-slack-tag-update-success: + name: Post slack message for tag update success + needs: [prepare, build, image-update] + uses: ./.github/workflows/post.slack.yaml + if: ${{ success() }} + with: + status: "Success" + slack-message: "*${{ needs.prepare.outputs.service }}* new image tag ${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }} is updated" + secrets: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + + post-slack-tag-update-failure: + name: Post to a slack message for tag update failure + needs: [prepare, build, image-update] + if: ${{ failure() }} + uses: ./.github/workflows/post.slack.yaml + with: + status: "Failed" + slack-message: "Failed to update image tag for *${{ needs.prepare.outputs.service }}* ${{ needs.prepare.outputs.version }}.${{ needs.prepare.outputs.tag_date }}.${{ needs.prepare.outputs.tag_git_hash }}" + secrets: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}