Skip to content

Implement Token Pools #2191

Implement Token Pools

Implement Token Pools #2191

name: TON - Relayer - Publish Docker Image
on:
push:
branches:
- main
tags:
- "v*"
pull_request:
types: [labeled, opened, synchronize, reopened] # Trigger when a label is added
env:
CHAINLINK_PUBLIC_ECR_IMAGE: public.ecr.aws/chainlink/chainlink
jobs:
get-core-image:
name: Determine Chainlink Core Base Image
runs-on: ubuntu-24.04
permissions:
id-token: write
contents: read
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKER_CACHE_DIR: ${{ github.workspace }}/.cache
DOCKER_CACHE_KEY: ccip-chainlink-core-sha-cache-v1
DOCKER_CACHE_TAR_NAME: ccip-chainlink-core-sha-cache.tar
outputs:
base_image: ${{ steps.determine-base-image.outputs.BASE_IMAGE }}
base_image_tag: ${{ steps.determine-base-image.outputs.BASE_IMAGE_TAG }}
base_image_public: ${{ steps.determine-base-image.outputs.BASE_IMAGE_PUBLIC }}
base_image_already_exists: ${{ steps.check-if-image-is-available.outputs.EXISTS }}
core_ref: ${{ steps.read_core_ref.outputs.CORE_REF }}
core_ref_short: ${{ steps.determine_core_ref_short.outputs.CORE_REF_SHORT }}
steps:
- name: Setup GitHub token using GATI
id: set-token
uses: smartcontractkit/.github/actions/setup-github-token@setup-github-token/1.0.0
with:
aws-role-arn: ${{ secrets.AWS_ROLE_ARN_GATI_READONLY }}
aws-lambda-url: ${{ secrets.AWS_LAMBDA_URL_GATI }}
aws-region: ${{ vars.AWS_REGION }}
aws-role-duration-seconds: "1800"
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_PUBLISH_ARN_STAGING }}
role-duration-seconds: 3600
mask-aws-account-id: true
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@062b18b96a7aff071d4dc91bc00c4c1a7945b076 # v2.0.1
with:
mask-password: "true"
registries: "${{ secrets.AWS_ACCOUNT_ID_STAGING}}"
- name: Checkout chainlink-ton Repository
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Prepare Cache Dir For Docker Images
run: mkdir -p ${{ env.DOCKER_CACHE_DIR }}
- name: Read Chainlink Core Ref from .core_version File
id: read_core_ref
run: echo "CORE_REF=$(cat ./scripts/.core_version | tr -d '[:space:]')" >> $GITHUB_OUTPUT
- name: Detect if CORE_REF is a SHA
id: detect_core_ref_is_sha
run: |
REF="${{ steps.read_core_ref.outputs.CORE_REF }}"
if [[ "$REF" =~ ^[0-9a-fA-F]{7,40}$ ]]; then
echo "is_sha=true" >> $GITHUB_OUTPUT
else
echo "is_sha=false" >> $GITHUB_OUTPUT
fi
- name: Determine CORE_REF_SHORT
id: determine_core_ref_short
run: |
REF="${{ steps.read_core_ref.outputs.CORE_REF }}"
if [[ "${{ steps.detect_core_ref_is_sha.outputs.is_sha }}" == "true" ]]; then
echo "CORE_REF_SHORT=${REF:0:7}" >> $GITHUB_OUTPUT
else
echo "CORE_REF_SHORT=$REF" >> $GITHUB_OUTPUT
fi
- name: Determine Base Image Name
id: determine-base-image
run: |
if [[ "${{ steps.detect_core_ref_is_sha.outputs.is_sha }}" == "true" ]]; then
echo "BASE_IMAGE=${{ secrets.AWS_ACCOUNT_ID_STAGING}}.dkr.ecr.${{ vars.AWS_REGION }}.amazonaws.com/chainlink-plugins-dev:${{ steps.determine_core_ref_short.outputs.CORE_REF_SHORT }}-core-for-chainlink-ton" >> $GITHUB_OUTPUT
echo "BASE_IMAGE_TAG=${{ steps.determine_core_ref_short.outputs.CORE_REF_SHORT }}-core-for-chainlink-ton" >> $GITHUB_OUTPUT
echo "BASE_IMAGE_PUBLIC=false" >> $GITHUB_OUTPUT
else
echo "BASE_IMAGE=${{ env.CHAINLINK_PUBLIC_ECR_IMAGE }}:${{ steps.read_core_ref.outputs.CORE_REF }}" >> $GITHUB_OUTPUT
echo "BASE_IMAGE_TAG=${{ steps.read_core_ref.outputs.CORE_REF }}" >> $GITHUB_OUTPUT
echo "BASE_IMAGE_PUBLIC=true" >> $GITHUB_OUTPUT
fi
- name: Debug To Be Removed
id: debug
run: |
echo "BASE_IMAGE=${{ steps.determine-base-image.outputs.BASE_IMAGE }}"
docker images
- name: Restore Docker Image from Cache When Core Image Ref Is Not a SHA
if: steps.detect_core_ref_is_sha.outputs.is_sha == 'false'
id: restore-cache-images
uses: actions/cache@v4
with:
path: ${{ env.DOCKER_CACHE_DIR }}/${{ steps.read_core_ref.outputs.CORE_REF }}-${{ env.DOCKER_CACHE_TAR_NAME }}
key: ${{ env.DOCKER_CACHE_KEY }}-${{ steps.read_core_ref.outputs.CORE_REF }}
- name: Load Docker Images From Cache When Core Image Ref Is Not a SHA
if: steps.detect_core_ref_is_sha.outputs.is_sha == 'false' && steps.restore-cache-images.outputs.cache-hit == 'true'
run: |
echo "Cache hit for key '${{ env.DOCKER_CACHE_KEY }}-${{ steps.read_core_ref.outputs.CORE_REF }}'. Loading images with sha from tarball..."
docker load -i ${{ env.DOCKER_CACHE_DIR }}/${{ steps.read_core_ref.outputs.CORE_REF }}-${{ env.DOCKER_CACHE_TAR_NAME }}
- name: Pull & Save Image on Cache Miss When Core Ref Is Not a SHA
if: steps.detect_core_ref_is_sha.outputs.is_sha == 'false' && steps.restore-cache-images.outputs.cache-hit != 'true'
run: |
echo "Cache Miss: Pulling chainlink core image from ${{ steps.determine-base-image.outputs.BASE_IMAGE }}"
docker pull ${{ steps.determine-base-image.outputs.BASE_IMAGE }}
echo "Saving to tarball…"
docker save ${{ steps.determine-base-image.outputs.BASE_IMAGE }} \
-o ${{ env.DOCKER_CACHE_DIR }}/${{ steps.read_core_ref.outputs.CORE_REF }}-${{ env.DOCKER_CACHE_TAR_NAME }}
- name: Determine if There Is A Core Image Already Built for the provided SHA
id: check-if-image-is-available
run: |
echo "Checking if ${{ steps.determine-base-image.outputs.BASE_IMAGE }} Chainlink Core image exist or we need to built it"
if ${{ steps.detect_core_ref_is_sha.outputs.is_sha != 'true' }}; then
echo "CORE_REF is not a SHA and should have been pull in the previous step"
echo "EXISTS=true" >> $GITHUB_OUTPUT
else
if docker pull "${{ steps.determine-base-image.outputs.BASE_IMAGE }}"; then
echo "Chainlink Core image ${{ steps.determine-base-image.outputs.BASE_IMAGE }} exist in the ECR. We can use it in the build step"
echo "EXISTS=true" >> $GITHUB_OUTPUT
else
echo "Chainlink Core image ${{ steps.determine-base-image.outputs.BASE_IMAGE }} does not exist in the ECR. We need to built it."
echo "EXISTS=false" >> $GITHUB_OUTPUT
fi
fi
- name: Get Core Image Output
id: get-core-image-output
run: |
echo "BASE_IMAGE=${{ steps.determine-base-image.outputs.BASE_IMAGE }}"
echo "BASE_IMAGE_TAG=${{ steps.determine-base-image.outputs.BASE_IMAGE_TAG }}"
echo "BASE_IMAGE_PUBLIC=${{ steps.determine-base-image.outputs.BASE_IMAGE_PUBLIC }}"
echo "BASE_IMAGE_ALREADY_EXISTS=${{ steps.check-if-image-is-available.outputs.EXISTS }}"
echo "CORE_REF=${{ steps.read_core_ref.outputs.CORE_REF }}"
echo "CORE_REF_SHORT=${{ steps.determine_core_ref_short.outputs.CORE_REF_SHORT }}"
build-and-publish-core-with-docker:
needs: get-core-image
if: ${{ needs.get-core-image.outputs.base_image_already_exists != 'true' && (github.event_name != 'pull_request' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'build-publish-docker'))) }}
name: Build & Publish Chainlink Core Docker Image
permissions:
contents: read
id-token: write
uses: smartcontractkit/.github/.github/workflows/reusable-docker-build-publish.yml@b9f1725282972837f22590e820dea4ea891c779b
with:
aws-ecr-name: chainlink-plugins-dev
aws-region-ecr: ${{ vars.AWS_REGION }}
aws-region-gati: ${{ vars.AWS_REGION }}
dockerfile: plugins/chainlink.Dockerfile
docker-build-context: .
docker-build-args: |
CHAINLINK_USER=chainlink
COMMIT_SHA=${{ needs.get-core-image.outputs.core_ref }}
docker-manifest-sign: false
docker-image-tag-override: ${{ needs.get-core-image.outputs.base_image_tag }}
git-sha: ${{ needs.get-core-image.outputs.core_ref }}
github-event-name: ${{ github.event_name }}
github-ref-name: ${{ github.ref_name }}
github-ref-type: ${{ github.ref_type }}
github-workflow-repository: smartcontractkit/chainlink
secrets:
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID_STAGING }}
AWS_ROLE_PUBLISH_ARN: ${{ secrets.AWS_ROLE_PUBLISH_ARN_STAGING }}
AWS_ROLE_GATI_ARN: ${{ secrets.AWS_ROLE_ARN_GATI_READONLY }}
AWS_LAMBDA_GATI_URL: ${{ secrets.AWS_LAMBDA_URL_GATI }}
build-and-publish-core-with-relayer-docker:
needs: [get-core-image, build-and-publish-core-with-docker]
name: Build & Publish Chainlink Core Docker Image with Relayer
# Non-PR → run; PR → only if label present
if: ${{ always() && needs.get-core-image.result == 'success' && (needs.build-and-publish-core-with-docker.result == 'success' || needs.build-and-publish-core-with-docker.result == 'skipped') && (github.event_name != 'pull_request' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'build-publish-docker'))) }}
permissions:
contents: read
id-token: write
uses: smartcontractkit/.github/.github/workflows/reusable-docker-build-publish.yml@b9f1725282972837f22590e820dea4ea891c779b
with:
aws-ecr-name: chainlink-plugins-dev
aws-region-ecr: ${{ vars.AWS_REGION }}
aws-region-gati: ${{ vars.AWS_REGION }}
dockerfile: scripts/build/Dockerfile.build.nix
docker-build-context: .
docker-manifest-sign: true
docker-tag-custom-suffix: "-chainlink-ton"
git-sha: ${{ github.sha }}
github-event-name: ${{ github.event_name }}
github-ref-name: ${{ github.ref_name }}
github-ref-type: ${{ github.ref_type }}
github-workflow-repository: ${{ github.repository }}
secrets:
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID_STAGING }}
AWS_ROLE_PUBLISH_ARN: ${{ secrets.AWS_ROLE_PUBLISH_ARN_STAGING }}
AWS_ROLE_GATI_ARN: ${{ secrets.AWS_ROLE_ARN_GATI_READONLY }}
AWS_LAMBDA_GATI_URL: ${{ secrets.AWS_LAMBDA_URL_GATI }}
DOCKER_BUILD_ARGS: |
CHAINLINK_USER=chainlink
COMMIT_SHA=${{ github.sha }}
BASE_IMAGE=${{ needs.get-core-image.outputs.base_image_public == 'true' && needs.get-core-image.outputs.base_image || format('{0}.dkr.ecr.{1}.amazonaws.com/chainlink-plugins-dev:{2}', secrets.AWS_ACCOUNT_ID_STAGING, vars.AWS_REGION, needs.get-core-image.outputs.base_image_tag) }}