diff --git a/.github/actions/create-ami-from-image/action.yml b/.github/actions/create-ami-from-image/action.yml new file mode 100644 index 000000000..26999b4e0 --- /dev/null +++ b/.github/actions/create-ami-from-image/action.yml @@ -0,0 +1,39 @@ +name: Create AMI from firmware image in S3 bucket + +inputs: + firmware_image_name: + description: Name of the firmware image + required: true + firmware_image_s3_bucket: + description: Name of the S3 bucket where the image resides + required: true + +runs: + using: "composite" + steps: + - name: Import snapshot based on firmware image + id: import_snapshot + shell: bash + run: | + echo ::set-output name=import_task_id::$(aws ec2 import-snapshot --description '${{ inputs.firmware_image_name }}' --disk-container 'Format=raw,UserBucket={S3Bucket=${{ inputs.firmware_image_s3_bucket }},S3Key=${{ inputs.firmware_image_name }}}' | jq -r '.ImportTaskId') + + - name: Wait for import task to complete and get snapshot ID + id: get_snapshot_id + shell: bash + run: | + IMPORT_TASK_STATUS="" + while [[ $IMPORT_TASK_STATUS != 'completed' ]]; do + IMPORT_TASK_STATUS=$(aws ec2 describe-import-snapshot-tasks --import-task-ids ${{ steps.import_snapshot.outputs.import_task_id }} | jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.Status') + echo "Import task status is $IMPORT_TASK_STATUS, waiting for completion." + done + echo ::set-output name=id::$(aws ec2 describe-import-snapshot-tasks --import-task-ids ${{ steps.import_snapshot.outputs.import_task_id }} | jq -r '.ImportSnapshotTasks[].SnapshotTaskDetail.SnapshotId') + + - name: Tag snapshot with image name + shell: bash + run: | + aws ec2 create-tags --resources ${{ steps.get_snapshot_id.outputs.id }} --tags 'Key=Name,Value=${{ inputs.firmware_image_name }}' + + - name: Register AMI based on snapshot + shell: bash + run: | + aws ec2 register-image --name '${{ inputs.firmware_image_name }}' --root-device-name /dev/xvda --block-device-mappings 'DeviceName=/dev/xvda,Ebs={SnapshotId=${{ steps.get_snapshot_id.outputs.id }}}' diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 30b0dac93..ae6913085 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -1,5 +1,13 @@ name: Build OpenWrt/uCentral images +env: + AWS_DEFAULT_OUTPUT: json + AWS_DEFAULT_REGION: us-east-1 + AWS_S3_BUCKET_NAME: ucentral-ap-firmware + AWS_ACCOUNT_ID: ${{ secrets.UCENTRAL_S3_ACCOUNT_ID }} + AWS_ACCESS_KEY_ID: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_SECRET }} + on: push: branches: [ main, next, staging-* ] @@ -8,10 +16,12 @@ on: jobs: build: runs-on: ubuntu-latest + outputs: + x64_vm_image_name: ${{ steps.package_and_upload_image.outputs.x64_vm_image_name }} strategy: fail-fast: false matrix: - target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c', 'cig_wf194c4', 'cig_wf196', 'cig_wf610d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'tp-link_ec420-g1', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4' ] + target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c', 'cig_wf194c4', 'cig_wf196', 'cig_wf610d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'tp-link_ec420-g1', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4', 'x64_vm' ] steps: - uses: actions/checkout@v2 @@ -24,17 +34,12 @@ jobs: make -j TARGET=${{ matrix.target }} - name: Package and upload image for ${{ matrix.target }} + id: package_and_upload_image env: GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} ARTIFACTORY_USERNAME: cicd-indoor-main ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }} - AWS_S3_BUCKET_NAME: ucentral-ap-firmware - AWS_DEFAULT_OUTPUT: json - AWS_DEFAULT_REGION: us-east-1 - AWS_ACCOUNT_ID: ${{ secrets.UCENTRAL_S3_ACCOUNT_ID }} - AWS_ACCESS_KEY_ID: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_SECRET }} run: | LOWERCASE_TARGET=`echo ${{ matrix.target }} | tr '[:upper:]' '[:lower:]'` HASH=$(git rev-parse --short HEAD) @@ -66,6 +71,10 @@ jobs: [ -f openwrt/tmp/image-file ] && aws s3 cp --acl public-read --content-type "application/json" "latest-upgrade.json" "s3://$AWS_S3_BUCKET_NAME/$JSON_NAME" [ -f openwrt/tmp/image-file ] && aws s3api put-object-tagging --bucket "$AWS_S3_BUCKET_NAME" --key "$JSON_NAME" --tagging "{\"TagSet\":[{\"Key\":\"release\",\"Value\":\"$IS_RELEASE\"}]}" + if [ ${{ matrix.target }} == 'x64_vm' ]; then + echo ::set-output name=x64_vm_image_name::"$(echo $IMG_NAME)" + fi + trigger-testing: runs-on: ubuntu-latest needs: build @@ -78,3 +87,16 @@ jobs: repository: Telecominfraproject/wlan-testing event-type: new-ap-release client-payload: '{"ref": "${GITHUB_REF#refs/tags/}", "sha": "${{ github.sha }}"}' + + create-x64_vm-ami: + runs-on: ubuntu-latest + needs: build + if: startsWith(github.ref, 'refs/tags/v') + steps: + - uses: actions/checkout@v2 + + - name: Use create-ami-from-image composite action + uses: ./.github/actions/create-ami-from-image + with: + firmware_image_name: ${{ needs.build.outputs.x64_vm_image_name }} + firmware_image_s3_bucket: ${{ env.AWS_S3_BUCKET_NAME }} diff --git a/.github/workflows/x64_vm-build-test.yml b/.github/workflows/x64_vm-build-test.yml index 7eefce591..8a5d20e49 100644 --- a/.github/workflows/x64_vm-build-test.yml +++ b/.github/workflows/x64_vm-build-test.yml @@ -1,10 +1,88 @@ name: Test x64_vm build and AMI creation +env: + AWS_DEFAULT_OUTPUT: json + AWS_DEFAULT_REGION: us-east-1 + AWS_S3_BUCKET_NAME: ucentral-ap-firmware + AWS_ACCOUNT_ID: ${{ secrets.UCENTRAL_S3_ACCOUNT_ID }} + AWS_ACCESS_KEY_ID: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.UCENTRAL_S3_ACCESS_KEY_SECRET }} + on: workflow_dispatch: jobs: build: runs-on: ubuntu-latest + outputs: + x64_vm_image_name: ${{ steps.package_and_upload_image.outputs.x64_vm_image_name }} + strategy: + fail-fast: false + matrix: + target: ['x64_vm'] + steps: - - run: echo 'Test x64_vm build and AMI creation' + - uses: actions/checkout@v2 + + - name: Build image for ${{ matrix.target }} + id: build + run: | + git config --global user.email "you@example.com" + git config --global user.name "Your Name" + make -j TARGET=${{ matrix.target }} + + - name: Package and upload image for ${{ matrix.target }} + id: package_and_upload_image + env: + GH_BUILD_USERNAME: ${{ secrets.GH_BUILD_USERNAME }} + GH_BUILD_PASSWORD: ${{ secrets.GH_BUILD_PASSWORD }} + ARTIFACTORY_USERNAME: cicd-indoor-main + ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }} + run: | + LOWERCASE_TARGET=`echo ${{ matrix.target }} | tr '[:upper:]' '[:lower:]'` + HASH=$(git rev-parse --short HEAD) + + if [[ ${GITHUB_REF} == "refs/heads/"* ]] + then + REF=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-') + IS_RELEASE="false" + else + REF=$(echo ${GITHUB_REF#refs/tags/} | tr '/' '-') + IS_RELEASE="true" + fi + + BASENAME="$(date +%Y%m%d)-$LOWERCASE_TARGET-$REF-$HASH" + TAR_NAME="$BASENAME.tar.gz" + IMG_NAME="$BASENAME-upgrade.bin"; + JSON_NAME="$BASENAME.json"; + + tar cfz "$TAR_NAME" -C openwrt/bin/targets/ . + curl -s -u $GH_BUILD_USERNAME:$GH_BUILD_PASSWORD -T "$TAR_NAME" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/uCentral/$LOWERCASE_TARGET/"$TAR_NAME"" + IMG_NAME="$BASENAME-upgrade.bin"; + TIP_VERSION="$(grep DISTRIB_TIP= openwrt/tmp/openwrt_release | cut -d\' -f2)" + echo -e "{\n\t\"image\":\""${IMG_NAME}"\",\n\t\"revision\": \""${TIP_VERSION}"\",\n\t\"timestamp\":\""$(date +%s)"\",\n\t\"compatible\": \""${LOWERCASE_TARGET}"\"\n}" > latest-upgrade.json + [ -f openwrt/tmp/image-file ] && curl -s -u $GH_BUILD_USERNAME:$GH_BUILD_PASSWORD -T "openwrt/$(cat openwrt/tmp/image-file)" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/uCentral/$LOWERCASE_TARGET/"$IMG_NAME"" + [ -f openwrt/tmp/image-file ] && curl -s -u $GH_BUILD_USERNAME:$GH_BUILD_PASSWORD -T "latest-upgrade.json" "https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/uCentral/$LOWERCASE_TARGET/latest-upgrade.json" + + [ -f openwrt/tmp/image-file ] && aws s3 cp --acl public-read --content-type "application/octet-stream" "openwrt/$(cat openwrt/tmp/image-file)" "s3://$AWS_S3_BUCKET_NAME/$IMG_NAME" + [ -f openwrt/tmp/image-file ] && aws s3api put-object-tagging --bucket "$AWS_S3_BUCKET_NAME" --key "$IMG_NAME" --tagging "{\"TagSet\":[{\"Key\":\"release\",\"Value\":\"$IS_RELEASE\"}]}" + [ -f openwrt/tmp/image-file ] && aws s3 cp --acl public-read --content-type "application/json" "latest-upgrade.json" "s3://$AWS_S3_BUCKET_NAME/$JSON_NAME" + [ -f openwrt/tmp/image-file ] && aws s3api put-object-tagging --bucket "$AWS_S3_BUCKET_NAME" --key "$JSON_NAME" --tagging "{\"TagSet\":[{\"Key\":\"release\",\"Value\":\"$IS_RELEASE\"}]}" + + if [[ ${{ matrix.target }} == 'x64_vm' ]]; then + echo ::set-output name=x64_vm_image_name::"$(echo $IMG_NAME)" + fi + + create-x64_vm-ami: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v2 + with: + ref: WIFI-7206-add-workflow-to-build-virtual-ap-image + + - name: Use create-ami-from-image composite action + uses: ./.github/actions/create-ami-from-image + with: + firmware_image_name: ${{ needs.build.outputs.x64_vm_image_name }} + firmware_image_s3_bucket: ${{ env.AWS_S3_BUCKET_NAME }}