কম্পিউটার

প্লে স্টোরে কীভাবে স্বয়ংক্রিয়ভাবে একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল আপলোড করবেন

এই নিবন্ধে, আমি প্লে স্টোরের বিটা ট্র্যাকে কীভাবে স্বয়ংক্রিয়ভাবে একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল (.aab ফাইল) আপলোড করতে হয় তা ব্যাখ্যা করতে যাচ্ছি। আমরা ক্লাউড অবকাঠামো প্রদানকারী হিসাবে অ্যান্ড্রয়েড স্টুডিও এবং AWS ব্যবহার করব।

একবার আমরা অ্যাপ বান্ডেল আপলোড করলে, আমরা একটি স্ল্যাক বিজ্ঞপ্তি ট্রিগার করব।

পর্যবেক্ষণযোগ্যতা তৈরি করা এবং প্রক্রিয়াগুলিকে অগ্রাধিকার দেওয়ার মতো বিভিন্ন কারণে এটি আপনার সময়ের একটি মূল্যবান ব্যবহার৷

টেক আমরা ব্যবহার করব

এই টিউটোরিয়ালের জন্য আমরা যে সংস্থানগুলি ব্যবহার করতে যাচ্ছি তা এখানে:

  1. অ্যান্ড্রয়েড স্টুডিও
  2. AWS CodeBuild
  3. AWS Lambda
  4. S3
  5. স্ল্যাক

প্রকল্পের উচ্চ স্তরের ওভারভিউ

প্লে স্টোরে কীভাবে স্বয়ংক্রিয়ভাবে একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল আপলোড করবেন

উপরের চিত্রটি আপনাকে একটি সাধারণ ওভারভিউ দেখায় কিভাবে আমরা পুরো জিনিসটি গঠন করব।

মূলত, আপনার Android সংগ্রহস্থলের জন্য AWS-এ একটি কোড পাইপলাইন সেট আপ করা দরকার। এই কোড পাইপলাইনে কোড বিল্ড থাকবে তার একটি ধাপ হিসেবে।

আপনার অ্যান্ড্রয়েড অ্যাপ সংগ্রহস্থলের মাস্টার শাখায় ঠেলে কোড বিল্ড ট্রিগার করতে চলেছে। কোড বিল্ড প্রজেক্ট কমান্ড লাইন থেকে অ্যান্ড্রয়েড অ্যাপে স্বাক্ষর করবে এবং একটি S3 বালতিতে আর্টিফ্যাক্ট আপলোড করবে।

S3 এ বান্ডেল আপলোড করা একটি Lambda ট্রিগার করবে, যা বান্ডিলটি ডাউনলোড করবে এবং Google পাবলিশিং API ব্যবহার করে প্লে স্টোরে আপলোড করবে। একবার এটি একটি 200 প্রতিক্রিয়া পেয়ে গেলে, Lambda তারপর একটি স্ল্যাক বিজ্ঞপ্তি ট্রিগার করবে৷

আপনার Google Play পরিষেবা অ্যাকাউন্ট কী কীভাবে পাবেন

Google Play Publisher API ব্যবহার করতে সক্ষম হওয়ার জন্য, আপনার একটি Google Play পরিষেবা অ্যাকাউন্ট কী প্রয়োজন হবে৷

একটি পরিষেবা অ্যাকাউন্ট হল একটি অ্যাকাউন্ট যা সার্ভার একে অপরের সাথে যোগাযোগ করার সময় আপনার পক্ষে কাজ করতে পারে। সার্ভার থেকে সার্ভার যোগাযোগের জন্য Google কীভাবে OAuth2.0 ব্যবহার করে সে সম্পর্কে আপনি এখানে আরও পড়তে পারেন।

কীভাবে একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে হয় এবং এটিকে Google Play Publisher API-তে অ্যাক্সেস দিতে হয় তা দেখতে, এখানে দেখুন৷

একবার আপনি আপনার পরিষেবা অ্যাকাউন্ট তৈরি করে নিলে এবং এটিকে উপযুক্ত অনুমতি দিলে, পরিষেবা অ্যাকাউন্ট কীটি ডাউনলোড করতে এবং এটিকে সুরক্ষিত রাখতে ভুলবেন না। আপনি শীঘ্রই এটি একটি S3 বালতিতে আপলোড করবেন৷

অ্যান্ড্রয়েড বান্ডলে কিভাবে সাইন ইন করবেন

অ্যান্ড্রয়েড অ্যাপ বান্ডেলে কীভাবে সাইন করবেন তা বের করতে হবে। Google এর উপর মোটামুটি শালীন ডকুমেন্টেশন রয়েছে যা আপনি এখানে খুঁজে পেতে পারেন।

আমি নীচের লিঙ্কগুলিকে সংক্ষিপ্ত করব৷

keytool ব্যবহার করে একটি ব্যক্তিগত কী তৈরি করুন এই মত:

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

আপনি যা চান আপনার কী কল করতে পারেন। এখানে, আমি এটিকে my-release-key.jks বলেছি . আপনি যা চান তাও বেছে নিতে পারেন। এই টিউটোরিয়াল জুড়ে আপনার কীটির জন্য সঠিক নাম এবং উপনাম ব্যবহার করা নিশ্চিত করুন।

build.gradle খুলুন আপনার app এর মধ্যে অ্যান্ড্রয়েড স্টুডিওতে ডিরেক্টরি এবং এটিতে নিম্নলিখিত কোড ব্লক যুক্ত করুন:

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            // You need to specify either an absolute path or include the
            // keystore file in the same directory as the build.gradle file.
            storeFile file("my-release-key.jks")
            storePassword "password"
            keyAlias "my-alias"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

আপনি যদি আপনার রিলিজ কীটির নাম ডিফল্ট ব্যতীত অন্য কিছুতে পরিবর্তন করেন তবে নতুন নামটি নির্দিষ্ট করতে ভুলবেন না। উপনামের জন্য একই জিনিস৷

আপনি যখন প্লে স্টোরে আপনার অ্যাপটি প্রথম আপলোড করেছিলেন তখন আপনার স্টোরের পাসওয়ার্ডটি হবে আপনার তৈরি করা পাসওয়ার্ড।

এখন, যখন আপনি ./gradlew :app:bundleRelease কমান্ডটি চালান অ্যান্ড্রয়েড স্টুডিওতে কমান্ড লাইন থেকে, আপনি লক্ষ্য করবেন যে এটি একটি স্বাক্ষরিত অ্যাপ বান্ডেল তৈরি করে।

কিভাবে স্বাক্ষর করার তথ্য স্ক্রাব করবেন

build.gradle এ প্লেইন টেক্সট হিসাবে উপলব্ধ সাইনিং তথ্য সহ প্রতিশ্রুতিবদ্ধ কোড ফাইল একটি নিরাপত্তা ঝুঁকি এবং এটি একটি আক্রমণ ভেক্টর হতে পারে৷

Google এর আশেপাশে ডকুমেন্টেশন রয়েছে যা আপনি এখানে খুঁজে পেতে পারেন৷

প্রথমে একটি keystore.properties তৈরি করুন আপনার প্রোজেক্ট ডিরেক্টরির রুটে ফাইল।

ফাইলের বিষয়বস্তু নিম্নরূপ হওয়া উচিত:

storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

আপনার স্টোরের পাসওয়ার্ড এবং কী পাসওয়ার্ড হবে সেই পাসওয়ার্ড যা আপনি ব্যবহার করেছিলেন যখন আপনি অ্যাপ স্টোরে প্রথমবার আপনার অ্যাপ বান্ডিল আপলোড করেছিলেন।

আপনার keyAlias এবং storeFile আপনার ব্যক্তিগত কী তৈরি করার সময় আপনি যে উপনাম নির্ধারণ করেছেন এবং আপনার তৈরি করা ব্যক্তিগত কীটির অবস্থান যথাক্রমে হবে৷

এখন, আমাদের এই ফাইলটিকে build.gradle-এ লোড করতে হবে . এটি প্রাথমিকভাবে আমার কাছে অবাক হয়ে এসেছিল, কিন্তু গ্রেডল আসলে একটি ডিএসএল হিসাবে কাজ করে। সুতরাং, এটি Gradle ব্যবহার করে কনফিগারেশন লেখা সহজ করে তোলে।

//  Load properties from keystore.properties
def keystorePropertiesFile = rootProject.file("keystore.properties")

//  Creating a new Properties() object
def keystoreProperties = new Properties()

//  If keystorePropertiesFile exists, read from that, else set from build environment
if (keystorePropertiesFile.exists()) {
    //  Loading the keystoreProperties file
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
} else {
    //  Read all environment variables from the build environment
    keystoreProperties.setProperty("storeFile", "${System.getenv('STORE_FILE')}")
    keystoreProperties.setProperty("keyAlias", "${System.getenv('KEY_ALIAS')}")
    keystoreProperties.setProperty("keyPassword", "${System.getenv('KEY_PASSWORD')}")
    keystoreProperties.setProperty("storePassword", "${System.getenv('STORE_PASSWORD')}")
}

আপনি সেখানে যদি অবস্থা লক্ষ্য করবেন - আপাতত এটি সম্পর্কে চিন্তা করবেন না। পরে কোড বিল্ড করার জন্য এটি বিশেষভাবে আছে।

একবার আপনি এটি করলে, আপনার signingConfigs পরিবর্তন করুন build.gradle এ বিভাগ এই মত দেখতে:

signingConfigs {
        release {
            storeFile file(keystoreProperties['storeFile'])
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storePassword keystoreProperties['storePassword']
        }
    }

কিভাবে AWS কোড পাইপলাইন সেট আপ করবেন

তুলনামূলকভাবে সহজবোধ্য হওয়ায় আমি এই বিষয়ে খুব বেশি বিশদে যেতে যাচ্ছি না।

নিম্নলিখিত তিনটি ধাপ সহ একটি AWS কোড পাইপলাইন সেট আপ করুন:

  1. উৎস পর্যায় আপনার GitHub সংগ্রহস্থলের master সাথে সংযুক্ত শাখা
  2. AWS কোড বিল্ডের সাথে সংযুক্ত বিল্ড স্টেজ
  3. মঞ্চ স্থাপন করুন যা একটি S3 বালতিতে স্থাপন করবে।

আপনি এখানে একটি কোড পাইপলাইন সেট আপ সম্পর্কে আরও ডকুমেন্টেশন পেতে পারেন৷

কিভাবে AWS S3 সেট আপ করবেন

প্রথমে, নিশ্চিত করুন যে আপনার কাছে কোড বিল্ডের একটি ধাপ হিসেবে একটি কোড পাইপলাইন সেট আপ করা আছে। এরপরে, দুটি S3 বালতি সেট আপ করুন:

  1. আপনার রিলিজ কী সংরক্ষণ করার জন্য একটি বালতি। আমি এই বালতিটিকে release-key.jks ডাকছি
  2. একটি বালতি যেখানে আপনি আপনার Google Play পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী সংরক্ষণ করবেন৷ (আপনার পরিষেবা অ্যাকাউন্ট তৈরি করার সময় আপনার এই কীটি ডাউনলোড করা উচিত ছিল।)

আপনার কোড বিল্ড পরিষেবা ভূমিকা থেকে আপনাকে এই বালতিগুলিতে অ্যাক্সেসের অনুমতি দিতে হবে। আপনি যখন আপনার কোড পাইপলাইন সেট আপ করেন তখন আপনার কোড বিল্ড পরিষেবা ভূমিকা তৈরি করা উচিত ছিল৷

IAM কনসোলে যান এবং আপনার কোড বিল্ড পরিষেবার ভূমিকা খুঁজুন এবং ARN ধরুন।

এরপর, বালতি release-key.jks-এর জন্য অনুমতি ট্যাবে যেতে কনসোল ব্যবহার করুন এবং সেখানে নিম্নলিখিত নীতি যোগ করুন:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123456789:role/service-role/codebuild-service-role-dummy",
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::release-key-bucket/*"
        }
    ]
}

এই নীতিটি মেশিন থেকে S3 বালতিতে অ্যাক্সেসের অনুমতি দেবে যেখানে আপনার CodeBuild প্রকল্পটি কার্যকর হবে৷

আপনাকে আপনার অ্যাকাউন্টের জন্য উপরে উল্লিখিত ARNগুলিকে ARNগুলির সাথে প্রতিস্থাপন করতে হবে। আপনি নীতিটি আপডেট করার সময় কোড বিল্ড পরিষেবার ভূমিকার জন্য সঠিক ARN নির্দিষ্ট করতে ভুলবেন না৷

দ্বিতীয় বালতির জন্য আপনাকে অনুমতি নীতি পরিবর্তন করতে হবে না। আমরা AWS Lambda ভূমিকাতে প্রাসঙ্গিক অনুমতিগুলি যোগ করব যাতে এটিকে বালতি অ্যাক্সেস করার অনুমতি দেওয়া হয়।

কিভাবে AWS কোডবিল্ড সেট আপ করবেন

এরপরে, একটি buildspec.yml তৈরি করুন আপনার প্রোজেক্ট রুট ফোল্ডারে ফাইল।

version: 0.2

phases:
  build:
    commands:
      - aws s3api get-object --bucket release-key.jks --key release-key.jks ./releaseKey.jks
      - cp ./releaseKey.jks ${CODEBUILD_SRC_DIR}/app/releaseKey.jks
      - export STORE_FILE=releaseKey.jks
      - export KEY_ALIAS=$keyAlias
      - export KEY_PASSWORD=$keyPassword
      - export STORE_PASSWORD=$storePassword
      - ./gradlew :app:bundleRelease

artifacts:
  files:
    - app/build/outputs/bundle/release/app-release.aab

এই ফাইলটি বেশ সহজ। এটি নির্দিষ্ট করা বালতি থেকে রিলিজ কী নিয়ে আসে এবং কোড বিল্ড সার্ভারে নির্দিষ্ট স্থানে একটি স্থানীয় ফাইলে সংরক্ষণ করে।

এরপর, build.gradle-এর জন্য প্রয়োজনীয় সমস্ত ভেরিয়েবল রপ্তানি করুন সঠিকভাবে কাজ করার জন্য কনফিগারেশন। অবশেষে, কমান্ড লাইন থেকে গ্রেডলের রিলিজ কমান্ড চালান।

আপনি কোড বিল্ডে এই স্ক্রিপ্টটি চালানোর আগে, আপনাকে কোড বিল্ড পরিবেশে ভেরিয়েবল যোগ করতে হবে। এটি করার জন্য, প্রথমে AWS কোড বিল্ড কনসোলে যান এবং আপনার অ্যান্ড্রয়েড অ্যাপের জন্য আপনার বিল্ড প্রোজেক্ট বেছে নিন।

এরপরে, নীচের স্ক্রিনশটের মতো সম্পাদনা> পরিবেশ নির্বাচন করুন:

প্লে স্টোরে কীভাবে স্বয়ংক্রিয়ভাবে একটি অ্যান্ড্রয়েড অ্যাপ বান্ডেল আপলোড করবেন

আপনি এটি করার পরে যে স্ক্রিনে পপ আপ হবে, অতিরিক্ত কনফিগারেশন ড্রপডাউন নির্বাচন করুন। সেখানে আপনি কী মান জোড়ার মাধ্যমে পরিবেশের ভেরিয়েবল যোগ করার একটি বিকল্প দেখতে পাবেন।

এখন যখন কোড বিল্ড buildspec.yml চালায় ফাইল, এটি নির্দিষ্ট ভেরিয়েবল রপ্তানি করতে সক্ষম হবে।

যেহেতু জিনিসগুলি এই মুহূর্তে দাঁড়িয়ে আছে, যখন আপনার পাইপলাইন চলে, কোড বিল্ড সাইন ইন করতে এবং আপনার Android অ্যাপ তৈরি করতে এবং সাইন করা বান্ডিলটিকে একটি S3 বালতিতে আপলোড করতে ব্যক্তিগত কী ডাউনলোড করতে সক্ষম হবে৷

কিভাবে স্ল্যাক অ্যাপ সেট আপ করবেন

পর্যবেক্ষণযোগ্যতা অটোমেশনের একটি বৈশিষ্ট্য। আপনি জানতে চান আপনার অটোমেশন কখন চলে, এটি সফল বা ব্যর্থ হয় এবং যদি এটি ব্যর্থ হয় তবে ব্যর্থতার কারণ।

AWS সাধারণত ক্লাউডওয়াচের মাধ্যমে পর্যবেক্ষণযোগ্যতা পরিচালনা করে। কিন্তু আমি মনে করি একটি স্ল্যাক ইন্টিগ্রেশন ঠিক একইভাবে উদ্দেশ্য পূরণ করে।

আপনার অটোমেশন ওয়ার্কফ্লোতে স্ল্যাককে সংহত করার সবচেয়ে সহজ উপায় হল একটি স্ল্যাক অ্যাপ সেট আপ করা এবং আপনার অটোমেশন ওয়ার্কফ্লো থেকে সেই অ্যাপে একটি বিজ্ঞপ্তি পাঠানো।

একটি স্ল্যাক অ্যাপ কীভাবে সেট আপ করবেন তা শিখতে, এখানে ডকুমেন্টেশন দেখুন। প্রক্রিয়াটি অত্যন্ত সহজ এবং আপনার কয়েক মিনিটের মধ্যে একটি অ্যাপ চালু হওয়া উচিত।

একবার আপনি অ্যাপটি তৈরি করলে, আপনি একটি WebHook URL পাবেন যা আপনি প্রাসঙ্গিক চ্যানেলে পোস্ট করতে অ্যাপটিকে কল করতে ব্যবহার করতে পারেন। এই WebHook URL-এর উপর নজর রাখুন কারণ আমরা এটি AWS Lambda ফাংশনের সাথে ব্যবহার করব।

কিভাবে AWS Lambda সেট আপ করবেন

এখনও অবধি, আমাদের কাছে একটি Android অ্যাপ বান্ডেল স্বাক্ষরিত, নির্মিত এবং একটি S3 বালতিতে আপলোড করা হয়েছে৷ এরপরে, প্লে স্টোরের বিটা ট্র্যাকে বান্ডেলটি কীভাবে আপলোড করা যায় তা আমাদের বের করতে হবে।

এটি করার উপায় হল একটি AWS Lambda সেট আপ করা যা S3 বালতিতে বান্ডিল আপলোড করার সময় ট্রিগার হবে৷ এই ট্রিগারটি ঘটলে, Lambda চলবে, বান্ডিল ডাউনলোড করবে, পরিষেবা অ্যাকাউন্ট কী ধরবে এবং বান্ডেলটিকে Play Store বিটা ট্র্যাকে আপলোড করবে৷

একবার আপনি একটি Lambda তৈরি করে ফেললে এবং বালতিতে একটি ফাইল আপলোড করার সময় এটি চালানোর জন্য একটি ট্রিগার যোগ করলে, নীচের কোডটি দেখুন:

"""This Python3 script is used to upload a new .aab bundle to the play store. The execution of this Python script
    occurs through an AWS Lambda which is invoked when a new file is uploaded to the relevant S3 buckets"""

import json
import boto3
import os
from urllib import request, parse
from google.oauth2 import service_account
import googleapiclient.discovery

#   Defining the scope of the authorization request
SCOPES = ['https://www.googleapis.com/auth/androidpublisher']

#   Package name for app
package_name = 'com.app.name'

#   Define the slack webhook url
slack_webhook_url = os.environ['SLACK_WEBHOOK_URL']

def send_slack_message(message):
    data = json.dumps({ 'text': message })
    post_data = data.encode('utf-8')
    req = request.Request(slack_webhook_url, data=post_data, headers={ 'Content-Type': 'application/json' })
    request.urlopen(req)

#   This is the main handler function
def lambda_handler(event, context):
    #   Create a new client S3 client and download the correct file from the bucket
    s3 = boto3.client('s3')
    s3.download_file('service-account-bucket-key', 'service-account-bucket-key.json', '/tmp/service-account-key.json')
    SERVICE_ACCOUNT_FILE = '/tmp/service-account-key.json'

    #   Download the app-release.aab file that triggered the Lambda
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    file_key = event['Records'][0]['s3']['object']['key']
    s3.download_file(bucket_name, file_key, '/tmp/app-release.aab')
    APP_BUNDLE = '/tmp/app-release.aab'

    print(f"A bundle uploaded to {bucket_name} has triggered the Lambda")

    #   Create a credentials object and create a service object using the credentials object
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES
    )
    service = googleapiclient.discovery.build('androidpublisher', 'v3', credentials=credentials, cache_discovery=False)
    
    #   Create an edit request using the service object and get the editId
    edit_request = service.edits().insert(body={}, packageName=package_name)
    result = edit_request.execute()
    edit_id = result['id']

    #   Create a request to upload the app bundle
    try:
        bundle_response = service.edits().bundles().upload(
            editId=edit_id,
            packageName=package_name,
            media_body=APP_BUNDLE,
            media_mime_type="application/octet-stream"
        ).execute()
    except Exception as err:
        message = f"There was an error while uploading a new version of {package_name}"
        send_slack_message(message)
        raise err

    print(f"Version code {bundle_response['versionCode']} has been uploaded")

    #   Create a track request to upload the bundle to the beta track
    track_response = service.edits().tracks().update(
        editId=edit_id,
        track='beta',
        packageName=package_name,
        body={u'releases': [{
            u'versionCodes': [str(bundle_response['versionCode'])],
            u'status': u'completed',
        }]}
    ).execute()

    print("The bundle has been committed to the beta track")

    #   Create a commit request to commit the edit to BETA track
    commit_request = service.edits().commit(
        editId=edit_id,
        packageName=package_name
    ).execute()

    print(f"Edit {commit_request['id']} has been committed")

    message = f"Version code {bundle_response['versionCode']} has been uploaded from the bucket {bucket_name}.\nEdit {commit_request['id']} has been committed"
    send_slack_message(message)
    
    return {
        'statusCode': 200,
        'body': json.dumps('Successfully executed the app bundle release to beta')
    }

উপরের Lambda googleapiclient ব্যবহার করবে Google Play-এর পাবলিশিং API-এর জন্য URL তৈরি করতে লাইব্রেরি এবং এর আবিষ্কার মডিউল।

এর পরে, ল্যাম্বডা আপনার আগে সেট করা বালতি থেকে পরিষেবা অ্যাকাউন্ট কী ডাউনলোড করবে। আপনাকে নিশ্চিত করতে হবে আপনি সঠিক বালতির নাম উল্লেখ করেছেন।

আপলোড সফল বা ব্যর্থ হয় তার উপর নির্ভর করে, আমরা একটি স্ল্যাক বার্তা বের করতে চাই। Lambda-এর জন্য এনভায়রনমেন্ট ভেরিয়েবলে আগের বিভাগ থেকে Slack WebHook URL যোগ করুন। উপরের ফাংশনটি পাইথনের os ব্যবহার করে এনভায়রনমেন্ট ভেরিয়েবলে অ্যাক্সেস পেতে এবং স্ল্যাকে বার্তা পোস্ট করতে মডিউল।

যদি আপনার Lambda ব্যর্থ হয়, তাহলে এটি হতে পারে কারণ আপনার Lambda-এর কাছে S3 বাকেট অ্যাক্সেস করার অনুমতি নেই যেখানে আপনার Google Play পরিষেবা অ্যাকাউন্টের কী সংরক্ষণ করা আছে। সেই ক্ষেত্রে, আপনি এটি নির্দেশ করে একটি ত্রুটি বার্তা দেখতে পাবেন৷

এটি ঠিক করতে, আপনাকে কেবল আপনার ল্যাম্বডা ভূমিকাতে প্রাসঙ্গিক অনুমতি যোগ করতে হবে।

এখানে আপনাকে যোগ করতে হবে এমন নীতি:

{
    "Version": "2012-10-07",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersion",
                "s3:GetBucketVersioning",
                "s3:GetBucketAcl",
                "s3:GetObject",
                "s3:GetBucketTagging",
                "s3:GetBucketLocation",
                "s3:GetObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::arn:aws:s3:::your-bucket-name-with-service-account-key"
            ]
        }
    ]
}

আপনার অ্যাকাউন্টের জন্য প্রাসঙ্গিক একটি দিয়ে বালতির জন্য ARN প্রতিস্থাপন করুন এবং আপনার যেতে হবে।

উপসংহার

তাই সেখানে যদি আপনি এটি আছে. এটি অবশ্যই সহজ ছিল না এবং অনেকগুলি চলন্ত যন্ত্রাংশ রয়েছে, তবে এটি একটি অটোমেশন যা আপনার অনেক সময় এবং প্রচেষ্টা বাঁচাতে পারে৷

আপনি যদি এমন একটি দলের অংশ হন যেটি প্রায়শই নতুন অ্যাপ আপডেট প্রকাশ করে, আপনি এমন একজন ব্যক্তির অনুপস্থিতিতে বাধা পেতে চান না যার কাজ আপডেটটি প্রকাশ করা।

এই ধরণের অটোমেশন তৈরি করা আপনার CI/CD কর্মপ্রবাহকে অনেক মসৃণ এবং আরও শক্তিশালী করে তোলে।

আপনি যদি এই ধরনের ব্লগে আগ্রহী হন, আপনি https://redixhumayun.github.io-এ আরও পড়তে পারেন বা আমাকে Twitter-এ অনুসরণ করতে পারেন৷


  1. প্লে স্টোর ছাড়া অ্যান্ড্রয়েডে নতুন অ্যাপ সংস্করণের বিজ্ঞপ্তি কীভাবে পাবেন

  2. প্লে স্টোরে কীভাবে একটি অ্যাপ্লিকেশন প্রকাশ করবেন

  3. 2019 সালে একটি Android অ্যাপ কীভাবে বিকাশ করবেন:'নতুন' অ্যান্ড্রয়েডকে আলিঙ্গন করা

  4. Amazon App Store (হ্যান্ডস-অন ভিডিও) এর মাধ্যমে Windows 11 এ Android অ্যাপগুলি কীভাবে চালাবেন