diff --git a/tuts/096-aws-codecommit-gs/README.md b/tuts/096-aws-codecommit-gs/README.md new file mode 100644 index 0000000..baed789 --- /dev/null +++ b/tuts/096-aws-codecommit-gs/README.md @@ -0,0 +1,52 @@ +# CodeCommit: Create a repository and manage code + +Create a CodeCommit repository, add files, branch, compare changes, and retrieve metadata using the AWS CLI. + +## Source + +https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started-cc.html + +## Use case + +- ID: codecommit/getting-started +- Phase: create +- Complexity: beginner +- Core actions: codecommit:CreateRepository, codecommit:PutFile, codecommit:CreateBranch + +## What it does + +1. Creates a CodeCommit repository +2. Adds a file using fileb:// +3. Retrieves the file metadata +4. Creates a feature branch +5. Adds a file to the feature branch +6. Compares branches with get-differences +7. Gets repository metadata + +## Running + +```bash +bash aws-codecommit-gs.sh +``` + +## Resources created + +- CodeCommit repository + +No persistent resources remain after cleanup. The script prompts you to delete the repository when it finishes. + +## Estimated time + +- Run: ~11 seconds + +## Cost + +CodeCommit is free for up to 5 active users per month (unlimited repositories). No charges for this tutorial under the free tier. + +## Related docs + +- [Getting started with CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started-cc.html) +- [put-file CLI reference](https://docs.aws.amazon.com/cli/latest/reference/codecommit/put-file.html) +- [Working with branches](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-branch.html) +- [CodeCommit quotas](https://docs.aws.amazon.com/codecommit/latest/userguide/limits.html) +- [CodeCommit pricing](https://aws.amazon.com/codecommit/pricing/) diff --git a/tuts/096-aws-codecommit-gs/REVISION-HISTORY.md b/tuts/096-aws-codecommit-gs/REVISION-HISTORY.md new file mode 100644 index 0000000..787c074 --- /dev/null +++ b/tuts/096-aws-codecommit-gs/REVISION-HISTORY.md @@ -0,0 +1,8 @@ +# Revision History: 096-aws-codecommit-gs + +## Shell (CLI script) + +### 2026-04-14 v1 published +- Type: functional +- Initial version + diff --git a/tuts/096-aws-codecommit-gs/aws-codecommit-gs.md b/tuts/096-aws-codecommit-gs/aws-codecommit-gs.md new file mode 100644 index 0000000..eb48118 --- /dev/null +++ b/tuts/096-aws-codecommit-gs/aws-codecommit-gs.md @@ -0,0 +1,108 @@ +# Create a CodeCommit repository and manage code + +This tutorial shows you how to create a CodeCommit repository, add files, create a branch, compare changes between branches, and retrieve repository metadata using the AWS CLI. + +## Prerequisites + +- AWS CLI configured with credentials and a default region +- Permissions for `codecommit:CreateRepository`, `codecommit:PutFile`, `codecommit:GetFile`, `codecommit:CreateBranch`, `codecommit:ListBranches`, `codecommit:GetDifferences`, `codecommit:GetRepository`, `codecommit:DeleteRepository` + +## Step 1: Create a repository + +```bash +aws codecommit create-repository --repository-name "$REPO_NAME" \ + --repository-description "Tutorial repository" \ + --query 'repositoryMetadata.{Name:repositoryName,Id:repositoryId}' --output table +``` + +CodeCommit returns the repository metadata including the name and unique ID. + +## Step 2: Add a file + +Write a file locally and upload it with `put-file`. Use `fileb://` to pass the file content as raw bytes: + +```bash +echo -e "# Tutorial Repository\n\nThis is a sample file." > "$WORK_DIR/README.md" +COMMIT_ID=$(aws codecommit put-file \ + --repository-name "$REPO_NAME" \ + --branch-name main \ + --file-content "fileb://$WORK_DIR/README.md" \ + --file-path README.md \ + --commit-message "Initial commit" \ + --name "Tutorial User" \ + --email "tutorial@example.com" \ + --query 'commitId' --output text) +``` + +The `fileb://` prefix tells the CLI to read the file as raw binary. This creates the `main` branch with the first commit. + +## Step 3: Get the file + +Retrieve file metadata from the repository: + +```bash +aws codecommit get-file --repository-name "$REPO_NAME" \ + --file-path README.md \ + --query '{Path:filePath,Size:fileSize,CommitId:commitId}' --output table +``` + +## Step 4: Create a branch + +Create a branch from the current commit and list all branches: + +```bash +aws codecommit create-branch --repository-name "$REPO_NAME" \ + --branch-name feature-branch --commit-id "$COMMIT_ID" +aws codecommit list-branches --repository-name "$REPO_NAME" \ + --query 'branches' --output table +``` + +## Step 5: Add a file to the branch + +Add a new file to the feature branch. Pass `--parent-commit-id` to build on the branch tip: + +```bash +echo "console.log('Hello from CodeCommit');" > "$WORK_DIR/index.js" +aws codecommit put-file \ + --repository-name "$REPO_NAME" \ + --branch-name feature-branch \ + --file-content "fileb://$WORK_DIR/index.js" \ + --file-path src/index.js \ + --commit-message "Add source file" \ + --parent-commit-id "$COMMIT_ID" \ + --query 'commitId' --output text +``` + +## Step 6: Compare branches + +Use `get-differences` to see what changed between `main` and `feature-branch`: + +```bash +aws codecommit get-differences \ + --repository-name "$REPO_NAME" \ + --before-commit-specifier main \ + --after-commit-specifier feature-branch \ + --query 'differences[].{Path:afterBlob.path,Type:changeType}' --output table +``` + +## Step 7: Get repository metadata + +```bash +aws codecommit get-repository --repository-name "$REPO_NAME" \ + --query 'repositoryMetadata.{Name:repositoryName,DefaultBranch:defaultBranch,Created:creationDate}' \ + --output table +``` + +## Cleanup + +Delete the repository. This removes all branches, files, and commit history: + +```bash +aws codecommit delete-repository --repository-name "$REPO_NAME" +``` + +The script automates all steps including cleanup: + +```bash +bash aws-codecommit-gs.sh +``` diff --git a/tuts/096-aws-codecommit-gs/aws-codecommit-gs.sh b/tuts/096-aws-codecommit-gs/aws-codecommit-gs.sh new file mode 100644 index 0000000..4be7dc8 --- /dev/null +++ b/tuts/096-aws-codecommit-gs/aws-codecommit-gs.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# Tutorial: Create a CodeCommit repository and manage code +# Source: https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started-cc.html + +WORK_DIR=$(mktemp -d) +LOG_FILE="$WORK_DIR/codecommit-$(date +%Y%m%d-%H%M%S).log" +exec > >(tee -a "$LOG_FILE") 2>&1 + +REGION=${AWS_DEFAULT_REGION:-${AWS_REGION:-$(aws configure get region 2>/dev/null)}} +if [ -z "$REGION" ]; then + echo "ERROR: No AWS region configured. Set one with: export AWS_DEFAULT_REGION=us-east-1" + exit 1 +fi +export AWS_DEFAULT_REGION="$REGION" +echo "Region: $REGION" + +RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1) +REPO_NAME="tutorial-repo-${RANDOM_ID}" + +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; } +trap 'handle_error $LINENO' ERR + +cleanup() { + echo "" + echo "Cleaning up resources..." + aws codecommit delete-repository --repository-name "$REPO_NAME" > /dev/null 2>&1 && \ + echo " Deleted repository $REPO_NAME" + rm -rf "$WORK_DIR" + echo "Cleanup complete." +} + +# Step 1: Create a repository +echo "Step 1: Creating repository: $REPO_NAME" +aws codecommit create-repository --repository-name "$REPO_NAME" \ + --repository-description "Tutorial repository" \ + --query 'repositoryMetadata.{Name:repositoryName,Id:repositoryId}' --output table + +# Step 2: Add a file +echo "Step 2: Adding a file to the repository" +echo -e "# Tutorial Repository\n\nThis is a sample file created by the CodeCommit tutorial." > "$WORK_DIR/README.md" +COMMIT_ID=$(aws codecommit put-file \ + --repository-name "$REPO_NAME" \ + --branch-name main \ + --file-content "fileb://$WORK_DIR/README.md" \ + --file-path README.md \ + --commit-message "Initial commit" \ + --name "Tutorial User" \ + --email "tutorial@example.com" \ + --query 'commitId' --output text) +echo " Commit: $COMMIT_ID" + +# Step 3: Get the file +echo "Step 3: Retrieving the file" +aws codecommit get-file --repository-name "$REPO_NAME" \ + --file-path README.md \ + --query '{Path:filePath,Size:fileSize,CommitId:commitId}' --output table + +# Step 4: Create a branch +echo "Step 4: Creating a branch" +aws codecommit create-branch --repository-name "$REPO_NAME" \ + --branch-name feature-branch --commit-id "$COMMIT_ID" +aws codecommit list-branches --repository-name "$REPO_NAME" \ + --query 'branches' --output table + +# Step 5: Add a file to the branch +echo "Step 5: Adding a file to the feature branch" +echo "console.log('Hello from CodeCommit');" > "$WORK_DIR/index.js" +aws codecommit put-file \ + --repository-name "$REPO_NAME" \ + --branch-name feature-branch \ + --file-content "fileb://$WORK_DIR/index.js" \ + --file-path src/index.js \ + --commit-message "Add source file" \ + --parent-commit-id "$COMMIT_ID" \ + --query 'commitId' --output text > /dev/null +echo " File added to feature-branch" + +# Step 6: Get differences between branches +echo "Step 6: Comparing branches" +aws codecommit get-differences \ + --repository-name "$REPO_NAME" \ + --before-commit-specifier main \ + --after-commit-specifier feature-branch \ + --query 'differences[].{Path:afterBlob.path,Type:changeType}' --output table + +# Step 7: Get repository metadata +echo "Step 7: Repository metadata" +aws codecommit get-repository --repository-name "$REPO_NAME" \ + --query 'repositoryMetadata.{Name:repositoryName,DefaultBranch:defaultBranch,Created:creationDate}' --output table + +echo "" +echo "Tutorial complete." +echo "Do you want to clean up all resources? (y/n): " +read -r CHOICE +if [[ "$CHOICE" =~ ^[Yy]$ ]]; then + cleanup +else + echo "Manual cleanup:" + echo " aws codecommit delete-repository --repository-name $REPO_NAME" +fi diff --git a/tuts/098-aws-codebuild-gs/README.md b/tuts/098-aws-codebuild-gs/README.md new file mode 100644 index 0000000..683aad7 --- /dev/null +++ b/tuts/098-aws-codebuild-gs/README.md @@ -0,0 +1,53 @@ +# CodeBuild: Create a project and run a build + +Create an S3-sourced CodeBuild project, run a build, and verify artifacts using the AWS CLI. + +## Source + +https://docs.aws.amazon.com/codebuild/latest/userguide/getting-started-cli.html + +## Use case + +- ID: codebuild/getting-started +- Phase: create +- Complexity: intermediate +- Core actions: codebuild:CreateProject, codebuild:StartBuild + +## What it does + +1. Creates an S3 bucket for source and artifacts +2. Creates source files (buildspec.yml + index.html) and uploads as zip +3. Creates an IAM service role for CodeBuild +4. Creates a build project with S3 source +5. Starts a build +6. Waits for completion and checks artifacts + +## Running + +```bash +bash aws-codebuild-gs.sh +``` + +## Resources created + +- S3 bucket (source and artifacts) +- CodeBuild project +- IAM role (with S3 and CloudWatch Logs policies) +- CloudWatch log group (created automatically by CodeBuild) + +No persistent resources remain after cleanup. The script prompts you to delete all resources when it finishes. + +## Estimated time + +- Run: ~37 seconds (includes build execution) + +## Cost + +CodeBuild free tier includes 100 build minutes per month on general1.small. No charges expected for this tutorial under the free tier. + +## Related docs + +- [Getting started with CodeBuild (CLI)](https://docs.aws.amazon.com/codebuild/latest/userguide/getting-started-cli.html) +- [Build specification reference](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html) +- [Build environment reference](https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref.html) +- [CodeBuild pricing](https://aws.amazon.com/codebuild/pricing/) diff --git a/tuts/098-aws-codebuild-gs/REVISION-HISTORY.md b/tuts/098-aws-codebuild-gs/REVISION-HISTORY.md new file mode 100644 index 0000000..2099860 --- /dev/null +++ b/tuts/098-aws-codebuild-gs/REVISION-HISTORY.md @@ -0,0 +1,8 @@ +# Revision History: 098-aws-codebuild-gs + +## Shell (CLI script) + +### 2026-04-14 v1 published +- Type: functional +- Initial version + diff --git a/tuts/098-aws-codebuild-gs/aws-codebuild-gs.md b/tuts/098-aws-codebuild-gs/aws-codebuild-gs.md new file mode 100644 index 0000000..7dbc0a2 --- /dev/null +++ b/tuts/098-aws-codebuild-gs/aws-codebuild-gs.md @@ -0,0 +1,131 @@ +# Create a build project and run a build with AWS CodeBuild + +This tutorial shows you how to create an S3 bucket for source and artifacts, create source files, configure an IAM role, create a CodeBuild project, run a build, and verify the output. + +## Prerequisites + +- AWS CLI configured with credentials and a default region +- Permissions for `codebuild:CreateProject`, `codebuild:StartBuild`, `codebuild:BatchGetBuilds`, `codebuild:DeleteProject`, `s3:CreateBucket`, `s3:PutObject`, `s3:GetObject`, `iam:CreateRole`, `iam:AttachRolePolicy`, `iam:PutRolePolicy`, `iam:DeleteRole` + +## Step 1: Create an S3 bucket + +Create a bucket to hold the build source and output artifacts: + +```bash +BUCKET_NAME="codebuild-tut-${RANDOM_ID}-${ACCOUNT_ID}" +aws s3api create-bucket --bucket "$BUCKET_NAME" \ + --create-bucket-configuration LocationConstraint="$REGION" +``` + +For `us-east-1`, omit the `--create-bucket-configuration` parameter. + +## Step 2: Create source files and upload + +Create a `buildspec.yml` that defines the build commands and an `index.html` as sample content. Package them into a zip and upload to S3: + +```bash +cat > buildspec.yml << 'EOF' +version: 0.2 +phases: + build: + commands: + - echo "Build started on $(date)" + - echo "Hello from CodeBuild" + - echo "Build completed" +artifacts: + files: + - '**/*' +EOF + +cat > index.html << 'EOF' +

Built by CodeBuild

+EOF + +zip source.zip buildspec.yml index.html +aws s3 cp source.zip "s3://$BUCKET_NAME/source.zip" +``` + +The `buildspec.yml` tells CodeBuild what commands to run and which files to include in the output artifacts. + +## Step 3: Create an IAM role for CodeBuild + +Create a service role that allows CodeBuild to access S3 and write logs: + +```bash +ROLE_ARN=$(aws iam create-role --role-name "$ROLE_NAME" \ + --assume-role-policy-document '{ + "Version":"2012-10-17", + "Statement":[{"Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"},"Action":"sts:AssumeRole"}] + }' --query 'Role.Arn' --output text) + +aws iam attach-role-policy --role-name "$ROLE_NAME" \ + --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess + +aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name codebuild-logs \ + --policy-document '{ + "Version":"2012-10-17", + "Statement":[{"Effect":"Allow","Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource":"*"}] + }' +``` + +Wait about 10 seconds for the role to propagate before using it. + +## Step 4: Create a build project + +Create a project that reads source from S3 and writes artifacts back to S3: + +```bash +aws codebuild create-project \ + --name "$PROJECT_NAME" \ + --source "type=S3,location=$BUCKET_NAME/source.zip" \ + --artifacts "type=S3,location=$BUCKET_NAME,path=output" \ + --environment "type=LINUX_CONTAINER,computeType=BUILD_GENERAL1_SMALL,image=aws/codebuild/amazonlinux-x86_64-standard:5.0" \ + --service-role "$ROLE_ARN" \ + --query 'project.{Name:name,Created:created}' --output table +``` + +The environment uses a managed Amazon Linux image with standard build tools. + +## Step 5: Start a build + +```bash +BUILD_ID=$(aws codebuild start-build --project-name "$PROJECT_NAME" \ + --query 'build.id' --output text) +echo "Build ID: $BUILD_ID" +``` + +## Step 6: Wait for build completion and check artifacts + +Poll the build status until it completes: + +```bash +STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" \ + --query 'builds[0].buildStatus' --output text) +``` + +When the status is `SUCCEEDED`, list the output artifacts: + +```bash +aws s3 ls "s3://$BUCKET_NAME/output/" --recursive +``` + +## Cleanup + +Delete the build project, empty and remove the S3 bucket, detach policies and delete the IAM role, and delete the CloudWatch log group: + +```bash +aws codebuild delete-project --name "$PROJECT_NAME" +aws s3 rm "s3://$BUCKET_NAME" --recursive +aws s3 rb "s3://$BUCKET_NAME" +aws iam detach-role-policy --role-name "$ROLE_NAME" \ + --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess +aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name codebuild-logs +aws iam delete-role --role-name "$ROLE_NAME" +aws logs delete-log-group --log-group-name "/aws/codebuild/$PROJECT_NAME" +``` + +The script automates all steps including cleanup: + +```bash +bash aws-codebuild-gs.sh +``` diff --git a/tuts/098-aws-codebuild-gs/aws-codebuild-gs.sh b/tuts/098-aws-codebuild-gs/aws-codebuild-gs.sh new file mode 100644 index 0000000..ef90c08 --- /dev/null +++ b/tuts/098-aws-codebuild-gs/aws-codebuild-gs.sh @@ -0,0 +1,138 @@ +#!/bin/bash +# Tutorial: Create a build project and run a build with AWS CodeBuild +# Source: https://docs.aws.amazon.com/codebuild/latest/userguide/getting-started-cli.html + +WORK_DIR=$(mktemp -d) +LOG_FILE="$WORK_DIR/codebuild-$(date +%Y%m%d-%H%M%S).log" +exec > >(tee -a "$LOG_FILE") 2>&1 + +REGION=${AWS_DEFAULT_REGION:-${AWS_REGION:-$(aws configure get region 2>/dev/null)}} +if [ -z "$REGION" ]; then + echo "ERROR: No AWS region configured. Set one with: export AWS_DEFAULT_REGION=us-east-1" + exit 1 +fi +export AWS_DEFAULT_REGION="$REGION" +ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text) +echo "Region: $REGION" + +RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1) +BUCKET_NAME="codebuild-tut-${RANDOM_ID}-${ACCOUNT_ID}" +PROJECT_NAME="tut-build-${RANDOM_ID}" +ROLE_NAME="codebuild-tut-role-${RANDOM_ID}" + +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; } +trap 'handle_error $LINENO' ERR + +cleanup() { + echo "" + echo "Cleaning up resources..." + aws codebuild delete-project --name "$PROJECT_NAME" 2>/dev/null && echo " Deleted project $PROJECT_NAME" + if aws s3 ls "s3://$BUCKET_NAME" > /dev/null 2>&1; then + aws s3 rm "s3://$BUCKET_NAME" --recursive --quiet 2>/dev/null + aws s3 rb "s3://$BUCKET_NAME" 2>/dev/null && echo " Deleted bucket $BUCKET_NAME" + fi + aws iam detach-role-policy --role-name "$ROLE_NAME" \ + --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess 2>/dev/null + aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name codebuild-logs 2>/dev/null + aws iam delete-role --role-name "$ROLE_NAME" 2>/dev/null && echo " Deleted role $ROLE_NAME" + aws logs delete-log-group --log-group-name "/aws/codebuild/$PROJECT_NAME" 2>/dev/null && echo " Deleted log group" + rm -rf "$WORK_DIR" + echo "Cleanup complete." +} + +# Step 1: Create S3 bucket for build artifacts +echo "Step 1: Creating S3 bucket: $BUCKET_NAME" +if [ "$REGION" = "us-east-1" ]; then + aws s3api create-bucket --bucket "$BUCKET_NAME" > /dev/null +else + aws s3api create-bucket --bucket "$BUCKET_NAME" \ + --create-bucket-configuration LocationConstraint="$REGION" > /dev/null +fi + +# Step 2: Create source files and upload +echo "Step 2: Creating source files" +mkdir -p "$WORK_DIR/src" +cat > "$WORK_DIR/src/buildspec.yml" << 'EOF' +version: 0.2 +phases: + build: + commands: + - echo "Build started on $(date)" + - echo "Hello from CodeBuild" + - echo "Build completed" +artifacts: + files: + - '**/*' +EOF +cat > "$WORK_DIR/src/index.html" << 'EOF' +

Built by CodeBuild

+EOF +(cd "$WORK_DIR/src" && zip -r "$WORK_DIR/source.zip" . > /dev/null) +aws s3 cp "$WORK_DIR/source.zip" "s3://$BUCKET_NAME/source.zip" --quiet +echo " Source uploaded to s3://$BUCKET_NAME/source.zip" + +# Step 3: Create IAM role for CodeBuild +echo "Step 3: Creating IAM role: $ROLE_NAME" +ROLE_ARN=$(aws iam create-role --role-name "$ROLE_NAME" \ + --assume-role-policy-document '{ + "Version":"2012-10-17", + "Statement":[{"Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"},"Action":"sts:AssumeRole"}] + }' --query 'Role.Arn' --output text) +aws iam attach-role-policy --role-name "$ROLE_NAME" \ + --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess +aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name codebuild-logs \ + --policy-document '{ + "Version":"2012-10-17", + "Statement":[{"Effect":"Allow","Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource":"*"}] + }' +echo " Role ARN: $ROLE_ARN" +sleep 10 + +# Step 4: Create build project +echo "Step 4: Creating build project: $PROJECT_NAME" +aws codebuild create-project \ + --name "$PROJECT_NAME" \ + --source "type=S3,location=$BUCKET_NAME/source.zip" \ + --artifacts "type=S3,location=$BUCKET_NAME,path=output" \ + --environment "type=LINUX_CONTAINER,computeType=BUILD_GENERAL1_SMALL,image=aws/codebuild/amazonlinux-x86_64-standard:5.0" \ + --service-role "$ROLE_ARN" \ + --query 'project.{Name:name,Created:created}' --output table + +# Step 5: Start a build +echo "Step 5: Starting build" +BUILD_ID=$(aws codebuild start-build --project-name "$PROJECT_NAME" \ + --query 'build.id' --output text) +echo " Build ID: $BUILD_ID" + +# Step 6: Wait for build to complete +echo "Step 6: Waiting for build to complete..." +for i in $(seq 1 30); do + STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID" \ + --query 'builds[0].buildStatus' --output text) + echo " Status: $STATUS" + [ "$STATUS" = "SUCCEEDED" ] || [ "$STATUS" = "FAILED" ] || [ "$STATUS" = "STOPPED" ] && break + sleep 10 +done + +if [ "$STATUS" = "SUCCEEDED" ]; then + echo " Build succeeded!" + echo " Artifacts: s3://$BUCKET_NAME/output/" + aws s3 ls "s3://$BUCKET_NAME/output/" --recursive 2>/dev/null | head -5 +else + echo " Build did not succeed: $STATUS" +fi + +echo "" +echo "Tutorial complete." +echo "Do you want to clean up all resources? (y/n): " +read -r CHOICE +if [[ "$CHOICE" =~ ^[Yy]$ ]]; then + cleanup +else + echo "Manual cleanup:" + echo " aws codebuild delete-project --name $PROJECT_NAME" + echo " aws s3 rm s3://$BUCKET_NAME --recursive && aws s3 rb s3://$BUCKET_NAME" + echo " aws iam detach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess" + echo " aws iam delete-role-policy --role-name $ROLE_NAME --policy-name codebuild-logs" + echo " aws iam delete-role --role-name $ROLE_NAME" +fi diff --git a/tuts/125-aws-codeartifact-gs/README.md b/tuts/125-aws-codeartifact-gs/README.md new file mode 100644 index 0000000..e4f294d --- /dev/null +++ b/tuts/125-aws-codeartifact-gs/README.md @@ -0,0 +1,39 @@ +# Aws Codeartifact Gs + +An AWS CLI tutorial that demonstrates Codeartifact operations. + +## Running + +```bash +bash aws-codeartifact-gs.sh +``` + +To auto-run with cleanup: + +```bash +echo 'y' | bash aws-codeartifact-gs.sh +``` + +## What it does + +1. Creating domain: $DOMAIN +2. Creating repository: $REPO +3. Getting authorization token +4. Getting repository endpoint +5. Listing repositories + +## Resources created + +- Domain +- Repository + +The script prompts you to clean up resources when it finishes. + +## Cost + +Free tier eligible for most operations. Clean up resources after use to avoid charges. + +## Related docs + +- [AWS CLI codeartifact reference](https://docs.aws.amazon.com/cli/latest/reference/codeartifact/index.html) + diff --git a/tuts/125-aws-codeartifact-gs/REVISION-HISTORY.md b/tuts/125-aws-codeartifact-gs/REVISION-HISTORY.md new file mode 100644 index 0000000..f43cbc8 --- /dev/null +++ b/tuts/125-aws-codeartifact-gs/REVISION-HISTORY.md @@ -0,0 +1,8 @@ +# Revision History: 125-aws-codeartifact-gs + +## Shell (CLI script) + +### 2026-04-14 v1 published +- Type: functional +- Initial version + diff --git a/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.md b/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.md new file mode 100644 index 0000000..8f67df6 --- /dev/null +++ b/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.md @@ -0,0 +1,31 @@ +# Aws Codeartifact Gs + +## Prerequisites + +1. AWS CLI installed and configured (`aws configure`) +2. Appropriate IAM permissions for the AWS services used + +## Step 1: Creating domain: $DOMAIN + +The script handles this step automatically. See `aws-codeartifact-gs.sh` for the exact CLI commands. + +## Step 2: Creating repository: $REPO + +The script handles this step automatically. See `aws-codeartifact-gs.sh` for the exact CLI commands. + +## Step 3: Getting authorization token + +The script handles this step automatically. See `aws-codeartifact-gs.sh` for the exact CLI commands. + +## Step 4: Getting repository endpoint + +The script handles this step automatically. See `aws-codeartifact-gs.sh` for the exact CLI commands. + +## Step 5: Listing repositories + +The script handles this step automatically. See `aws-codeartifact-gs.sh` for the exact CLI commands. + +## Cleanup + +The script prompts you to clean up all created resources. If you need to clean up manually, check the script log for the resource names that were created. + diff --git a/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.sh b/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.sh new file mode 100644 index 0000000..5278d0c --- /dev/null +++ b/tuts/125-aws-codeartifact-gs/aws-codeartifact-gs.sh @@ -0,0 +1,30 @@ +#!/bin/bash +WORK_DIR=$(mktemp -d) +exec > >(tee -a "$WORK_DIR/codeartifact-$(date +%Y%m%d-%H%M%S).log") 2>&1 +REGION=${AWS_DEFAULT_REGION:-${AWS_REGION:-$(aws configure get region 2>/dev/null))} +[ -z "$REGION" ] && echo "ERROR: No region" && exit 1 +export AWS_DEFAULT_REGION="$REGION" +ACCOUNT=$(aws sts get-caller-identity --query 'Account' --output text) +echo "Region: $REGION" +RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1) +DOMAIN="tut-domain-${RANDOM_ID}" +REPO="tut-repo-${RANDOM_ID}" +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; } +trap 'handle_error $LINENO' ERR +cleanup() { echo ""; echo "Cleaning up..."; aws codeartifact delete-repository --domain "$DOMAIN" --repository "$REPO" > /dev/null 2>&1 && echo " Deleted repo"; aws codeartifact delete-domain --domain "$DOMAIN" > /dev/null 2>&1 && echo " Deleted domain"; rm -rf "$WORK_DIR"; echo "Done."; } +echo "Step 1: Creating domain: $DOMAIN" +aws codeartifact create-domain --domain "$DOMAIN" --query 'domain.{Name:name,Status:status}' --output table +echo "Step 2: Creating repository: $REPO" +aws codeartifact create-repository --domain "$DOMAIN" --repository "$REPO" --query 'repository.{Name:name,DomainName:domainName}' --output table +echo "Step 3: Getting authorization token" +TOKEN=$(aws codeartifact get-authorization-token --domain "$DOMAIN" --query 'authorizationToken' --output text) +echo " Token: ${TOKEN:0:20}..." +echo "Step 4: Getting repository endpoint" +aws codeartifact get-repository-endpoint --domain "$DOMAIN" --repository "$REPO" --format npm --query 'repositoryEndpoint' --output text +echo "Step 5: Listing repositories" +aws codeartifact list-repositories --query 'repositories[?starts_with(name, `tut-`)].{Name:name,Domain:domainName}' --output table +echo "" +echo "Tutorial complete." +echo "Do you want to clean up? (y/n): " +read -r CHOICE +[[ "$CHOICE" =~ ^[Yy]$ ]] && cleanup || echo "Manual: aws codeartifact delete-repository --domain $DOMAIN --repository $REPO && aws codeartifact delete-domain --domain $DOMAIN" diff --git a/tuts/135-aws-codedeploy-gs/README.md b/tuts/135-aws-codedeploy-gs/README.md new file mode 100644 index 0000000..e524f20 --- /dev/null +++ b/tuts/135-aws-codedeploy-gs/README.md @@ -0,0 +1,36 @@ +# Aws Codedeploy Gs + +An AWS CLI tutorial that demonstrates Deploy operations. + +## Running + +```bash +bash aws-codedeploy-gs.sh +``` + +To auto-run with cleanup: + +```bash +echo 'y' | bash aws-codedeploy-gs.sh +``` + +## What it does + +1. Creating application: $APP_NAME +2. Listing applications +3. Getting application details + +## Resources created + +- Application + +The script prompts you to clean up resources when it finishes. + +## Cost + +Free tier eligible for most operations. Clean up resources after use to avoid charges. + +## Related docs + +- [AWS CLI deploy reference](https://docs.aws.amazon.com/cli/latest/reference/deploy/index.html) + diff --git a/tuts/135-aws-codedeploy-gs/REVISION-HISTORY.md b/tuts/135-aws-codedeploy-gs/REVISION-HISTORY.md new file mode 100644 index 0000000..581bdf6 --- /dev/null +++ b/tuts/135-aws-codedeploy-gs/REVISION-HISTORY.md @@ -0,0 +1,8 @@ +# Revision History: 135-aws-codedeploy-gs + +## Shell (CLI script) + +### 2026-04-14 v1 published +- Type: functional +- Initial version + diff --git a/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.md b/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.md new file mode 100644 index 0000000..a1eb2eb --- /dev/null +++ b/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.md @@ -0,0 +1,23 @@ +# Aws Codedeploy Gs + +## Prerequisites + +1. AWS CLI installed and configured (`aws configure`) +2. Appropriate IAM permissions for the AWS services used + +## Step 1: Creating application: $APP_NAME + +The script handles this step automatically. See `aws-codedeploy-gs.sh` for the exact CLI commands. + +## Step 2: Listing applications + +The script handles this step automatically. See `aws-codedeploy-gs.sh` for the exact CLI commands. + +## Step 3: Getting application details + +The script handles this step automatically. See `aws-codedeploy-gs.sh` for the exact CLI commands. + +## Cleanup + +The script prompts you to clean up all created resources. If you need to clean up manually, check the script log for the resource names that were created. + diff --git a/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.sh b/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.sh new file mode 100644 index 0000000..80f6f77 --- /dev/null +++ b/tuts/135-aws-codedeploy-gs/aws-codedeploy-gs.sh @@ -0,0 +1,14 @@ +#!/bin/bash +WORK_DIR=$(mktemp -d); exec > >(tee -a "$WORK_DIR/codedeploy.log") 2>&1 +REGION=${AWS_DEFAULT_REGION:-${AWS_REGION:-$(aws configure get region 2>/dev/null))}; [ -z "$REGION" ] && echo "ERROR: No region" && exit 1; export AWS_DEFAULT_REGION="$REGION"; echo "Region: $REGION" +RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1); APP_NAME="tut-app-${RANDOM_ID}" +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; }; trap 'handle_error $LINENO' ERR +cleanup() { echo ""; echo "Cleaning up..."; aws deploy delete-application --application-name "$APP_NAME" 2>/dev/null && echo " Deleted app"; rm -rf "$WORK_DIR"; echo "Done."; } +echo "Step 1: Creating application: $APP_NAME" +aws deploy create-application --application-name "$APP_NAME" --compute-platform Server --query 'applicationId' --output text +echo "Step 2: Listing applications" +aws deploy list-applications --query 'applications[?starts_with(@, `tut-`)]' --output table +echo "Step 3: Getting application details" +aws deploy get-application --application-name "$APP_NAME" --query 'application.{Name:applicationName,Id:applicationId,Created:createTime}' --output table +echo ""; echo "Tutorial complete." +echo "Do you want to clean up? (y/n): "; read -r CHOICE; [[ "$CHOICE" =~ ^[Yy]$ ]] && cleanup diff --git a/tuts/136-aws-codepipeline-gs/README.md b/tuts/136-aws-codepipeline-gs/README.md new file mode 100644 index 0000000..7b5f144 --- /dev/null +++ b/tuts/136-aws-codepipeline-gs/README.md @@ -0,0 +1,43 @@ +# Aws Codepipeline Gs + +An AWS CLI tutorial that demonstrates Codepipeline operations. + +## Running + +```bash +bash aws-codepipeline-gs.sh +``` + +To auto-run with cleanup: + +```bash +echo 'y' | bash aws-codepipeline-gs.sh +``` + +## What it does + +1. Creating S3 bucket for artifacts +2. Creating IAM role +3. Creating pipeline: $PIPE_NAME +4. Getting pipeline state +5. Listing pipelines + +## Resources created + +- Bucket +- Pipeline +- Role +- Role Policy + +The script prompts you to clean up resources when it finishes. + +## Cost + +Free tier eligible for most operations. Clean up resources after use to avoid charges. + +## Related docs + +- [AWS CLI codepipeline reference](https://docs.aws.amazon.com/cli/latest/reference/codepipeline/index.html) +- [AWS CLI iam reference](https://docs.aws.amazon.com/cli/latest/reference/iam/index.html) +- [AWS CLI s3 reference](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) + diff --git a/tuts/136-aws-codepipeline-gs/REVISION-HISTORY.md b/tuts/136-aws-codepipeline-gs/REVISION-HISTORY.md new file mode 100644 index 0000000..aa36223 --- /dev/null +++ b/tuts/136-aws-codepipeline-gs/REVISION-HISTORY.md @@ -0,0 +1,8 @@ +# Revision History: 136-aws-codepipeline-gs + +## Shell (CLI script) + +### 2026-04-14 v1 published +- Type: functional +- Initial version + diff --git a/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.md b/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.md new file mode 100644 index 0000000..ee28bf3 --- /dev/null +++ b/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.md @@ -0,0 +1,31 @@ +# Aws Codepipeline Gs + +## Prerequisites + +1. AWS CLI installed and configured (`aws configure`) +2. Appropriate IAM permissions for the AWS services used + +## Step 1: Creating S3 bucket for artifacts + +The script handles this step automatically. See `aws-codepipeline-gs.sh` for the exact CLI commands. + +## Step 2: Creating IAM role + +The script handles this step automatically. See `aws-codepipeline-gs.sh` for the exact CLI commands. + +## Step 3: Creating pipeline: $PIPE_NAME + +The script handles this step automatically. See `aws-codepipeline-gs.sh` for the exact CLI commands. + +## Step 4: Getting pipeline state + +The script handles this step automatically. See `aws-codepipeline-gs.sh` for the exact CLI commands. + +## Step 5: Listing pipelines + +The script handles this step automatically. See `aws-codepipeline-gs.sh` for the exact CLI commands. + +## Cleanup + +The script prompts you to clean up all created resources. If you need to clean up manually, check the script log for the resource names that were created. + diff --git a/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.sh b/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.sh new file mode 100644 index 0000000..bc06b00 --- /dev/null +++ b/tuts/136-aws-codepipeline-gs/aws-codepipeline-gs.sh @@ -0,0 +1,22 @@ +#!/bin/bash +WORK_DIR=$(mktemp -d); exec > >(tee -a "$WORK_DIR/codepipeline.log") 2>&1 +REGION=${AWS_DEFAULT_REGION:-${AWS_REGION:-$(aws configure get region 2>/dev/null))}; [ -z "$REGION" ] && echo "ERROR: No region" && exit 1; export AWS_DEFAULT_REGION="$REGION"; ACCOUNT=$(aws sts get-caller-identity --query 'Account' --output text); echo "Region: $REGION" +RANDOM_ID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1); PIPE_NAME="tut-pipe-${RANDOM_ID}"; BUCKET="codepipeline-tut-${RANDOM_ID}-${ACCOUNT}"; ROLE_NAME="codepipeline-tut-role-${RANDOM_ID}" +handle_error() { echo "ERROR on line $1"; trap - ERR; cleanup; exit 1; }; trap 'handle_error $LINENO' ERR +cleanup() { echo ""; echo "Cleaning up..."; aws codepipeline delete-pipeline --name "$PIPE_NAME" 2>/dev/null && echo " Deleted pipeline"; aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name pipe-policy 2>/dev/null; aws iam delete-role --role-name "$ROLE_NAME" 2>/dev/null && echo " Deleted role"; if aws s3 ls "s3://$BUCKET" > /dev/null 2>&1; then aws s3 rm "s3://$BUCKET" --recursive --quiet; aws s3 rb "s3://$BUCKET" && echo " Deleted bucket"; fi; rm -rf "$WORK_DIR"; echo "Done."; } +echo "Step 1: Creating S3 bucket for artifacts" +if [ "$REGION" = "us-east-1" ]; then aws s3api create-bucket --bucket "$BUCKET" > /dev/null; else aws s3api create-bucket --bucket "$BUCKET" --create-bucket-configuration LocationConstraint="$REGION" > /dev/null; fi +echo " Bucket: $BUCKET" +echo "Step 2: Creating IAM role" +ROLE_ARN=$(aws iam create-role --role-name "$ROLE_NAME" --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"codepipeline.amazonaws.com"},"Action":"sts:AssumeRole"}]}' --query 'Role.Arn' --output text) +aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name pipe-policy --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:*","codebuild:*","codecommit:*"],"Resource":"*"}]}' +echo " Role: $ROLE_ARN"; sleep 10 +echo "Step 3: Creating pipeline: $PIPE_NAME" +aws codepipeline create-pipeline --pipeline "{\"name\":\"$PIPE_NAME\",\"roleArn\":\"$ROLE_ARN\",\"artifactStore\":{\"type\":\"S3\",\"location\":\"$BUCKET\"},\"stages\":[{\"name\":\"Source\",\"actions\":[{\"name\":\"S3Source\",\"actionTypeId\":{\"category\":\"Source\",\"owner\":\"AWS\",\"provider\":\"S3\",\"version\":\"1\"},\"configuration\":{\"S3Bucket\":\"$BUCKET\",\"S3ObjectKey\":\"source.zip\",\"PollForSourceChanges\":\"false\"},\"outputArtifacts\":[{\"name\":\"SourceOutput\"}]}]},{\"name\":\"Deploy\",\"actions\":[{\"name\":\"S3Deploy\",\"actionTypeId\":{\"category\":\"Deploy\",\"owner\":\"AWS\",\"provider\":\"S3\",\"version\":\"1\"},\"configuration\":{\"BucketName\":\"$BUCKET\",\"Extract\":\"true\"},\"inputArtifacts\":[{\"name\":\"SourceOutput\"}]}]}]}" --query 'pipeline.name' --output text > /dev/null +echo " Pipeline created" +echo "Step 4: Getting pipeline state" +aws codepipeline get-pipeline-state --name "$PIPE_NAME" --query 'stageStates[].{Stage:stageName,Status:latestExecution.status}' --output table 2>/dev/null || echo " No executions yet" +echo "Step 5: Listing pipelines" +aws codepipeline list-pipelines --query 'pipelines[?starts_with(name, `tut-`)].{Name:name,Created:created}' --output table +echo ""; echo "Tutorial complete." +echo "Do you want to clean up? (y/n): "; read -r CHOICE; [[ "$CHOICE" =~ ^[Yy]$ ]] && cleanup